diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 1ce105b6..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 00000000..fe9a14ca --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,18 @@ +name: translate + +on: + workflow_dispatch: + push: + branches: + - beta + +jobs: + auto-translate: + runs-on: ubuntu-latest + steps: + - uses: jeedom/jeetranslate@main + with: + deepl_api_key: ${{ secrets.DEEPL_API_KEY }} + include_empty_translation: false + target_languages: "en_US,es_ES,de_DE,it_IT,pt_PT" + use_core_translations: true diff --git a/.gitignore b/.gitignore index c6650da1..35037478 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ plugins .project .DS_Store .vscode +.history +graphify-out diff --git a/3rdparty/animate/animate.css b/3rdparty/animate/animate.css deleted file mode 100755 index 1b33ecb3..00000000 --- a/3rdparty/animate/animate.css +++ /dev/null @@ -1,2956 +0,0 @@ -@charset "UTF-8"; - -/*! - * animate.css -http://daneden.me/animate - * Version - 3.6.0 - * Licensed under the MIT license - http://opensource.org/licenses/MIT - * - * Copyright (c) 2018 Daniel Eden - */ - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} -@-webkit-keyframes bounce { - 0%, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} -@keyframes bounce { - 0%, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} -.bounce { - -webkit-animation-name: bounce; - animation-name: bounce; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} -@-webkit-keyframes flash { - 0%, - 50%, - to { - opacity: 1; - } - 25%, - 75% { - opacity: 0; - } -} -@keyframes flash { - 0%, - 50%, - to { - opacity: 1; - } - 25%, - 75% { - opacity: 0; - } -} -.flash { - -webkit-animation-name: flash; - animation-name: flash; -} -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes pulse { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.pulse { - -webkit-animation-name: pulse; - animation-name: pulse; -} -@-webkit-keyframes rubberBand { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes rubberBand { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.rubberBand { - -webkit-animation-name: rubberBand; - animation-name: rubberBand; -} -@-webkit-keyframes shake { - 0%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -@keyframes shake { - 0%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} -@-webkit-keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -@keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -.headShake { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-name: headShake; - animation-name: headShake; -} -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 40% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 60% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - 80% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 40% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 60% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - 80% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -.swing { - -webkit-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} -@-webkit-keyframes tada { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - } - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - } - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes tada { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - } - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - } - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.tada { - -webkit-animation-name: tada; - animation-name: tada; -} -@-webkit-keyframes wobble { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg); - transform: translate3d(-25%, 0, 0) rotate(-5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate(3deg); - transform: translate3d(20%, 0, 0) rotate(3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg); - transform: translate3d(-15%, 0, 0) rotate(-3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate(2deg); - transform: translate3d(10%, 0, 0) rotate(2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg); - transform: translate3d(-5%, 0, 0) rotate(-1deg); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes wobble { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg); - transform: translate3d(-25%, 0, 0) rotate(-5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate(3deg); - transform: translate3d(20%, 0, 0) rotate(3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg); - transform: translate3d(-15%, 0, 0) rotate(-3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate(2deg); - transform: translate3d(10%, 0, 0) rotate(2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg); - transform: translate3d(-5%, 0, 0) rotate(-1deg); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} -@-webkit-keyframes jello { - 0%, - 11.1%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -@keyframes jello { - 0%, - 11.1%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -.jello { - -webkit-animation-name: jello; - animation-name: jello; - -webkit-transform-origin: center; - transform-origin: center; -} -@-webkit-keyframes bounceIn { - 0%, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes bounceIn { - 0%, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.bounceIn { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceIn; - animation-name: bounceIn; -} -@-webkit-keyframes bounceInDown { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInDown { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} -@-webkit-keyframes bounceInLeft { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInLeft { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} -@-webkit-keyframes bounceInRight { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInRight { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} -@-webkit-keyframes bounceInUp { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInUp { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} -@-webkit-keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -@keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -.bounceOut { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceOut; - animation-name: bounceOut; -} -@-webkit-keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -@keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} -@-webkit-keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -@keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} -@-webkit-keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -@keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} -@-webkit-keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -@keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} -@-webkit-keyframes fadeIn { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fadeIn { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} -@-webkit-keyframes fadeOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - } -} -@keyframes fadeOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - } -} -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeOutDown { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes fadeOutDown { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} -@-webkit-keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -@keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} -@-webkit-keyframes fadeOutLeft { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes fadeOutLeft { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} -@-webkit-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -@keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} -@-webkit-keyframes fadeOutRight { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes fadeOutRight { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} -@-webkit-keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -@keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} -@-webkit-keyframes fadeOutUp { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes fadeOutUp { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} -@-webkit-keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -@keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} -@-webkit-keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotateY(-1turn); - transform: perspective(400px) rotateY(-1turn); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg); - transform: perspective(400px) translateZ(150px) rotateY(-190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg); - transform: perspective(400px) translateZ(150px) rotateY(-170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotateY(-1turn); - transform: perspective(400px) rotateY(-1turn); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg); - transform: perspective(400px) translateZ(150px) rotateY(-190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg); - transform: perspective(400px) translateZ(150px) rotateY(-170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -.animated.flip { - -webkit-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateX(-5deg); - transform: perspective(400px) rotateX(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateX(-5deg); - transform: perspective(400px) rotateX(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.flipInX { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -@-webkit-keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateY(-20deg); - transform: perspective(400px) rotateY(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateY(-5deg); - transform: perspective(400px) rotateY(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateY(-20deg); - transform: perspective(400px) rotateY(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateY(-5deg); - transform: perspective(400px) rotateY(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.flipInY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} -@-webkit-keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} -@keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} -.flipOutX { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; -} -@-webkit-keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateY(-15deg); - transform: perspective(400px) rotateY(-15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -@keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateY(-15deg); - transform: perspective(400px) rotateY(-15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -.flipOutY { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; -} -@-webkit-keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} -@-webkit-keyframes lightSpeedOut { - 0% { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -@keyframes lightSpeedOut { - 0% { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} -@-webkit-keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; -} -@-webkit-keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} -@-webkit-keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} -@-webkit-keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} -@-webkit-keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} -@-webkit-keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} -@keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} -.rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; -} -@-webkit-keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } -} -@keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } -} -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} -@-webkit-keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -@keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} -@-webkit-keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -@keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} -@-webkit-keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} -@keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} -@-webkit-keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, - 60% { - -webkit-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, - 80% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -@keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, - 60% { - -webkit-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, - 80% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-name: hinge; - animation-name: hinge; -} -@-webkit-keyframes jackInTheBox { - 0% { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes jackInTheBox { - 0% { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -.jackInTheBox { - -webkit-animation-name: jackInTheBox; - animation-name: jackInTheBox; -} -@-webkit-keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg); - transform: translate3d(-100%, 0, 0) rotate(-120deg); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg); - transform: translate3d(-100%, 0, 0) rotate(-120deg); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} -@-webkit-keyframes rollOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate(120deg); - transform: translate3d(100%, 0, 0) rotate(120deg); - } -} -@keyframes rollOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate(120deg); - transform: translate3d(100%, 0, 0) rotate(120deg); - } -} -.rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} -@-webkit-keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -@keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn; -} -@-webkit-keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInDown { - -webkit-animation-name: zoomInDown; - animation-name: zoomInDown; -} -@-webkit-keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInLeft { - -webkit-animation-name: zoomInLeft; - animation-name: zoomInLeft; -} -@-webkit-keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInRight { - -webkit-animation-name: zoomInRight; - animation-name: zoomInRight; -} -@-webkit-keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInUp { - -webkit-animation-name: zoomInUp; - animation-name: zoomInUp; -} -@-webkit-keyframes zoomOut { - 0% { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -@keyframes zoomOut { - 0% { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -.zoomOut { - -webkit-animation-name: zoomOut; - animation-name: zoomOut; -} -@-webkit-keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomOutDown { - -webkit-animation-name: zoomOutDown; - animation-name: zoomOutDown; -} -@-webkit-keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} -@keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} -.zoomOutLeft { - -webkit-animation-name: zoomOutLeft; - animation-name: zoomOutLeft; -} -@-webkit-keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} -@keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} -.zoomOutRight { - -webkit-animation-name: zoomOutRight; - animation-name: zoomOutRight; -} -@-webkit-keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomOutUp { - -webkit-animation-name: zoomOutUp; - animation-name: zoomOutUp; -} -@-webkit-keyframes slideInDown { - 0% { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInDown { - 0% { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} -@-webkit-keyframes slideInLeft { - 0% { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInLeft { - 0% { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} -@-webkit-keyframes slideInRight { - 0% { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInRight { - 0% { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} -@-webkit-keyframes slideInUp { - 0% { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInUp { - 0% { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInUp { - -webkit-animation-name: slideInUp; - animation-name: slideInUp; -} -@-webkit-keyframes slideOutDown { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes slideOutDown { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.slideOutDown { - -webkit-animation-name: slideOutDown; - animation-name: slideOutDown; -} -@-webkit-keyframes slideOutLeft { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes slideOutLeft { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} -@-webkit-keyframes slideOutRight { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes slideOutRight { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} -@-webkit-keyframes slideOutUp { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes slideOutUp { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} diff --git a/3rdparty/animate/animate.js b/3rdparty/animate/animate.js deleted file mode 100755 index 89af9af8..00000000 --- a/3rdparty/animate/animate.js +++ /dev/null @@ -1,55 +0,0 @@ -$.fn.extend({ - animateCss: function (animationName, callback) { - var animationEnd = (function (el) { - var animations = { - animation: "animationend", - OAnimation: "oAnimationEnd", - MozAnimation: "mozAnimationEnd", - WebkitAnimation: "webkitAnimationEnd", - }; - - for (var t in animations) { - if (el.style[t] !== undefined) { - return animations[t]; - } - } - })(document.createElement("div")); - - this.addClass("animated " + animationName).one(animationEnd, function () { - $(this).removeClass("animated " + animationName); - - if (typeof callback === "function") callback(); - }); - - return this; - }, -}); - -/** -$('#yourElement').animateCss('bounce'); -or; -$('#yourElement').animateCss('bounce', function() { - // Do somthing after animation -}); - -https://daneden.github.io/animate.css/ -bounce flash pulse rubberBand -shake headShake swing tada -wobble jello bounceIn bounceInDown -bounceInLeft bounceInRight bounceInUp bounceOut -bounceOutDown bounceOutLeft bounceOutRight bounceOutUp -fadeIn fadeInDown fadeInDownBig fadeInLeft -fadeInLeftBig fadeInRight fadeInRightBig fadeInUp -fadeInUpBig fadeOut fadeOutDown fadeOutDownBig -fadeOutLeft fadeOutLeftBig fadeOutRight fadeOutRightBig -fadeOutUp fadeOutUpBig flipInX flipInY -flipOutX flipOutY lightSpeedIn lightSpeedOut -rotateIn rotateInDownLeft rotateInDownRight rotateInUpLeft -rotateInUpRight rotateOut rotateOutDownLeft rotateOutDownRight -rotateOutUpLeft rotateOutUpRight hinge jackInTheBox -rollIn rollOut zoomIn zoomInDown -zoomInLeft zoomInRight zoomInUp zoomOut -zoomOutDown zoomOutLeft zoomOutRight zoomOutUp -slideInDown slideInLeft slideInRight slideInUp -slideOutDown slideOutLeft slideOutRight slideOutUp -**/ diff --git a/3rdparty/css/animate/animate.css b/3rdparty/css/animate/animate.css deleted file mode 100755 index 1b33ecb3..00000000 --- a/3rdparty/css/animate/animate.css +++ /dev/null @@ -1,2956 +0,0 @@ -@charset "UTF-8"; - -/*! - * animate.css -http://daneden.me/animate - * Version - 3.6.0 - * Licensed under the MIT license - http://opensource.org/licenses/MIT - * - * Copyright (c) 2018 Daniel Eden - */ - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} -@-webkit-keyframes bounce { - 0%, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} -@keyframes bounce { - 0%, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} -.bounce { - -webkit-animation-name: bounce; - animation-name: bounce; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} -@-webkit-keyframes flash { - 0%, - 50%, - to { - opacity: 1; - } - 25%, - 75% { - opacity: 0; - } -} -@keyframes flash { - 0%, - 50%, - to { - opacity: 1; - } - 25%, - 75% { - opacity: 0; - } -} -.flash { - -webkit-animation-name: flash; - animation-name: flash; -} -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes pulse { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.pulse { - -webkit-animation-name: pulse; - animation-name: pulse; -} -@-webkit-keyframes rubberBand { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes rubberBand { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.rubberBand { - -webkit-animation-name: rubberBand; - animation-name: rubberBand; -} -@-webkit-keyframes shake { - 0%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -@keyframes shake { - 0%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} -@-webkit-keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -@keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} -.headShake { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-name: headShake; - animation-name: headShake; -} -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 40% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 60% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - 80% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -@keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - 40% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 60% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - 80% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - to { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} -.swing { - -webkit-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} -@-webkit-keyframes tada { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - } - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - } - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes tada { - 0% { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate(-3deg); - } - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(3deg); - } - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg); - } - to { - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.tada { - -webkit-animation-name: tada; - animation-name: tada; -} -@-webkit-keyframes wobble { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg); - transform: translate3d(-25%, 0, 0) rotate(-5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate(3deg); - transform: translate3d(20%, 0, 0) rotate(3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg); - transform: translate3d(-15%, 0, 0) rotate(-3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate(2deg); - transform: translate3d(10%, 0, 0) rotate(2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg); - transform: translate3d(-5%, 0, 0) rotate(-1deg); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes wobble { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg); - transform: translate3d(-25%, 0, 0) rotate(-5deg); - } - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate(3deg); - transform: translate3d(20%, 0, 0) rotate(3deg); - } - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg); - transform: translate3d(-15%, 0, 0) rotate(-3deg); - } - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate(2deg); - transform: translate3d(10%, 0, 0) rotate(2deg); - } - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg); - transform: translate3d(-5%, 0, 0) rotate(-1deg); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} -@-webkit-keyframes jello { - 0%, - 11.1%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -@keyframes jello { - 0%, - 11.1%, - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} -.jello { - -webkit-animation-name: jello; - animation-name: jello; - -webkit-transform-origin: center; - transform-origin: center; -} -@-webkit-keyframes bounceIn { - 0%, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -@keyframes bounceIn { - 0%, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - to { - opacity: 1; - -webkit-transform: scaleX(1); - transform: scaleX(1); - } -} -.bounceIn { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceIn; - animation-name: bounceIn; -} -@-webkit-keyframes bounceInDown { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInDown { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} -@-webkit-keyframes bounceInLeft { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInLeft { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} -@-webkit-keyframes bounceInRight { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInRight { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} -@-webkit-keyframes bounceInUp { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes bounceInUp { - 0%, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} -@-webkit-keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -@keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} -.bounceOut { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceOut; - animation-name: bounceOut; -} -@-webkit-keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -@keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} -@-webkit-keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -@keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} -@-webkit-keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -@keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} -@-webkit-keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -@keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} -@-webkit-keyframes fadeIn { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fadeIn { - 0% { - opacity: 0; - } - to { - opacity: 1; - } -} -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} -@-webkit-keyframes fadeOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - } -} -@keyframes fadeOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - } -} -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeOutDown { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes fadeOutDown { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} -@-webkit-keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -@keyframes fadeOutDownBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} -@-webkit-keyframes fadeOutLeft { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes fadeOutLeft { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} -@-webkit-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -@keyframes fadeOutLeftBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} -@-webkit-keyframes fadeOutRight { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes fadeOutRight { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} -@-webkit-keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -@keyframes fadeOutRightBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} -@-webkit-keyframes fadeOutUp { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes fadeOutUp { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} -@-webkit-keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -@keyframes fadeOutUpBig { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} -@-webkit-keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotateY(-1turn); - transform: perspective(400px) rotateY(-1turn); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg); - transform: perspective(400px) translateZ(150px) rotateY(-190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg); - transform: perspective(400px) translateZ(150px) rotateY(-170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -@keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotateY(-1turn); - transform: perspective(400px) rotateY(-1turn); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-190deg); - transform: perspective(400px) translateZ(150px) rotateY(-190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(-170deg); - transform: perspective(400px) translateZ(150px) rotateY(-170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} -.animated.flip { - -webkit-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateX(-5deg); - transform: perspective(400px) rotateX(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateX(-5deg); - transform: perspective(400px) rotateX(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.flipInX { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} -@-webkit-keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateY(-20deg); - transform: perspective(400px) rotateY(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateY(-5deg); - transform: perspective(400px) rotateY(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -@keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - 40% { - -webkit-transform: perspective(400px) rotateY(-20deg); - transform: perspective(400px) rotateY(-20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - 60% { - -webkit-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - opacity: 1; - } - 80% { - -webkit-transform: perspective(400px) rotateY(-5deg); - transform: perspective(400px) rotateY(-5deg); - } - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} -.flipInY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} -@-webkit-keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} -@keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateX(-20deg); - transform: perspective(400px) rotateX(-20deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} -.flipOutX { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; -} -@-webkit-keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateY(-15deg); - transform: perspective(400px) rotateY(-15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -@keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - 30% { - -webkit-transform: perspective(400px) rotateY(-15deg); - transform: perspective(400px) rotateY(-15deg); - opacity: 1; - } - to { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -.flipOutY { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; -} -@-webkit-keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes lightSpeedIn { - 0% { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - opacity: 1; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} -@-webkit-keyframes lightSpeedOut { - 0% { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -@keyframes lightSpeedOut { - 0% { - opacity: 1; - } - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} -@-webkit-keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateIn { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; -} -@-webkit-keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} -@-webkit-keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} -@-webkit-keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} -@-webkit-keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -@keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translateZ(0); - transform: translateZ(0); - opacity: 1; - } -} -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} -@-webkit-keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} -@keyframes rotateOut { - 0% { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} -.rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; -} -@-webkit-keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } -} -@keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - opacity: 0; - } -} -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} -@-webkit-keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -@keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} -@-webkit-keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -@keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - opacity: 0; - } -} -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} -@-webkit-keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} -@keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} -@-webkit-keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, - 60% { - -webkit-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, - 80% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -@keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 20%, - 60% { - -webkit-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - 40%, - 80% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} -.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-name: hinge; - animation-name: hinge; -} -@-webkit-keyframes jackInTheBox { - 0% { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -@keyframes jackInTheBox { - 0% { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} -.jackInTheBox { - -webkit-animation-name: jackInTheBox; - animation-name: jackInTheBox; -} -@-webkit-keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg); - transform: translate3d(-100%, 0, 0) rotate(-120deg); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg); - transform: translate3d(-100%, 0, 0) rotate(-120deg); - } - to { - opacity: 1; - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} -@-webkit-keyframes rollOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate(120deg); - transform: translate3d(100%, 0, 0) rotate(120deg); - } -} -@keyframes rollOut { - 0% { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate(120deg); - transform: translate3d(100%, 0, 0) rotate(120deg); - } -} -.rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} -@-webkit-keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -@keyframes zoomIn { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - 50% { - opacity: 1; - } -} -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn; -} -@-webkit-keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInDown { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInDown { - -webkit-animation-name: zoomInDown; - animation-name: zoomInDown; -} -@-webkit-keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInLeft { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInLeft { - -webkit-animation-name: zoomInLeft; - animation-name: zoomInLeft; -} -@-webkit-keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInRight { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInRight { - -webkit-animation-name: zoomInRight; - animation-name: zoomInRight; -} -@-webkit-keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomInUp { - 0% { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomInUp { - -webkit-animation-name: zoomInUp; - animation-name: zoomInUp; -} -@-webkit-keyframes zoomOut { - 0% { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -@keyframes zoomOut { - 0% { - opacity: 1; - } - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - to { - opacity: 0; - } -} -.zoomOut { - -webkit-animation-name: zoomOut; - animation-name: zoomOut; -} -@-webkit-keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomOutDown { - -webkit-animation-name: zoomOutDown; - animation-name: zoomOutDown; -} -@-webkit-keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} -@keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} -.zoomOutLeft { - -webkit-animation-name: zoomOutLeft; - animation-name: zoomOutLeft; -} -@-webkit-keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} -@keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} -.zoomOutRight { - -webkit-animation-name: zoomOutRight; - animation-name: zoomOutRight; -} -@-webkit-keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -@keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} -.zoomOutUp { - -webkit-animation-name: zoomOutUp; - animation-name: zoomOutUp; -} -@-webkit-keyframes slideInDown { - 0% { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInDown { - 0% { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} -@-webkit-keyframes slideInLeft { - 0% { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInLeft { - 0% { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} -@-webkit-keyframes slideInRight { - 0% { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInRight { - 0% { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} -@-webkit-keyframes slideInUp { - 0% { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -@keyframes slideInUp { - 0% { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - to { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } -} -.slideInUp { - -webkit-animation-name: slideInUp; - animation-name: slideInUp; -} -@-webkit-keyframes slideOutDown { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -@keyframes slideOutDown { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} -.slideOutDown { - -webkit-animation-name: slideOutDown; - animation-name: slideOutDown; -} -@-webkit-keyframes slideOutLeft { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -@keyframes slideOutLeft { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} -.slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} -@-webkit-keyframes slideOutRight { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -@keyframes slideOutRight { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} -.slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} -@-webkit-keyframes slideOutUp { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -@keyframes slideOutUp { - 0% { - -webkit-transform: translateZ(0); - transform: translateZ(0); - } - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} -.slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} diff --git a/3rdparty/js/animate/animate.js b/3rdparty/js/animate/animate.js deleted file mode 100755 index 89af9af8..00000000 --- a/3rdparty/js/animate/animate.js +++ /dev/null @@ -1,55 +0,0 @@ -$.fn.extend({ - animateCss: function (animationName, callback) { - var animationEnd = (function (el) { - var animations = { - animation: "animationend", - OAnimation: "oAnimationEnd", - MozAnimation: "mozAnimationEnd", - WebkitAnimation: "webkitAnimationEnd", - }; - - for (var t in animations) { - if (el.style[t] !== undefined) { - return animations[t]; - } - } - })(document.createElement("div")); - - this.addClass("animated " + animationName).one(animationEnd, function () { - $(this).removeClass("animated " + animationName); - - if (typeof callback === "function") callback(); - }); - - return this; - }, -}); - -/** -$('#yourElement').animateCss('bounce'); -or; -$('#yourElement').animateCss('bounce', function() { - // Do somthing after animation -}); - -https://daneden.github.io/animate.css/ -bounce flash pulse rubberBand -shake headShake swing tada -wobble jello bounceIn bounceInDown -bounceInLeft bounceInRight bounceInUp bounceOut -bounceOutDown bounceOutLeft bounceOutRight bounceOutUp -fadeIn fadeInDown fadeInDownBig fadeInLeft -fadeInLeftBig fadeInRight fadeInRightBig fadeInUp -fadeInUpBig fadeOut fadeOutDown fadeOutDownBig -fadeOutLeft fadeOutLeftBig fadeOutRight fadeOutRightBig -fadeOutUp fadeOutUpBig flipInX flipInY -flipOutX flipOutY lightSpeedIn lightSpeedOut -rotateIn rotateInDownLeft rotateInDownRight rotateInUpLeft -rotateInUpRight rotateOut rotateOutDownLeft rotateOutDownRight -rotateOutUpLeft rotateOutUpRight hinge jackInTheBox -rollIn rollOut zoomIn zoomInDown -zoomInLeft zoomInRight zoomInUp zoomOut -zoomOutDown zoomOutLeft zoomOutRight zoomOutUp -slideInDown slideInLeft slideInRight slideInUp -slideOutDown slideOutLeft slideOutRight slideOutUp -**/ diff --git a/core/ajax/mobile.ajax.php b/core/ajax/mobile.ajax.php index faec3c8d..535bbbfb 100755 --- a/core/ajax/mobile.ajax.php +++ b/core/ajax/mobile.ajax.php @@ -16,51 +16,21 @@ * along with Jeedom. If not, see . */ -header('Content-Type: application/json'); try { require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; include_file('core', 'authentification', 'php'); + ajax::init(); + if (!isConnect('admin')) { throw new Exception(__('401 - Accès non autorisé', __FILE__)); } - if (init('action') == 'updatemobile') { - mobile::updatemobile(); + if (init('action') == 'menuDefault') { + mobile::handleMenuDefaultBySelect(init('eqId'), init('eqIdDefault')); ajax::success(); } - if (init('action') == 'constructMenu') { - $reponse = mobile::constructMenu(init('eqId')); - ajax::success($reponse); - } - - -if (init('action') == 'getEqLogicConfigs') { - - $eqLogic = eqLogic::byId(intval(init('eqId'))); - if(is_object($eqLogic)){ - $j = 0; - $arrayMenuConfig = array(); - for($i=1;$i < 5;$i++){ - $arrayTemp = []; - ${ 'spanIcon' . $i} = $eqLogic->getConfiguration('spanIcon'.$i ,'pasencorela'); - ${ 'renameIcon' . $i} = $eqLogic->getConfiguration('renameIcon'.$i ,'pasencorela'); - ${ 'selectNameMenu' . $i} = $eqLogic->getConfiguration('selectNameMenu'.$i, 'pasencorela'); - array_push($arrayMenuConfig, [${ 'spanIcon' . $i}, ${ 'renameIcon' . $i}, ${ 'selectNameMenu' . $i}]); - $j++; - } - log::add('mobile','debug','RETURNAJAXGETCONFIG ' . json_encode($arrayMenuConfig)); - } -ajax::success($arrayMenuConfig); -} - -if(init('action') == 'menuDefault'){ - mobile::handleMenuDefaultBySelect(init('eqId'), init('eqIdDefault')); - ajax::success(); -} - - if (init('action') == 'getQrCode') { $eqLogic = mobile::byId(init('id')); if (!is_object($eqLogic)) { @@ -70,7 +40,7 @@ } } - if (init('action') == 'getQrCodeV2') { + if (init('action') == 'getQrCodeV2') { $user = user::byId(init('chooseUser')); if (!is_object($user)) { throw new Exception(__('User inexistant : ', __FILE__)); @@ -79,52 +49,69 @@ } } + if (init('action') == 'getAffectUserByEqlogic') { + $eqLogic = mobile::byId(init('id')); + $return = ''; + if (is_object($eqLogic)) { + if (is_object($user = user::byId($eqLogic->getConfiguration('affect_user')))) { + $return = $user->getLogin(); + } + } + ajax::success($return); + } + if (init('action') == 'getNotificationsV2') { + $return = ''; + $iq = init('iq'); + $mobile = eqLogic::byLogicalId($iq, 'mobile'); + if (is_object($mobile)) { + $return = mobile::getNotificationsV2($iq); + } + ajax::success($return); + } + + if (init('action') == 'removeNotificationV2') { + ajax::success(mobile::removeNotificationV2(init('iq', ''), init('id', ''))); + } + // APP V1 - if (init('action') == 'regenConfig') { + if (init('action') == 'AppV1Savescenario') { + $id = init('id'); + $sendApp = init('valueSend'); + $scenario = scenario::byId($id); + if (!is_object($scenario)) { + throw new Exception(__('scenario non trouvé', __FILE__)); + } + $scenario->setDisplay("sendToApp", $sendApp); + $scenario->save(); + ajax::success(); + } + if (init('action') == 'AppV1RegenConfig') { mobile::makeTemplateJson(); ajax::success(); } - - - if (init('action') == 'getSaveDashboard'){ + if (init('action') == 'AppV2GetSaveFavDash') { $iq = init('iq'); - $jsonDashboard = mobile::getSaveJson($iq, 'dashboard'); - if ($jsonDashboard == ""){ + $jsonFavDash = mobile::getSaveJson($iq, 'favdash'); + if ($jsonFavDash == "") { $reponse = false; - }else{ + } else { $reponse = true; } ajax::success($reponse); - } - - if (init('action') == 'getSaveFavDash'){ + } + if (init('action') == 'AppV2GetSaveDashboard') { $iq = init('iq'); - $jsonFavDash = mobile::getSaveJson($iq, 'favdash'); - if ($jsonFavDash == ""){ + $jsonDashboard = mobile::getSaveJson($iq, 'dashboard'); + if ($jsonDashboard == "") { $reponse = false; - }else{ + } else { $reponse = true; } ajax::success($reponse); - } - - if (init('action') == 'savescenario'){ - $id = init('id'); - $sendApp = init('valueSend'); - $scenario = scenario::byId($id); - if(!is_object($scenario)){ - throw new Exception(__('scenario non trouvé', __FILE__)); - } - $scenario->setDisplay("sendToApp",$sendApp); - $scenario->save(); - ajax::success(); - } - + } throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); - } catch (Exception $e) { ajax::error(displayException($e), $e->getCode()); } -?> diff --git a/core/api/mobile.api.php b/core/api/mobile.api.php index f5fad9d9..d1acfc21 100755 --- a/core/api/mobile.api.php +++ b/core/api/mobile.api.php @@ -20,150 +20,258 @@ require_once dirname(__FILE__) . "/../../../../core/php/core.inc.php"; global $jsonrpc; -GLOBAL $_USER_GLOBAL; +global $_USER_GLOBAL; if (!is_object($jsonrpc)) { throw new Exception(__('JSONRPC object not defined', __FILE__), -32699); } -function createMobile($params, $nbIcones = 3){ - $configs = $params['configs']; - $notification = $configs['notification']; - $user = user::byHash($params['apikey']); - $userId = $user->getId(); - $mobile = new mobile(); - $mobile->setEqType_name('mobile'); - $mobile->setName($notification['platform'] . '-' . $params['Iq']); - log::add('mobile','debug',' ---- CREATE_NEW_MOBILE WITH '.$nbIcones.' ICONS ----'); - $namesMenus = ['home', 'overview', 'health', 'home']; - $renamesIcons = ['Accueil', 'Synthese', 'Santé', 'Accueil']; - $spanIcons = ['icon jeedomapp-in', 'fab fa-hubspot', 'fas fa-medkit', 'icon jeedomapp-in']; - $urlUsers = ['none', 'none', 'none', 'none']; - $j = 0; - $countFor = intval($nbIcones) + 1; - $menuCustomArray = []; - for($i=1; $i < $countFor; $i++){ - $menuCustomArray[$i] = array('selectNameMenu' => $namesMenus[$j], - 'renameIcon' => $renamesIcons[$j], - 'spanIcon' => $spanIcons[$j], - 'urlUser' => $urlUsers[$j], - ); - $j++; - } - $mobile->setConfiguration('menuCustomArray', $menuCustomArray); - $mobile->setConfiguration('nbIcones', intval($nbIcones)); - $mobile->setConfiguration('defaultIdMobile', 'default'); - $mobile->setConfiguration('type_mobile', $notification['platform']); - $mobile->setConfiguration('affect_user', $userId); - $mobile->setConfiguration('validate', 'no'); - $mobile->setConfiguration('appVersion', '2'); - $mobile->setLogicalId($params['Iq']); - $mobile->setIsEnable(1); - $mobile->save(); - return $mobile; +$params = $jsonrpc->getParams(); +log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: Call API :/fg:◀︎─────────────'); +log::add('mobile', 'debug', '| Method ─▶︎ ' . $jsonrpc->getMethod()); +$secureApikeyLog = $params; +if (isset($secureApikeyLog['apikey'])) $secureApikeyLog['apikey'] = substr($secureApikeyLog['apikey'], 0, 10) . '...'; +log::add('mobile', 'debug', '| Parameters ─▶︎ ' . json_encode($secureApikeyLog)); +if ($params['Iq']) { + if (mobile::whoIsIq($params['Iq']) == 'Mobile not detected') { + log::add('mobile', 'debug', '| [WARNING] Mobile not detected !'); + } else { + log::add('mobile', 'debug', '| Mobile : ' . mobile::whoIsIq($params['Iq'])); + } +} else { + log::add('mobile', 'debug', '| [WARNING] Parameter Iq does not exist !'); } - -function checkDateMenu($menu, $mobile){ - $dateMobile = $mobile->getConfiguration('DateMenu', 'pasdedate'); - if(isset($dateMobile) && isset($menu['date'])){ - if($dateMobile < $menu['date']){ - log::add('mobile','debug','SAVE MENU DEPUIS L APP'); - saveMenuFromAppV2($menu, $mobile); - } - }else{ - return; - } +log::add('mobile', 'debug', '└───────────────────────────────────────────'); + +// APP V2 // +/** + * Create a new equipment + * Call by api setConfigs + * @param array + * @return new object + */ +function createMobileV2($params, $nbIcones = 3) +{ + log::add('mobile', 'debug', '|┌──:fg-success: createMobileV2 :/fg:──'); + $configs = $params['configs']; + $notification = $configs['notification']; + $user = user::byHash($params['apikey']); + $userId = $user->getId(); + $mobile = new mobile(); + $mobile->setEqType_name('mobile'); + $mobile->setName($notification['platform'] . '-' . $params['Iq']); + log::add('mobile', 'debug', '|| [NOTICE] Create new mobile with ' . $nbIcones . ' icons ----'); + $mobile->setConfiguration('menuCustomArray', mobile::getMenuDefaultV2($nbIcones)); + $mobile->setConfiguration('nbIcones', intval($nbIcones)); + $mobile->setConfiguration('type_mobile', $notification['platform']); + $mobile->setConfiguration('affect_user', $userId); + $mobile->setConfiguration('validate', 'no'); + $mobile->setConfiguration('appVersion', '2'); + $mobile->setLogicalId($params['Iq']); + $mobile->setIsEnable(1); + $mobile->save(); + log::add('mobile', 'debug', '|└───────────────────'); + return $mobile; } - -function saveMenuFromAppV2($menu, $mobile){ - log::add('mobile','debug','MENU_SAVE_FRM_APPV2 ' .json_encode($menu)); - if(is_object($mobile)){ +/** + * Save menu from app + * Call by setCustomMenu + * @param array + */ +function saveMenuFromAppV2($menu, $mobile) +{ + log::add('mobile', 'debug', '||┌──:fg-success: saveMenuFromAppV2 :/fg:──'); + log::add('mobile', 'debug', '||| [INFO] Menu > ' . json_encode($menu)); + if (is_object($mobile)) { $menuCustomArray = []; $count = 0; - $i=1; - foreach ($menu as $key => $value){ - if (isset($value['active']) && $value['active'] === true) { - $count++; - $excludedArray = ['dashboard', 'views', 'plan', 'panel']; - if(!in_array($value['options']['objectType'], $excludedArray)){ - $menuCustomArray[$i]['selectNameMenu'] = $value['options']['objectType']; - if($value['options']['objectType'] == 'url'){ - if($value['options']['objectId'] != ''){ - $menuCustomArray[$i]['urlUser'] = $value['options']['objectId']; - }else{ - $menuCustomArray[$i]['urlUser'] = 'https://www.jeedom.com/fr/'; - } - } - }else{ - $menuCustomArray[$i]['selectNameMenu'] = $value['options']['objectId'].'_'.$value['options']['objectType']; + $i = 1; + foreach ($menu as $key => $value) { + if (isset($value['active']) && $value['active'] === true) { + $count++; + $excludedArray = ['dashboard', 'views', 'plan', 'panel']; + if (!in_array($value['options']['objectType'], $excludedArray)) { + $menuCustomArray[$i]['selectNameMenu'] = $value['options']['objectType']; + if ($value['options']['objectType'] == 'url') { + if ($value['options']['objectId'] != '') { + $menuCustomArray[$i]['urlUser'] = $value['options']['objectId']; + } else { + $menuCustomArray[$i]['urlUser'] = 'https://www.jeedom.com/fr/'; } - $menuCustomArray[$i]['renameIcon'] = $value['name']; - $menuCustomArray[$i]['spanIcon'] = 'icon '.$value['icon']['type'].'-'.$value['icon']['name']; - } + } + } else { + $menuCustomArray[$i]['selectNameMenu'] = $value['options']['objectId'] . '_' . $value['options']['objectType']; + } + $menuCustomArray[$i]['renameIcon'] = $value['name']; + $menuCustomArray[$i]['spanIcon'] = 'icon ' . $value['icon']['type'] . '-' . $value['icon']['name']; + } $i++; } - $mobile->setConfiguration('menuCustomArray', $menuCustomArray); + $mobile->setConfiguration('menuCustomArray', $menuCustomArray); $mobile->setConfiguration('nbIcones', $count); - $mobile->save(); + $mobile->setConfiguration('defaultIdMobile', $mobile->getId()); + $mobile->save(); } + log::add('mobile', 'debug', '||└───────────────────'); } -$params = $jsonrpc->getParams(); -log::add('mobile', 'debug', '|------------------------------------------------------------------------------------------------------|'); -log::add('mobile', 'debug', '| Appel API Mobile > ' . $jsonrpc->getMethod()); -log::add('mobile', 'debug', '| paramètres passés > ' . json_encode($params)); -if($params['Iq']){ - log::add('mobile', 'debug', '| Mobile demandeur > ' . mobile::whoIsIq($params['Iq'])); -} -log::add('mobile', 'debug', '|-----------------------------------'); - -if($jsonrpc->getMethod() == 'setConfigs'){ - log::add('mobile', 'debug', '| App V2 Demande > ' . $jsonrpc->getMethod()); - //log::add('mobile', 'debug', 'APRAMS > ' . json_encode($params)); - $configs = $params['configs']; - $menu = $configs['menu']; - $notification = $configs['notification']; - log::add('mobile', 'debug', '| configs > ' . json_encode($configs)); - log::add('mobile', 'debug', '| menu > ' . json_encode($menu)); - log::add('mobile', 'debug', '| notification > ' . json_encode($notification)); - $mobile = null; - if(isset($params['Iq'])) { +/** + * Create equipment if no exist + * Create/update cmd for geoloc if no exist + * Save notificationRegistrationToken + * + * @return string ok makeSuccess + */ +if ($jsonrpc->getMethod() == 'setConfigs') { + log::add('mobile', 'debug', '┌──────────▶︎ setConfigs ──────────────'); + $configs = $params['configs']; + $geolocs = $params['geolocs']; + $menu = $configs['menu']; + $notification = $configs['notification']; + log::add('mobile', 'debug', '| [INFO] Configs ─▶︎ ' . json_encode($configs)); + log::add('mobile', 'debug', '| [INFO] Geolocs ─▶︎ ' . json_encode($geolocs)); + //log::add('mobile', 'debug', '| [INFO] Menu ─▶︎ ' . json_encode($menu)); + log::add('mobile', 'debug', '| [INFO] Notification ─▶︎ ' . json_encode($notification)); + $mobile = null; + if (isset($params['Iq'])) { $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (!is_object($mobile)) { + $mobile = createMobileV2($params, 3); + } } - if (!is_object($mobile)) { - $mobile = createMobile($params, 3); - } - if(isset($notification['token'])) { - log::add('mobile', 'debug', 'token a ajouter > ' . $notification['token']); - if($notification['token'] == 'notifsBGDisabled'){ - message::removeAll("mobile", 'alertNotifs'); - $phoneName = $mobile->getName(); - message::add('mobile', 'Les Notifications sur votre mobile : '.$phoneName.' sont desactivées', 'notifsbg', 'alertNotifs'); - } - if($notification['token'] != ''){ - $mobile->setConfiguration('notificationRegistrationToken', $notification['token']); - } - } - $mobile->save(); - // TEMPORAIREMENT DESACTIVE - checkDateMenu($menu, $mobile); - $geolocs = $params['geolocs']; - if($geolocs){ - if($geolocs != []){ - mobile::createCmdGeoLocV2($params['Iq'], $params['geolocs']); + if (is_object($mobile)) { + $mobile->setConfiguration('type_mobile', $notification['platform']); + if (isset($notification['token'])) { + if ($notification['token'] != '') { + log::add('mobile', 'debug', '| Token to add ─▶︎ ' . $notification['token']); + $mobile->setConfiguration('notificationRegistrationToken', $notification['token']); + if ($notification['token'] == 'notifsBGDisabled') { + message::removeAll("mobile", 'alertNotifs'); + message::add('mobile', __('Les notifications sur votre mobile sont desactivées', __FILE__) . ' ─▶︎ ' . $mobile->getName(), 'notifsbg', 'alertNotifs'); + } + } else { + log::add('mobile', 'debug', '| [NOTICE] Empty token'); + } + } + if (isset($notification['notifsTime'])) { + $notifsTime = intval($notification['notifsTime']); + if ($mobile->getConfiguration('notifsTime', 30) != $notifsTime) { + $mobile->setConfiguration('notifsTime', $notifsTime); + log::add('mobile', 'debug', '| [INFO] New notifsTime ─▶︎ ' . intval($notification['notifsTime'])); + $mobile->cleaningNotifications(); + } + } + if (is_object($user = user::byHash($params['apikey']))) { + log::add('mobile', 'debug', '| [INFO] affect_user ─▶︎ ' . $user->getLogin() . ' (' . $user->getId() . ')'); + $mobile->setConfiguration('affect_user', $user->getId()); + } + $mobile->save(); + + if ($geolocs) { + if ($geolocs != [] && !(is_object($geolocs) && empty((array)$geolocs)) && !(is_string($geolocs) && $geolocs == "{}")) { + mobile::createCmdGeoLocV2($params['Iq'], $params['geolocs']); + } else { + log::add('mobile', 'debug', '| Geolocs empty, previous commands deleted'); + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + $cmds = $mobile->getCmd(); + foreach ($cmds as $cmd) { + if (strpos($cmd->getLogicalId(), 'geoloc_') !== false) { + $cmd->remove(); + } + } + } + } } } - // mobile::createCmdGeoLocV2($params); - $jsonrpc->makeSuccess('ok'); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess('ok'); } +/** + * Save menu from app + * + * @return string ok makeSuccess + */ +if ($jsonrpc->getMethod() == 'setCustomMenu') { + log::add('mobile', 'debug', '┌──────────▶︎ AppV2 setCustomMenu ───────────'); + $configs = $params['configs']; + $menu = $configs['menu']; + log::add('mobile', 'debug', '| [INFO] Configs ─▶︎ ' . json_encode($configs)); + log::add('mobile', 'debug', '| [INFO] Menu ─▶︎ ' . json_encode($menu)); + $mobile = null; + if (isset($params['Iq'])) { + if (is_object($mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'))) { + saveMenuFromAppV2($menu, $mobile); + } else { + log::add('mobile', 'debug', '| [WARNING] A required parameter Iq does not exist !'); + } + } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess('ok'); +} +/** + * getPlugins + * + * @return array makeSuccess + */ +if ($jsonrpc->getMethod() == 'getPlugins') { + log::add('mobile', 'debug', '┌──────────◀︎ AppV2 getPlugins ────────'); + $idBox = jeedom::getHardwareKey(); + $return = []; + $arrayPlugins = []; + $changeLogs = []; + $deamons_infos = []; + $objectsPanel = []; + $pluginPanelMobile = []; + $coreData = []; + foreach ((plugin::listPlugin(true)) as $plugin) { + $obArray = utils::o2a($plugin); + $obArray['displayMobilePanel'] = config::byKey('displayMobilePanel', $plugin->getId(), 0); + $objectId = $obArray['id']; + $objectName = $obArray['name']; + if ($plugin->getMobile() != '' && $obArray['displayMobilePanel'] != 0) { + $objectsPanel[$objectId] = $objectName; + $pluginPanelMobile[$objectId] = $plugin->getMobile(); + } + $update = $plugin->getUpdate(); + if (is_object($update)) { + $pluginUpdateArray = utils::o2a($update); + $arrayDataPlugins = utils::o2a($plugin); + if ($plugin->getHasOwnDeamon() == 1) { + $deamons_infos[$plugin->getId()] = $plugin->deamon_info(); + } else { + $deamons_infos[$plugin->getId()] = array('launchable_message' => 'nodemon', 'launchable' => 'nodemon', 'state' => 'nodemon', 'log' => 'nodemon', 'auto' => 0); + } + $changeLogs[$arrayDataPlugins['id']]['changelog'] = $arrayDataPlugins['changelog']; + $changeLogs[$arrayDataPlugins['id']]['changelog_beta'] = $arrayDataPlugins['changelog_beta']; + array_push($arrayPlugins, $pluginUpdateArray); + } + } + config::save('pluginPanelMobile', $pluginPanelMobile, 'mobile'); + $resultCore = utils::o2a(update::byLogicalId('jeedom')); + array_push($coreData, $resultCore); + $return[$idBox]['informations']['objects']['panel'] = $objectsPanel; + $return[$idBox]['informations']['coreBranch'] = config::byKey('core::branch'); + $return[$idBox]['informations']['coreData'] = $coreData; + $return[$idBox]['informations']['plugins'] = $arrayPlugins; + $return[$idBox]['informations']['changelog'] = $changeLogs; + $return[$idBox]['informations']['infosDemon'] = $deamons_infos; + log::add('mobile', 'debug', '| [INFO] Sent to app ─▶︎ ' . json_encode($return)); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess($return); +} -if($jsonrpc->getMethod() == 'getJson'){ +/** + * getJson + * + * @return array makeSuccess + */ - log::add('mobile', 'debug', 'Demande du RDK to get Json'); - log::add('mobile', 'debug', 'Demande du RDK'); +if ($jsonrpc->getMethod() == 'getJson') { + log::add('mobile', 'debug', '┌──────────◀︎ AppV2 getJson ──────────────────'); $registerDevice = $_USER_GLOBAL->getOptions('registerDevice', array()); if (!is_array($registerDevice)) { $registerDevice = array(); @@ -175,199 +283,465 @@ function saveMenuFromAppV2($menu, $mobile){ $registerDevice[sha512($rdk)]['session_id'] = session_id(); $_USER_GLOBAL->setOptions('registerDevice', $registerDevice); $_USER_GLOBAL->save(); - log::add('mobile', 'debug', 'RDK :' . $rdk); - log::add('mobile', 'debug', 'Demande du GetJson'); + log::add('mobile', 'debug', '| RDK ─▶︎ ' . $rdk); $idBox = jeedom::getHardwareKey(); $return = array(); /* -------- MOBILE FIRST ------- */ - log::add('mobile', 'debug', 'Creation du retour de base pour l app'); $objectsDashboard = []; - foreach(jeeObject::all() as $object){ - $obArray = utils::o2a($object); - $objectId = $obArray['id']; - $objectName = $obArray['name']; - $objectsDashboard[$objectId] = $objectName; + foreach (jeeObject::all() as $object) { + $obArray = utils::o2a($object); + $objectId = $obArray['id']; + $objectName = $obArray['name']; + $objectsDashboard[$objectId] = $objectName; } $return[$idBox]['informations']['objects']['dashboard'] = $objectsDashboard; $objectsViews = []; - foreach(view::all() as $object){ - $obArray = utils::o2a($object); - $objectId = $obArray['id']; - $objectName = $obArray['name']; - $objectsViews[$objectId] = $objectName; + foreach (view::all() as $object) { + $obArray = utils::o2a($object); + $objectId = $obArray['id']; + $objectName = $obArray['name']; + $objectsViews[$objectId] = $objectName; } - $return[$idBox]['informations']['objects']['views'] = $objectsViews; + $return[$idBox]['informations']['objects']['views'] = $objectsViews; $objectsPlan = []; - foreach(planHeader::all() as $object){ - $obArray = utils::o2a($object); - $objectId = $obArray['id']; - $objectName = $obArray['name']; - $objectsPlan[$objectId] = $objectName; + foreach (planHeader::all() as $object) { + $obArray = utils::o2a($object); + $objectId = $obArray['id']; + $objectName = $obArray['name']; + $objectsPlan[$objectId] = $objectName; } $return[$idBox]['informations']['objects']['plan'] = $objectsPlan; $return[$idBox]['userRights'] = $_USER_GLOBAL->getProfils(); $return[$idBox]['apikeyUser'] = $_USER_GLOBAL->getHash(); $return[$idBox]['configs'] = 'undefined'; $return[$idBox]['externalIp'] = network::getNetworkAccess('external'); - $return[$idBox]['localIp'] = network::getNetworkAccess('internal'); + $return[$idBox]['localIp'] = network::getNetworkAccess('internal'); $return[$idBox]['hardware'] = jeedom::getHardwareName(); $return[$idBox]['hwkey'] = jeedom::getHardwareKey(); $return[$idBox]['appMobile'] = '0.4'; - $return[$idBox]['ping'] = true; + $return[$idBox]['ping'] = true; $return[$idBox]['informations']['userRights'] = $_USER_GLOBAL->getProfils(); $return[$idBox]['informations']['hardware'] = jeedom::getHardwareName(); $return[$idBox]['informations']['language'] = config::byKey('language'); - $return[$idBox]['informations']['nbMessage'] = message::nbMessage(); - $arrayObjectMessages = message::all(); - $arrayMessages = []; - foreach($arrayObjectMessages as $message){ - $messageArray = utils::o2a($message); - array_push($arrayMessages, $messageArray); - } - $return[$idBox]['informations']['messages'] = $arrayMessages; - $arrayPlugins = []; - $changeLogs = []; - $healthPlugins = []; - $deamons_infos = []; - $objectsPanel = []; - $pluginPanelMobile = []; - $pluginPanelOutMobile= []; - foreach ((plugin::listPlugin(true)) as $plugin) { - $obArray = utils::o2a($plugin); - $obArray['displayMobilePanel'] = config::byKey('displayMobilePanel', $plugin->getId(), 0); - $objectId = $obArray['id']; - $objectName = $obArray['name']; - if($plugin->getMobile() != '' && $obArray['displayMobilePanel'] != 0){ - $objectsPanel[$objectId] = $objectName; - $pluginPanelMobile[$objectId] = $plugin->getMobile(); - } - $update = $plugin->getUpdate(); - if(is_object($update)){ - $pluginUpdateArray = utils::o2a($update); - $arrayDataPlugins = utils::o2a($plugin); - if($plugin->getHasOwnDeamon() == 1){ - $deamons_infos[$plugin->getId()] = $plugin->deamon_info(); - }else{ - $deamons_infos[$plugin->getId()] = array('launchable_message' => 'nodemon', 'launchable' => 'nodemon', 'state' => 'nodemon', 'log' => 'nodemon', 'auto' => 0); - } - $changeLogs[$arrayDataPlugins['id']]['changelog'] = $arrayDataPlugins['changelog']; - $changeLogs[$arrayDataPlugins['id']]['changelog_beta'] = $arrayDataPlugins['changelog_beta']; - array_push($arrayPlugins, $pluginUpdateArray); - } + //$return[$idBox]['informations']['nbMessage'] = message::nbMessage(); + $userConnected = user::byHash($_USER_GLOBAL->getHash()); + if (is_object($userConnected)) { + $return[$idBox]['informations']['userConnected'] = $userConnected->getLogin(); } - config::save('pluginPanelMobile', $pluginPanelMobile, 'mobile'); - config::save('pluginPanelOutMobile', $pluginPanelOutMobile, 'mobile'); - $return[$idBox]['informations']['objects']['panel'] = $objectsPanel; - $categories = []; - foreach (jeedom::getConfiguration('eqLogic:category') as $key => $value) { + + $categories = []; + foreach (jeedom::getConfiguration('eqLogic:category') as $key => $value) { $categories[$value['icon']] = $value['name']; } - $return[$idBox]['informations']['objects']['categories'] = $categories; - sleep(1); - $coreData = []; - $resultCore = utils::o2a(update::byLogicalId('jeedom')); - array_push($coreData, $resultCore); - $return[$idBox]['informations']['coreBranch'] = config::byKey('core::branch'); - $return[$idBox]['informations']['coreData'] = $coreData; - $return[$idBox]['informations']['plugins'] = $arrayPlugins; - $return[$idBox]['informations']['changelog'] = $changeLogs; - $return[$idBox]['informations']['infosDemon'] = $deamons_infos; - $return[$idBox]['informations']['nbUpdate'] = update::nbNeedUpdate(); - $return[$idBox]['informations']['uname'] = system::getDistrib() . ' ' . method_exists('system','getOsVersion') ? system::getOsVersion() : 'UnknownVersion'; + $return[$idBox]['informations']['objects']['categories'] = $categories; + $return[$idBox]['informations']['nbUpdate'] = update::nbNeedUpdate(); + $return[$idBox]['informations']['uname'] = system::getDistrib() . ' ' . method_exists('system', 'getOsVersion') ? system::getOsVersion() : 'UnknownVersion'; $return[$idBox]['jeedom_version'] = jeedom::version(); - $return[$idBox]['rdk'] = $rdk; + $return[$idBox]['rdk'] = $rdk; $return[$idBox]['name'] = config::byKey('name') == '' ? 'Jeedom' : config::byKey('name'); - log::add('mobile', 'debug', 'retour de base > '.json_encode($return)); - - log::add('mobile', 'debug', 'recherche du mobile via sont Iq >'.$params['Iq']); - $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); - log::add('mobile', 'debug', 'mobile object'); - $return[$idBox]['configs'] = array(); - if(is_object($mobile)){ - log::add('mobile', 'debug', 'mobile bien trouvé > '.$mobile->getName()); - $return[$idBox]['configs']['menu'] = mobile::configMenuCustom($mobile->getId(), jeedom::version()); - }else{ - if(jeedom::version() < '4.4.0'){ - $return[$idBox]['configs']['menu'] = mobile::configMenuCustom($mobile->getId(), jeedom::version()); - }else{ - $defaultMenuJson = '{"tab0":{"active":true,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&p=home"},"type":"WebviewApp"}, - "tab1":{"active":true,"icon":{"name":"hubspot","type":"fa"},"name":"Synthese","options":{"uri":"\/index.php?v=m&p=overview"},"type":"WebviewApp"}, - "tab2":{"active":true,"icon":{"name":"medkit","type":"fa"},"name":"Sant\u00e9","options":{"uri":"\/index.php?v=m&p=health"},"type":"WebviewApp"}, - "tab3":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}'; - $defaultMenuArray = json_decode($defaultMenuJson, true); - $return[$idBox]['configs']['menu'] = $defaultMenuArray; - } + $return[$idBox]['configs'] = array(); + $return[$idBox]['miscellanousParams'] = array(); + if (is_object($mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'))) { + log::add('mobile', 'debug', '| OK Mobile found ─▶︎ ' . $mobile->getName()); + $return[$idBox]['configs']['menu'] = $mobile->configMenuCustom(); + $return[$idBox]['miscellanousParams']['hideMenuCustom'] = intval($mobile->getConfiguration('hideMenuCustom', 0)); + $return[$idBox]['miscellanousParams']['hideMenuGeoloc'] = intval($mobile->getConfiguration('hideMenuGeoloc', 0)); + $return[$idBox]['miscellanousParams']['sendNFCDirectly'] = intval($mobile->getConfiguration('sendNFCDirectly', 1)); + } else { + log::add('mobile', 'debug', '| [WARNING] Mobile not found.'); + $return[$idBox]['configs']['menu'] = mobile::getMenuDefaultTab(); + $return[$idBox]['miscellanousParams']['hideMenuCustom'] = 0; + $return[$idBox]['miscellanousParams']['hideMenuGeoloc'] = 0; + $return[$idBox]['miscellanousParams']['sendNFCDirectly'] = 1; + } + log::add('mobile', 'debug', '| [INFO] Menu custom ─▶︎ ' . json_encode($return[$idBox]['configs'])); + log::add('mobile', 'debug', '| [INFO] Sent to app ─▶︎ ' . json_encode($return)); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + + $jsonrpc->makeSuccess($return); +} + +/** + * return menu custom in app + * + * @return array makeSuccess + */ +if ($jsonrpc->getMethod() == 'getCustomMenu') { + log::add('mobile', 'debug', '┌──────────◀︎ AppV2 getCustomMenu ───────────'); + if (is_object($mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'))) { + log::add('mobile', 'debug', '| OK Mobile found ─▶︎ ' . $mobile->getName()); + $menu = $mobile->configMenuCustom(); + } else { + log::add('mobile', 'debug', '| [WARNING] Mobile not found.'); + $menu = mobile::getMenuDefaultTab(); } - // ENREGISTRER LES 5 DERNIERS MENUS DU TELEPHONE : - // Récupérer les enregistrements précédents pour ce téléphone - $previousMenus = config::byKey('previousMenus', 'mobile'); - if (empty($previousMenus)) { - $previousMenus = []; - } - - $phoneMenus = isset($previousMenus[$params['Iq']]) ? $previousMenus[$params['Iq']] : []; - - $newMenu = $return[$idBox]['configs']['menu']; - - - if (empty($phoneMenus) || $newMenu != $phoneMenus[0]) { - array_unshift($phoneMenus, $newMenu); - $phoneMenus = array_slice($phoneMenus, 0, 5); - $previousMenus[$params['Iq']] = $phoneMenus; - - // 5 DERNIERS - config::save('previousMenus', $previousMenus, 'mobile'); - - } - config::save('menuCustom_' . $params['Iq'], $newMenu, 'mobile'); - - log::add('mobile', 'debug', 'CustomENVOICONFIGSAPI GETJSON' .json_encode($return[$idBox]['configs'])); - log::add('mobile','debug','INFOS GETJSONINITAL : '.json_encode($return)); + log::add('mobile', 'debug', '| [INFO] Sent to app ─▶︎ ' . json_encode($menu)); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess($menu); +} + +/** + * delete message jeedom by type + * + * @return bool makeSuccess + */ +if ($jsonrpc->getMethod() == 'deleteAllMessageByType') { + log::add('mobile', 'debug', '┌──────────▶︎ AppV2 deleteAllMessageByType ───────────'); + $return = "false"; + if (isset($params['appInfos']['messageType'])) { + log::add('mobile', 'debug', '| deleting of all messages of the type "' . $params['appInfos']['messageType'] . '"'); + if ($params['appInfos']['messageType'] == 'jeedom') { + message::removeAll('jeedom'); + $return = "true"; + } elseif ($params['appInfos']['messageType'] == 'plugins') { + $messages = message::all(); + foreach ($messages as $message) { + if (is_object($message)) { + if ($message->getPlugin() != 'jeedom') { + $message->remove(); + } + } + } + $return = "true"; + } + } else log::add('mobile', 'debug', '| A required parameter "messageType" does not exist !'); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); $jsonrpc->makeSuccess($return); +} + +/* V1 ? +if ($jsonrpc->getMethod() == 'version') { + $mobile_update = update::byLogicalId('mobile'); + $jsonrpc->makeSuccess($mobile_update->getLocalVersion()); +} +*/ + +/* V1 ? +if ($jsonrpc->getMethod() == 'event') { + $eqLogic = eqLogic::byId($params['eqLogic_id']); + if (!is_object($eqLogic)) { + throw new Exception(__('EqLogic inconnu : ', __FILE__) . $params['eqLogic_id']); + } + $cmd = $eqLogic->getCmd(null, $params['cmd_logicalId']); + if (!is_object($cmd)) { + throw new Exception(__('Cmd inconnu : ', __FILE__) . $params['cmd_logicalId']); + } + $cmd->event($params['value']); + $jsonrpc->makeSuccess(); +} +*/ +/** + * Ask + * + * @return makeSuccess + */ +if ($jsonrpc->getMethod() == 'askText') { + log::add('mobile', 'debug', '┌──────────▶︎ ASK ───────────────────────────'); + if (is_object($mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'))) { + $askCasse = config::byKey('askCasse', 'mobile', false); + $textCasse = $params['text']; + if ($askCasse == false) { + $textCasse = strtolower($params['text']); + } + if (is_object($cmd = $mobile->getCmd(null, 'notif'))) { + log::add('mobile', 'debug', '| Response ─▶︎ ' . $textCasse); + log::add('mobile', 'debug', '| Cmd ─▶︎ ' . $cmd->getHumanName() . ' (' . $cmd->getId() . ')'); + if ($cmd->askResponse($textCasse)) { + log::add('mobile', 'debug', '| OK Response confirmed'); + } else { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $cmd->generateAskResponseLink($params['text'])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $output = curl_exec($ch); + curl_close($ch); + if (!empty($output)) log::add('mobile', 'debug', '| ' . $output); + } + } else log::add('mobile', 'debug', '| [ERROR] Cmd notification not found'); + } else log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); } -if ($jsonrpc->getMethod() == 'deleteMessage') { - $message = message::byId($params['appInfos']['idmessage']); - if(is_object($message)){ - $message->remove(); - $jsonrpc->makeSuccess("true"); - } - $jsonrpc->makeSuccess("false"); - } - - - if ($jsonrpc->getMethod() == 'deleteAllMessageByType') { - if(isset($params['appInfos']['messageType'])){ - if($params['appInfos']['messageType'] == 'jeedom'){ - message::removeAll('jeedom'); - $jsonrpc->makeSuccess("true"); - }elseif($params['appInfos']['messageType'] == 'plugins'){ - $messages = message::all(); - foreach($messages as $message){ - if(is_object($message)){ - if($message->getPlugin() != 'jeedom'){ - $message->remove(); - } - }else{ - $jsonrpc->makeSuccess("false"); +/** + * get Ask Response + * + * @return string ok + */ +if ($jsonrpc->getMethod() == 'getAskResponse') { + log::add('mobile', 'debug', '┌──────────▶︎ getAskResponse ────────────────'); + if (is_object($mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'))) { + $Iq = $params['Iq']; + $filePath = dirname(__FILE__) . '/../data/notifications/' . $Iq . '.json'; + $idNotif = $params['idNotif']; + $choiceAsk = $params['choiceAsk']; + log::add('mobile', 'debug', '| Id notif ─▶︎ ' . $idNotif); + log::add('mobile', 'debug', '| Response ─▶︎ ' . $choiceAsk); + if (file_exists($filePath)) { + $notifications = file_get_contents($filePath); + $notificationsArray = json_decode($notifications, true); + foreach ($notificationsArray as $key => $notif) { + if ($notif['data']['idNotif'] == $idNotif) { + $notificationsArray[$key]['data']['choiceAsk'] = $choiceAsk; + break; + } + } + $updatedNotifications = json_encode($notificationsArray); + file_put_contents($filePath, $updatedNotifications); + } else log::add('mobile', 'debug', '| [ERROR] Notification file does not exist'); + } else log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess('ok'); +} + +/** + * save event coming from geofencing and methodeForSpecificChannel + * + * @return makeSuccess + */ +if ($jsonrpc->getMethod() == 'mobile::geoloc') { + log::add('mobile', 'debug', '┌──────────▶︎ GeoLocV2 geofencing ───────────'); + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + log::add('mobile', 'debug', '| OK Mobile found ─▶︎ ' . $mobile->getName() . ' (' . $params['Iq'] . ')'); + if (isset($params['transmition'])) { + if (isset($params['transmition']['event']) && $params['transmition']['event'] == 'geofence') { + log::add('mobile', 'debug', '| Event ─▶︎ ' . $params['transmition']['event']); + $geofence = $params['transmition']['geofence']; + log::add('mobile', 'debug', '| Geofence ─▶︎ ' . json_encode($geofence)); + $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoloc_' . $geofence['identifier']); + if (is_object($cmdgeoloc)) { + if ($geofence['action'] == 'ENTER' || $geofence['action'] == 'EXIT') { + $eventAge = time() - intval(strtotime($geofence['timestamp'])); + if ($eventAge > 1800) { + log::add('mobile', 'debug', '| [WARNING] SKIP stale event (' . round($eventAge / 60) . 'min)'); + } else { + $value = ($geofence['action'] == 'ENTER') ? 1 : 0; + log::add('mobile', 'debug', '| OK Command "' . $cmdgeoloc->getName() . '" ( geoloc_' . $geofence['identifier'] . ' ) ─▶︎ ' . $value . ' ( eventAge = ' . $eventAge . 'sec )'); + $mobile->checkAndUpdateCmd('geoloc_' . $geofence['identifier'], $value); } - } - $jsonrpc->makeSuccess("true"); - } - }else{ - $jsonrpc->makeSuccess("false"); - } - } + } else log::add('mobile', 'debug', '| [WARNING] Action unknown ─▶︎ ' . $geofence['action']); + } else log::add('mobile', 'debug', '| [ERROR] geofencing command unknown ─▶︎ ' . 'geoloc_' . $geofence['identifier']); + $mobile->cmdForSpecificChannel($params, 'transmition'); + } else if (is_array($transmitions = $params['transmition'])) { + log::add('mobile', 'debug', '| [INFO] transmition is array'); + $nbTransmition = count($transmitions); + foreach ($transmitions as $key => $transmition) { + log::add('mobile', 'debug', '|┌────────── [' . $key . '] ──────────'); + if (isset($transmition['event']) && $transmition['event'] == 'geofence') { + log::add('mobile', 'debug', '|| Event ─▶︎ ' . $transmition['event']); + $geofence = $transmition['geofence']; + log::add('mobile', 'debug', '|| Geofence ─▶︎ ' . json_encode($geofence)); + $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoloc_' . $geofence['identifier']); + if (is_object($cmdgeoloc)) { + if ($geofence['action'] == 'ENTER' || $geofence['action'] == 'EXIT') { + $eventAge = time() - intval(strtotime($geofence['timestamp'])); + if ($eventAge > 1800) { + log::add('mobile', 'debug', '|| [WARNING] SKIP stale event (' . round($eventAge / 60) . 'min)'); + } else { + $value = ($geofence['action'] == 'ENTER') ? 1 : 0; + log::add('mobile', 'debug', '|| OK Command "' . $cmdgeoloc->getName() . '" ( geoloc_' . $geofence['identifier'] . ' ) ─▶︎ ' . $value . ' ( eventAge = ' . $eventAge . 'sec )'); + $mobile->checkAndUpdateCmd('geoloc_' . $geofence['identifier'], $value); + } + } else log::add('mobile', 'debug', '|| [WARNING] Action unknown ─▶︎ ' . $geofence['action']); + } else log::add('mobile', 'debug', '|| [ERROR] geofencing command unknown ─▶︎ ' . 'geoloc_' . $geofence['identifier']); + } else log::add('mobile', 'debug', '|| [ERROR] No geofencing settings'); + log::add('mobile', 'debug', '|└────────────────────────'); + if ($key == $nbTransmition - 1) { + $mobile->cmdForSpecificChannel($transmitions, $key); + } + } + } + } + } else { + if (isset($params['Iq'])) log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + else log::add('mobile', 'debug', '[WARNING] Parameter Iq does not exist !'); + } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); +} +/** + * save event qrcode scan from app + * + * @return makeSuccess + */ +if ($jsonrpc->getMethod() == "qrcodemethod") { + log::add('mobile', 'debug', '┌──────────▶︎ qrcodemethod ──────────────────'); + if ($params['appInfos']) { + log::add('mobile', 'debug', '| [INFO] QR Code Value > ' . json_encode($params['appInfos']['qrCode'])); + if (isset($params['appInfos']['qrCode']['displayValue'])) { + mobile::cmdForApi($params['Iq'], "barrecodemethod", $params['appInfos']['qrCode']['displayValue'], "CodeBarre"); + } else { + mobile::cmdForApi($params['Iq'], "qrcodemethod", json_encode($params['appInfos']['qrCode']), "QrCode"); + } + } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); +} + +/** + * save and create cmd for methodeForSpecificChannel + * + * @return makeSuccess || makeError + */ +if ($jsonrpc->getMethod() == "methodeForSpecificChannel") { + log::add('mobile', 'debug', '┌──────────▶︎ methodeForSpecificChannel ──────────────────────'); + log::add('mobile', 'debug', '| [INFO] params ─▶︎ ' . json_encode($params)); + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + $mobile->cmdForSpecificChannel($params, 'location'); + } else { + if (isset($params['Iq'])) { + log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + $jsonrpc->makeError('EqLogic inconnu'); + } else { + log::add('mobile', 'debug', '[WARNING] Parameter Iq does not exist !'); + $jsonrpc->makeError('Paramètre Iq inexistant'); + } + } + log::add('mobile', 'debug', '└─────────────────────────────────────────────────────────────'); + $jsonrpc->makeSuccess(); +} +/** + * save event nfc scan from app + * + * @return makeSuccess + */ +if ($jsonrpc->getMethod() == "nfc") { + log::add('mobile', 'debug', '┌──────────▶︎ NFC ───────────────────────────'); + $id = (isset($params['appInfos']['payload']['id'])) ? $params['appInfos']['payload']['id'] : ""; + $payload = (isset($params['appInfos']['payload']['payload'])) ? $params['appInfos']['payload']['payload'] : ""; + mobile::cmdForApi($params['Iq'], "nfcId", $id, "Nfc Id"); + mobile::cmdForApi($params['Iq'], "nfcPayload", json_encode($payload), "Nfc Payload"); + log::add('mobile', 'debug', '| [INFO] Id ─▶︎ ' . $id); + log::add('mobile', 'debug', '| [INFO] Payload ─▶︎ ' . $payload); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); +} +/** + * get notifications present in json file + * + * @return array + */ +if ($jsonrpc->getMethod() == 'getNotificationsFromFile') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: getNotificationsFromFile :/fg:──────────'); + $Iq = $params['Iq']; + $filePath = dirname(__FILE__) . '/../data/notifications/' . $Iq . '.json'; + $notifications = 'noNotifications'; + if (file_exists($filePath)) { + $notifications = file_get_contents($filePath); + if (empty($notifications)) { + $notifications = 'noNotifications'; + } + } + log::add('mobile', 'debug', '| [INFO] Notifications ─▶︎ ' . $notifications); + log::add('mobile', 'debug', '└─────────────────────────────────────────────────────'); + $jsonrpc->makeSuccess($notifications); +} + +/** + * delete notifiaction by id in json file + * + * @return string ok + */ +if ($jsonrpc->getMethod() == 'deleteNotificationInJsonFile') { + log::add('mobile', 'debug', '┌──────────▶︎ deleteNotificationInJsonFile ──────'); + $Iq = $params['Iq']; + $filePath = dirname(__FILE__) . '/../data/notifications/' . $Iq . '.json'; + $idNotif = $params['IdNotif']; + log::add('mobile', 'debug', '| [WARNING] Delete notification "' . $idNotif . '" in file > ' . $filePath); + if (file_exists($filePath)) { + $notifications = file_get_contents($filePath); + $notificationsArray = json_decode($notifications, true); + if ($idNotif == 'allNotifs') { + file_put_contents($filePath, ''); + } elseif (isset($notificationsArray[$idNotif])) { + unset($notificationsArray[$idNotif]); + $notifications = json_encode($notificationsArray); + file_put_contents($filePath, $notifications); + } + } + log::add('mobile', 'debug', '└───────────────────────────────────────────────'); + $jsonrpc->makeSuccess('ok'); +} + +/** + * geolofencing point delete + * + * @return string ok + */ +if ($jsonrpc->getMethod() == 'deleteGeolocCommand') { + log::add('mobile', 'debug', '┌──────────▶︎ deleteGeolocCommand ───────'); + $geolocId = $params['geoloc_id']; + $eqLogic = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($eqLogic)) { + $cmd = cmd::byEqLogicIdAndLogicalId($eqLogic->getId(), 'geoloc_' . $geolocId); + if (is_object($cmd)) { + log::add('mobile', 'debug', '| [WARNING] Suppression de la commande "' . $cmd->getName() . '"'); + $cmd->remove(); + } + } else if (isset($params['Iq'])) log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + else log::add('mobile', 'debug', '[WARNING] Parameter Iq does not exist !'); + log::add('mobile', 'debug', '└───────────────────────────────────────────────'); + $jsonrpc->makeSuccess('ok'); +} + +/** + * get scenarios by group + * + * @return array + */ +if ($jsonrpc->getMethod() == 'getScenarios') { + log::add('mobile', 'debug', '┌──────────◀︎ getScenarios ─────────────────'); + $scenarios = array(); + $hasScenario = false; + $scenarioListGroup = scenario::listGroup(); + $emptyListGroup = false; + $emptyNoGroup = false; + if (empty($scenarioListGroup)) { + log::add('mobile', 'debug', '| Scenarios ─▶︎ No scenario group'); + $emptyListGroup = true; + } + if (is_array($scenarioListGroup)) { + foreach ($scenarioListGroup as $group) { + $scenarios[$group['group']] = scenario::all($group['group']); + } + $hasScenario = true; + } + $scenarioNoGroup = scenario::all(null); + if (count($scenarioNoGroup) > 0) { + $scenarios['{{Aucun}}'] = $scenarioNoGroup; + $hasScenario = true; + } else { + log::add('mobile', 'debug', '| Scenarios ─▶︎ No scenario "without a group"'); + $emptyNoGroup = true; + } + log::add('mobile', 'debug', '| Scenarios ─▶︎ ' . json_encode($scenarios)); + $scenarioTemp = array(); + foreach ($scenarios as $key => $scenario) { + $scenarioTemp[$key][] = utils::o2a($scenario); + } + log::add('mobile', 'debug', '| $scenarioTemp ─▶︎ ' . json_encode($scenarioTemp)); + if ($emptyListGroup && $emptyNoGroup) { + $return = 'noScenarios'; + } else { + $return = json_encode($scenarioTemp); + } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess($return); +} + +// APP V1 // + if ($jsonrpc->getMethod() == 'sync') { + log::add('mobile', 'debug', '┌──────────▶︎ Sync App V1 ───────────────────'); if (jeedom::version() >= '3.2.0') { - log::add('mobile', 'debug', 'SYNC'); - log::add('mobile', 'debug', 'Demande du RDK'); + log::add('mobile', 'debug', '| Demande du RDK ....'); $registerDevice = $_USER_GLOBAL->getOptions('registerDevice', array()); if (!is_array($registerDevice)) { $registerDevice = array(); @@ -379,7 +753,7 @@ function saveMenuFromAppV2($menu, $mobile){ $registerDevice[sha512($rdk)]['session_id'] = session_id(); $_USER_GLOBAL->setOptions('registerDevice', $registerDevice); $_USER_GLOBAL->save(); - log::add('mobile', 'debug', 'RDK :' . $rdk); + log::add('mobile', 'debug', '| RDK : ' . $rdk); } $mobile = null; if (isset($params['Iq'])) { @@ -394,66 +768,66 @@ function saveMenuFromAppV2($menu, $mobile){ $mobile->setConfiguration('type_mobile', $params['platform']); $mobile->setConfiguration('affect_user', $userId); $mobile->setConfiguration('validate', 'no'); - if (isset($params['notificationProvider'])) { + if (isset($params['notificationProvider']) && $params['notificationProvider'] != '') { $mobile->setConfiguration('notificationArn', substr($params['notificationProvider'], 1, -1)); } - if (isset($params['notificationRegistrationToken'])) { - if($params['notificationRegistrationToken'] != 'nok'){ - $mobile->setConfiguration('notificationRegistrationToken', $params['notificationRegistrationToken']); - } - } + if (isset($params['notificationRegistrationToken']) && $params['notificationRegistrationToken'] != '') { + if ($params['notificationRegistrationToken'] != 'nok') { + $mobile->setConfiguration('notificationRegistrationToken', $params['notificationRegistrationToken']); + } + } $mobile->setIsEnable(1); $mobile->save(); $params['Iq'] = $mobile->getLogicalId(); } - if (isset($params['notificationProvider']) || $params['notificationProvider'] != '' || isset($params['notificationRegistrationToken']) || $params['notificationRegistrationToken'] != 'nok') { - log::add('mobile', 'debug', 'notificationProvider Disponible'); - log::add('mobile', 'debug', 'EqLogic dispo'); - $arn = $mobile->getConfiguration('notificationArn', null); - $token = $mobile->getConfiguration('notificationRegistrationToken', null); + + if (isset($params['notificationProvider']) && $params['notificationProvider'] != '') { + log::add('mobile', 'debug', '| notificationProvider available'); + $arn = $mobile->getConfiguration('notificationArn', ''); $arnMobile = substr($params['notificationProvider'], 1, -1); - $tokenMobile = $params['notificationRegistrationToken']; - if ($arn == null) { - log::add('mobile', 'debug', 'arn null dans la configuration > ' . $arn); + if ($arn != $arnMobile) { $mobile->setConfiguration('notificationArn', $arnMobile); $mobile->save(); - } else { - log::add('mobile', 'debug', 'arn NON null dans la configuration > ' . $arn); - if ($arn != $arnMobile) { - $mobile->setConfiguration('notificationArn', $arnMobile); - $mobile->save(); - } } - if ($token == 'nok'){ - log::add('mobile', 'debug', 'token null dans la configuration > ' . $token); + } + + if (isset($params['notificationRegistrationToken']) && $params['notificationRegistrationToken'] != '') { + log::add('mobile', 'debug', '| notificationRegistrationToken available'); + $token = $mobile->getConfiguration('notificationRegistrationToken', 'nok'); + $tokenMobile = $params['notificationRegistrationToken']; + if ($token == 'nok') { + log::add('mobile', 'debug', '| notificationRegistrationToken null in the configuration ─▶︎ ' . $token); $mobile->setConfiguration('notificationRegistrationToken', $tokenMobile); $mobile->save(); - }else{ - log::add('mobile', 'debug', 'Token dans la configuration > ' . $token); + } else { + log::add('mobile', 'debug', '| Token in the configuration ─▶︎ ' . $token); if ($token != $tokenMobile) { + log::add('mobile', 'debug', '| Token config != Token mobile ─▶︎ ' . $token . ' != ' . $tokenMobile); $mobile->setConfiguration('notificationRegistrationToken', $tokenMobile); $mobile->save(); - } - } + } + } } + if (isset($params['gen_json']) && $params['gen_json'] == 1) { mobile::makeTemplateJson(); } $return = mobile::getTemplateJson(); $return['messages'] = mobile::discovery_message(); - $return['summaryValue'] = mobile::discovery_summaryValue($return['objects']); + $return['summaryValue'] = mobile::discovery_summaryValue($return['objects']); $return['config']['datetime'] = getmicrotime(); $return['config']['Iq'] = $params['Iq']; $return['config']['NameMobile'] = $mobile->getName(); if (isset($rdk)) { $return['config']['rdk'] = $rdk; } - log::add('mobile', 'debug', 'Return $discovery_summaryValue > ' . json_encode($return['summaryValue'])); + log::add('mobile', 'debug', '| Return $discovery_summaryValue ─▶︎ ' . json_encode($return['summaryValue'])); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); $jsonrpc->makeSuccess($return); } if ($jsonrpc->getMethod() == 'cmdsbyEqlogicID') { - log::add('mobile', 'debug', 'Interogation du module id:' . $params['id'] . ' Pour les cmds'); + log::add('mobile', 'debug', 'Querying the ID module ' . $params['id'] . ' for cmds'); $PluginToSend = mobile::PluginToSend(); $discover_eqLogic = mobile::discovery_eqLogic($PluginToSend); $sync_new = mobile::change_cmdAndeqLogic(mobile::discovery_cmd($PluginToSend, $discover_eqLogic, true), $discover_eqLogic); @@ -469,7 +843,7 @@ function saveMenuFromAppV2($menu, $mobile){ } $i++; } - log::add('mobile', 'debug', 'Commande > ' . json_encode($cmdAPI)); + log::add('mobile', 'debug', 'Commands ─▶︎ ' . json_encode($cmdAPI)); $jsonrpc->makeSuccess($cmdAPI); } @@ -491,171 +865,103 @@ function saveMenuFromAppV2($menu, $mobile){ $jsonrpc->makeSuccess(); } -if ($jsonrpc->getMethod() == 'askText') { - log::add('mobile', 'debug', 'TESTAPIASK'); - log::add('mobile', 'debug', 'Arrivée reponse ask Textuel depuis le mobile > ' . $params['Iq']); - /*$configs = $params['configs']; - $menu = $configs['menu']; - $notification = $configs['notification'];*/ - $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); - log::add('mobile', 'debug', 'mobile >' . json_encode($mobile)); - if (is_object($mobile)) { - $askCasse = config::byKey('askCasse', 'mobile', false); - $textCasse = $params['text']; - if ($askCasse == false) { - $textCasse = strtolower($params['text']); - } - log::add('mobile', 'debug', 'Mobile bien trouvé casse -> ' . $askCasse . ' text : ' . $textCasse); - $cmd = $mobile->getCmd(null, 'notif'); - log::add('mobile', 'debug', 'IQ > ' . $params['Iq'] . ' demande cmd > ' . $cmd->getId()); - if ($cmd->askResponse($textCasse)) { - log::add('mobile', 'debug', 'ask bien trouvé : Réponse validée'); - $jsonrpc->makeSuccess(); - }else{ - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $cmd->generateAskResponseLink($params['text'])); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $output = curl_exec($ch); - curl_close($ch); - log::add('mobile', 'debug', $output); - $jsonrpc->makeSuccess(); - } +if ($jsonrpc->getMethod() == 'saveMobile') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: saveMobile V1 :/fg:──────────────'); + if (isset($params['Iq'])) { + log::add('mobile', 'debug', '| Backup request ─▶︎ ' . $params['type'] . ' ─▶︎ ' . $params['Iq'] . ' (' . mobile::whoIsIq($params['Iq']) . ')'); + log::add('mobile', 'debug', '| Data to save ─▶︎ ' . json_encode($params['Json'])); + mobile::makeSaveJson($params['Iq'], $params['Json'], $params['type']); } -} - -if ($jsonrpc->getMethod() == 'saveMobile'){ - log::add('mobile', 'debug', 'Demande de sauvegarde '. $params['type'] .' > ' . $params['Iq'] .' > '. mobile::whoIsIq($params['Iq'])); - mobile::makeSaveJson($params['Iq'],$params['Json'], $params['type']); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); $jsonrpc->makeSuccess(); } -if ($jsonrpc->getMethod() == 'getMobile'){ - log::add('mobile', 'debug', 'Demande de recuperation '. $params['type'] .' > ' . $params['Iq'] .'('.mobile::whoIsIq($params['Iq']).') recuperation save du > ' . $params['IqRestore'] . ' ('. mobile::whoIsIq($params['IqRestore']) .')'); - $jsonrpc->makeSuccess(mobile::getSaveJson($params['IqRestore'], $params['type'])); +if ($jsonrpc->getMethod() == 'getMobile') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: getMobile V1 :/fg:──────────────'); + log::add('mobile', 'debug', '| Recovery request ─▶︎ ' . $params['type'] . ' ─▶︎ ' . $params['Iq'] . ' (' . mobile::whoIsIq($params['Iq']) . ')'); + log::add('mobile', 'debug', '| Backup recovery ─▶︎ ' . $params['IqRestore'] . ' (' . mobile::whoIsIq($params['IqRestore']) . ')'); + $saveJson = mobile::getSaveJson($params['IqRestore'], $params['type']); + log::add('mobile', 'debug', '| Data sent to the app ─▶︎ ' . json_encode($saveJson)); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess($saveJson); } -if ($jsonrpc->getMethod() == 'geoloc'){ - log::add('mobile', 'debug', 'Geoloc '. $params['id'] .' > ' . $params['name'] .' > ' .$params['value']); - mobile::EventGeoloc($params); - $jsonrpc->makeSuccess(); -} - -if ($jsonrpc->getMethod() == 'geolocSave'){ - log::add('mobile', 'debug', 'Geoloc SAVE '. $params['id'] .' > ' . $params['name']); - if($params['id'] != '' || $params['id'] != null){ - mobile::SaveGeoloc($params); - $jsonrpc->makeSuccess(); - }else{ - throw new Exception(__('pas d\'id : ', __FILE__) . $params['name']); - } -} - -if ($jsonrpc->getMethod() == 'geolocDel'){ - log::add('mobile', 'debug', 'Geoloc DEL '. $params['id'] .' > ' . $params['name']); - mobile::delGeoloc($params); +if ($jsonrpc->getMethod() == 'geoloc') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: geoloc V1 :/fg:──────────────'); + if (isset($params['Iq'])) { + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + if (isset($params['id']) && $params['id'] != '' && isset($params['name']) && $params['name'] != '' && isset($params['value']) && $params['value'] != '') { + log::add('mobile', 'debug', '| geoId_' . $params['id'] . ' ─▶︎ ' . $params['name'] . ' ─▶︎ ' . $params['value']); + if ($mobile->checkAndUpdateCmd('geoId_' . $params['id'], $params['value'])) { + log::add('mobile', 'debug', '| ↳ Update geofence point ─▶︎ ' . $params['value']); + } + } else log::add('mobile', 'debug', '| [WARNING] A required parameter does not exist !'); + } else log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); + } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); $jsonrpc->makeSuccess(); } - -// FOR NEXT APP VERSION WITH TRANSIMITION ARRAY -// if($jsonrpc->getMethod() == 'mobile::geoloc'){ -// log::add('mobile', 'debug', '|-----------------------------------'); -// log::add('mobile', 'debug', '|-GeoLocV2 geofencing --'); -// $transmitions = $params['transmition']; -// $errorCount = 0; -// foreach($transmitions as $transmition){ -// if($transmition['event'] == 'geofence'){ -// log::add('mobile', 'debug', 'Transmition :' . json_encode($params['transmition'])); -// $geofence = $transmition['geofence']; -// log::add('mobile', 'debug', '| event > '.json_encode($geofence)); -// $eqLogicMobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); -// if($eqLogicMobile){ -// log::add('mobile', 'debug', '| Mobile trouvé'); -// $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoloc_' . $geofence['identifier']); -// if(is_object($cmdgeoloc)){ -// log::add('mobile', 'debug', '| commande trouvé'); -// if($geofence['action'] == 'ENTER'){ -// log::add('mobile', 'debug', '| commande passé à 1'); -// $cmdgeoloc->event(1); -// }elseif($geofence['action'] == 'EXIT'){ -// log::add('mobile', 'debug', '| commande passé à 0'); -// $cmdgeoloc->event(0); -// } -// } -// } -// log::add('mobile', 'debug', '|-----------------------------------'); -// }else{ -// $errorCount++; -// } -// } -// if($errorCount == 0){ -// $jsonrpc->makeSuccess(); -// }else{ -// throw new Exception(__('pas de parametre de geofencing : ', __FILE__)); -// } -// } - - -if($jsonrpc->getMethod() == 'mobile::geoloc'){ - log::add('mobile', 'debug', '|-----------------------------------'); - log::add('mobile', 'debug', '|-GeoLocV2 geofencing --'); - - if(isset($params['transmition']) && isset($params['transmition']['event']) && $params['transmition']['event'] == 'geofence'){ - log::add('mobile', 'debug', '| event > '.$params['transmition']['event']); - $geofence = $params['transmition']['geofence']; - log::add('mobile', 'debug', '| event > '.json_encode($geofence)); - $eqLogicMobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); - if($eqLogicMobile){ - log::add('mobile', 'debug', '| Mobile trouvé'); - $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoloc_' . $geofence['identifier']); - if(is_object($cmdgeoloc)){ - log::add('mobile', 'debug', '| commande trouvé'); - if($geofence['action'] == 'ENTER'){ - log::add('mobile', 'debug', '| commande passé à 1'); - $cmdgeoloc->event(1); - }elseif($geofence['action'] == 'EXIT'){ - log::add('mobile', 'debug', '| commande passé à 0'); - $cmdgeoloc->event(0); - } - } - log::add('mobile', 'debug', '|-----------------------------------'); - $jsonrpc->makeSuccess(); - }else{ - throw new Exception(__('EqLogic inconnu : ', __FILE__) . $params['Iq']); - } - } else { - throw new Exception(__('Pas de paramètre de geofencing : ', __FILE__)); +if ($jsonrpc->getMethod() == 'geolocSave') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: geolocSave V1 :/fg:──────────────'); + if (isset($params['Iq'])) { + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + if (isset($params['id']) && $params['id'] != '') { + $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoId_' . $params['id']); + if ($params['name'] == "") { + $name = $params['id']; + } else { + $name = $params['name']; + } + if (!is_object($cmdgeoloc)) { + $cmdgeoloc = new mobileCmd(); + $cmdgeoloc->setLogicalId('geoId_' . $params['id']); + $cmdgeoloc->setEqLogic_id($mobile->getId()); + $cmdgeoloc->setType('info'); + $cmdgeoloc->setSubType('binary'); + $cmdgeoloc->setTemplate('dashboard', 'core::presence'); + $cmdgeoloc->setTemplate('mobile', 'core::presence'); + $cmdgeoloc->setDisplay('icon', ''); + $cmdgeoloc->setDisplay('showIconAndNamedashboard', 1); + $cmdgeoloc->setIsHistorized(1); + $cmdgeoloc->setGeneric_type('PRESENCE'); + $cmdgeoloc->setIsVisible(1); + $cmdgeoloc->setName($name); + } + $cmdgeoloc->setConfiguration('latitude', $params['latitude']); + $cmdgeoloc->setConfiguration('longitude', $params['longitude']); + $cmdgeoloc->setConfiguration('subtitle', $params['subtitle']); + $cmdgeoloc->setConfiguration('radius', $params['radius']); + $cmdgeoloc->save(); + log::add('mobile', 'debug', '| geoId_' . $params['id'] . ' ─▶︎ ' . $name . ' ─▶︎ ' . $params['value']); + if ($mobile->checkAndUpdateCmd('geoId_' . $params['id'], $params['value'])) { + log::add('mobile', 'debug', '| ↳ Update geofence point ─▶︎ ' . $params['value']); + } + } else log::add('mobile', 'debug', '| [WARNING] A required parameter does not exist or is empty !'); + } else log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); } -if($jsonrpc->getMethod() == "qrcodemethod"){ - log::add('mobile', 'debug', 'QrCode > '.json_encode($params)); - if($params['appInfos']){ - log::add('mobile', 'debug', 'valeur du QrCode > '.json_encode($params['appInfos']['qrCode'])); - if(isset($params['appInfos']['qrCode']['displayValue'])){ - mobile::cmdForApi($params['Iq'],"barrecodemethod",$params['appInfos']['qrCode']['displayValue'],"CodeBarre"); - }else{ - mobile::cmdForApi($params['Iq'],"qrcodemethod",json_encode($params['appInfos']['qrCode']),"QrCode"); - } - $jsonrpc->makeSuccess(); +if ($jsonrpc->getMethod() == 'geolocDel') { + log::add('mobile', 'debug', '┌──────────▶︎:fg-warning: geolocDel V1 :/fg:──────────────'); + if (isset($params['Iq'])) { + $mobile = eqLogic::byLogicalId($params['Iq'], 'mobile'); + if (is_object($mobile)) { + if (isset($params['id']) && $params['id'] != '') { + $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoId_' . $params['id']); + if (is_object($cmdgeoloc)) { + $cmdgeoloc->remove(); + log::add('mobile', 'debug', '| geoId_' . $params['id'] . ' (' . $params['name'] . ') is deleted with success.'); + } + } else log::add('mobile', 'debug', '| [WARNING] A required parameter Id does not exist or is empty !'); + } else log::add('mobile', 'debug', '| [ERROR] EqLogic unknown ─▶︎ ' . $params['Iq']); } -} - -if($jsonrpc->getMethod() == "nfc"){ - $id = (isset($params['appInfos']['payload']['id'])) ? $params['appInfos']['payload']['id'] : ""; - $payload = (isset($params['appInfos']['payload']['payload'])) ? $params['appInfos']['payload']['payload'] : ""; - mobile::cmdForApi($params['Iq'], "nfcId", $id, "Nfc Id"); - mobile::cmdForApi($params['Iq'], "nfcPayload", json_encode($payload), "Nfc Payload"); - - log::add('mobile', 'debug', '| Id > ' . $id); - log::add('mobile', 'debug', '| Payload > ' . $payload); - - $jsonrpc->makeSuccess(); -} - -if($jsonrpc->getMethod() == "syncBella"){ - log::add('mobile', 'debug', 'JeedomApp > syncBella'); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); + $jsonrpc->makeSuccess(); } throw new Exception(__('Aucune demande', __FILE__)); -?> diff --git a/core/class/bellaMobile.class.php b/core/class/bellaMobile.class.php deleted file mode 100644 index 9bd48337..00000000 --- a/core/class/bellaMobile.class.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -/* * ***************************Includes********************************* */ -require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; - -class bellaMobile extends eqLogic -{ - function recupAllCmd($jeeObject_id){ - $arrayBella = array(); - $jeeObject = jeeObject::byId(); - $eqLogics = $jeeObject->getEqLogic(); - foreach ($eqLogics as $eqLogic) { - $cmds = $eqLogic->getCmd(); - foreach($cmds as $cmd){ - $arrayBella[$cmd->getId()] = array(); - $arrayBella[$cmd->getId()]['options'] = array(); - $arrayBella[$cmd->getId()]['options']['name'] = $cmd->getName(); - $arrayBella[$cmd->getId()]['options']['value'] = $cmd->getDisplay('value'); - $arrayBella[$cmd->getId()]['options']['genericType'] = $cmd->getGenericType(); - } - } - } - - function syncBella(){ - - } -} \ No newline at end of file diff --git a/core/class/mobile.class.php b/core/class/mobile.class.php index 16f88d26..3c873be2 100755 --- a/core/class/mobile.class.php +++ b/core/class/mobile.class.php @@ -18,31 +18,113 @@ /* * ***************************Includes********************************* */ require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; +error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); class mobile extends eqLogic { - /* * *************************Attributs****************************** */ + /* AppV1 */ public static $_pluginSuported = array('mobile', 'openzwave', 'rfxcom', 'edisio', 'mpower', 'mySensors', 'Zibasedom', 'virtual', 'camera', 'weather', 'philipsHue', 'enocean', 'wifipower', 'alarm', 'mode', 'apcupsd', 'btsniffer', 'dsc', 'rflink', 'mysensors', 'relaynet', 'remora', 'unipi', 'eibd', 'thermostat', 'netatmoThermostat', 'espeasy', 'jeelink', 'teleinfo', 'tahoma', 'protexiom', 'boilerThermostat', 'lifx', 'wattlet', 'rfplayer', 'openenocean', 'netatmoWeather', 'Volets', 'vmczehnder', 'zigbee'); - public static $_pluginWidget = array('alarm', 'camera', 'thermostat', 'netatmoThermostat', 'weather', 'mode', 'mobile'); - public static $_pluginMulti = array('LIGHT_STATE', 'ENERGY_STATE', 'FLAP_STATE', 'HEATING_STATE', 'SIREN_STATE', 'LOCK_STATE'); - public static $_listenEvents = array('cmd::update', 'scenario::update', 'jeeObject::summary::update'); /* * ***********************Methode static*************************** */ + /** + * Core callback to returns the directory of data not to be saved in the Jeedom backup + * + * @return array + */ + public static function backupExclude() + { + return ['data/images']; + } + + /** + * cron callback + * clean notification V2 + * makeTemplate V1 + */ + public static function cronDaily() + { + // APP V2 + foreach (eqLogic::byType('mobile') as $mobile) { + if ($mobile->getConfiguration('appVersion', 1) == 2) { + $mobile->cleaningNotifications(); + } + } + // App V1 + mobile::makeTemplateJson(); + } + + /** + * wizard AppV2 + * Call by wizard.php + * @return array + */ + public static function getWizardSteps(): array + { + $wizard['doc1'] = __('Accueil', __FILE__); + $wizard['doc2'] = __('Page2', __FILE__); + $wizard['doc3'] = __('Page3', __FILE__); + return $wizard; + } + + /** + * Core callback to provide additional information for a new Community post + * + * @return string + */ + public static function getConfigForCommunity() + { + $hw = jeedom::getHardwareName(); + if ($hw == 'diy') $hw = trim(shell_exec('systemd-detect-virt')); + if ($hw == 'none') $hw = 'diy'; + $distrib = system::getDistrib() . ' ' . system::getOsVersion(); + $res = '
```
'; + $res .= 'OS : ' . $distrib . ' on ' . $hw; + $res .= ' - PHP : ' . phpversion(); + $res .= '
'; + $res .= 'Etat Clé Api Core : ' . config::byKey('api::core::mode'); + $res .= '
'; + $res .= 'Etat Clé Api Mobile : ' . config::byKey('api::mobile::mode') . '
```'; + $res .= '

'; + $res .= '[details="Equipement(s)"]
'; + $res .= '|Id | LogicalId | Type | App | defaultIdMobile | Profil | hideMenuGeoloc | hideMenuCustom|
'; + $res .= '|--- | --- | --- | --- | --- | --- | --- | ---|
'; + foreach (eqLogic::byType('mobile') as $mobile) { + $userId = $mobile->getConfiguration('affect_user'); + $userType = user::byId($userId); + $profil = 'Inconnu'; + if (is_object($userType)) { + $profil = $userType->getProfils(); + } + $res .= '|' . $mobile->getId() . ' | ' . $mobile->getLogicalId() . ' | ' . $mobile->getConfiguration('type_mobile') . ' | v' . $mobile->getConfiguration('appVersion', 1) . ' | ' . $mobile->getConfiguration('defaultIdMobile', 'none') . ' | ' . $profil . ' | ' . $mobile->getConfiguration('hideMenuGeoloc', 0) . ' | ' . $mobile->getConfiguration('hideMenuCustom', 0) . '|
'; + } + $res .= '[/details]'; + return $res; + } + + /** + * find eq based on iq + * + * @return string + */ public static function whoIsIq($iq) { $search = eqLogic::byLogicalId($iq, 'mobile'); if (is_object($search)) { return $search->getName(); } else { - return 'mobile non detecte'; + return 'Mobile not detected'; } } + /******************************************************/ + /******************** APP V1 *************************/ + /******************************************************/ + public static function pluginToSend() { $return = []; @@ -72,6 +154,7 @@ public static function pluginToSend() public static function makeTemplateJson() { + log::add(__CLASS__, 'debug', '┌──────────▶︎ makeTemplateJson ──────────────'); $pluginToSend = mobile::pluginToSend(); $discover_eqLogic = mobile::discovery_eqLogic($pluginToSend); $sync_new = mobile::change_cmdAndeqLogic(mobile::discovery_cmd($pluginToSend, $discover_eqLogic), $discover_eqLogic); @@ -97,11 +180,14 @@ public static function makeTemplateJson() unlink(dirname(__FILE__) . '/../../data/mobile.json'); } file_put_contents(dirname(__FILE__) . '/../../data/mobile.json', json_encode($data)); + log::add(__CLASS__, 'debug', '| mobile.json > ' . json_encode($data)); $event_cmd = array(); foreach ($data['cmds'] as $cmd) { $event_cmd[] = $cmd['id']; } cache::set('mobile::event', $event_cmd); + log::add(__CLASS__, 'debug', '| cache set mobile::event ─▶︎ ' . json_encode($event_cmd)); + log::add(__CLASS__, 'debug', '└───────────────────────────────────────────'); } public static function getTemplateJson() @@ -130,7 +216,7 @@ public static function makeSaveJson($mobileID, $_data = array(), $type = 'dashbo public static function getSaveJson($mobileID, $type = 'dashboard') { if (!file_exists(dirname(__FILE__) . '/../../data/' . $mobileID . '/' . $type . '.json')) { - self::makeSaveJson($mobileID, array() , $type); + self::makeSaveJson($mobileID, array(), $type); } return json_decode(file_get_contents(dirname(__FILE__) . '/../../data/' . $mobileID . '/' . $type . '.json'), true); } @@ -334,12 +420,12 @@ public static function change_cmdAndeqLogic($_cmds, $_eqLogics) $_cmds[$plage_cmd]['eqLogic_id'] = $new_eqLogic_id; $keys = array_keys(array_column($_cmds, 'eqLogic_id'), $eqLogic_id); foreach ($keys as $key) { - if ($_cmds[$key]['value'] == $_cmds[$plage_cmd]['id'] && $_cmds[$key]['type'] == 'action') { + if (isset($_cmds[$key]['value']) && $_cmds[$key]['value'] == $_cmds[$plage_cmd]['id'] && $_cmds[$key]['type'] == 'action') { $_cmds[$key]['eqLogic_id'] = $new_eqLogic_id; } } $eqLogic_array[] = array($eqLogic_id, $new_eqLogic_id, $eqLogic_name); - $i++; + //$i++; } $column_eqlogic = array_column($eqLogics, 'id'); foreach ($eqLogic_array as $eqlogic_array_one) { @@ -510,76 +596,26 @@ public static function delete_object_eqlogic_null($objects, $eqLogics) return $return; } - public function getQrCode() - { - require_once dirname(__FILE__) . '/../../3rdparty/phpqrcode/qrlib.php'; - $interne = network::getNetworkAccess('internal'); - $externe = network::getNetworkAccess('external'); - if ($interne == null || $interne == 'http://:80' || $interne == 'https://:80') { - return 'internalError'; - } - if ($externe == null || $externe == 'http://:80' || $externe == 'https://:80') { - return 'externalError'; - } - if ($this->getConfiguration('affect_user') == '') { - return 'UserError'; - } - $key = $this->getLogicalId(); - $request_qrcode = array( - 'eqLogic_id' => $this->getId(), - 'url_internal' => $interne, - 'url_external' => $externe, - 'Iq' => $key, - ); - if ($this->getConfiguration('affect_user') != '') { - $username = user::byId($this->getConfiguration('affect_user')); - if (is_object($username)) { - $request_qrcode['username'] = $username->getLogin(); - $request_qrcode['apikey'] = $username->getHash(); - } - } - ob_start(); - QRcode::png(json_encode($request_qrcode)); - $imageString = base64_encode(ob_get_contents()); - ob_end_clean(); - return $imageString; - } - + /************************************************************/ + /******************** APP V1 && V2 *************************/ + /************************************************************/ - public static function getQrCodeV2($userId) + /** + * get json for notification + * Call by class notification + * @return array + */ + public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version, $optionsNotif = [], $critical = false, $Iq = null, $specific = false, $silent = false) { - require_once dirname(__FILE__) . '/../../3rdparty/phpqrcode/qrlib.php'; - $interne = network::getNetworkAccess('internal'); - $externe = network::getNetworkAccess('external'); - if ($interne == null || $interne == 'http://:80' || $interne == 'https://:80') { - return 'internalError'; - } - if ($externe == null || $externe == 'http://:80' || $externe == 'https://:80') { - return 'externalError'; - } - if (!is_object(user::byId($userId))) { - return 'UserError'; - } - $request_qrcode = array( - 'url_internal' => $interne, - 'url_external' => $externe - ); - if (is_object($user = user::byId($userId))) { - $request_qrcode['username'] = $user->getLogin(); - $request_qrcode['apikey'] = $user->getHash(); - } - ob_start(); - QRcode::png(json_encode($request_qrcode)); - $imageString = base64_encode(ob_get_contents()); - ob_end_clean(); - return $imageString; - } + log::add('mobile', 'debug', '||┌──:fg-success: jsonPublish :/fg:──'); + if ($silent) log::add('mobile', 'debug', '||| Silent notification'); + if (isset($Iq)) log::add('mobile', 'debug', '||| IQ for jsonPublish ─▶︎ ' . $Iq); - - public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version, $optionsNotif = [], $critical = false) - { $dateNotif = date("Y-m-d H:i:s"); + $newDate = date("Y-m-d"); + $horaireFormat = date("H:i"); $badge = 0; + $defaultName = empty(config::byKey('name')) ? config::byKey('product_name') : config::byKey('name'); if ($timeout != 'nok') { $timeout = date('Y-m-d H:i:s', strtotime("$dateNotif + $timeout SECONDS")); } @@ -601,78 +637,44 @@ public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answ } else if ($os == 'microsoft') { } } else { - if ($os == 'android' && $version == 1) { - $android = [ - 'notification' => [ - 'title' => $titre, - 'body' => $message, - 'channel_id' => 'default', - 'color' => '#0000FF' - ] - ]; - - $data = [ - 'title' => $titre, - 'text' => $message, - 'idNotif' => strval($idNotif), - 'channelId' => 'default', - 'date' => $dateNotif - - ]; - - if ($photo != null) { - $notification = [ - 'title' => $titre, - 'body' => $message, - 'image' => $photo - ]; - } else { - $notification = [ - 'title' => $titre, - 'body' => $message - ]; - } - - $publish = [ - 'token' => $token, - 'notification' => $notification, - 'android' => $android, - 'data' => $data - ]; - } if ($version == 2) { - + //App V2 if ($addAsk != '') { $askParams = [ 'choices' => $answer, 'idVariable' => $optionsNotif['askVariable'], - 'boxName' => config::byKey('name'), + 'boxName' => $defaultName, 'hwKey' => jeedom::getHardwareKey(), 'timeout' => (strtotime($timeout) - time()) * 1000, 'isBack' => false ]; $askParams = json_encode($askParams); } else { - $askParams = 'noAsk'; $optionsNotif['askVariable'] = 'rien'; } $optionsNotif['askParams'] = $askParams; - $channelId = "default"; + $channelId = $specific ? "specificChannel" : "default"; if ($os == 'android' && $critical == true) { $channelId = "critical"; } - + $criticalString = ($critical == true) ? 'true' : 'false'; $customData = [ 'title' => $titre, 'body' => $message, 'idNotif' => strval($idNotif), 'channelId' => $channelId, 'date' => $dateNotif, - 'boxName' => config::byKey('name'), - 'boxApiKey' => jeedom::getHardwareKey() + 'critical' => $criticalString, + 'boxName' => $defaultName, + 'boxApiKey' => jeedom::getHardwareKey(), + "askParams" => $askParams, + 'textToDisplay' => 'none', + 'newDate' => $newDate, + 'horaireFormat' => $horaireFormat, + 'silent' => $silent ? 'true' : 'false' ]; $notification = [ @@ -689,14 +691,16 @@ public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answ $apns = [ 'headers' => [ - 'apns-priority' => '5', + 'apns-priority' => $silent ? '5' : '10', 'apns-collapse-id' => strval($idNotif), - 'apns-push-type' => 'alert', + 'apns-push-type' => $silent ? 'background' : 'alert', 'apns-topic' => 'com.jeedom.jeedomobile' ], 'payload' => [ - 'aps' => [ + 'aps' => array_merge([ 'content-available' => true, + ], $silent ? [] : [ + 'mutable-content' => 1, 'sound' => [ 'name' => 'default', 'critical' => $critical @@ -706,23 +710,20 @@ public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answ 'title' => $titre, 'body' => $message ] - ], + ]), 'notifee_options' => [ - 'ios' => [ - 'sound' => 'default', + 'ios' => array_merge([ 'critical' => $critical, 'foregroundPresentationOptions' => [ - 'alert' => true, - 'badge' => true, - 'sound' => true + 'alert' => $silent ? false : true, + 'badge' => !$silent, + 'sound' => !$silent ] - ] + ], $silent ? [] : ['sound' => 'default']) ] ] - ]; - if ($photo != null) { $data['image'] = $photo; $apns['payload']['notifee_options']['image'] = $photo; @@ -737,7 +738,7 @@ public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answ if ($os == 'android') { $publish = [ 'token' => $token, - 'android' => $android, + 'android' => $channelId == 'specificChannel' ? ['priority' => 'high'] : $android, 'data' => $data, ]; } else { @@ -747,26 +748,109 @@ public static function jsonPublish($os, $titre, $message, $type, $idNotif, $answ 'apns' => $apns ]; } + + $publishJson = [ + 'token' => $token, + 'data' => $data, + ]; + + if (isset($Iq) && !$specific) { + // SAVE NOTIFS IN FILE + $pathNotificationData = '/../data/notifications'; + if (!is_dir(dirname(__FILE__) . $pathNotificationData)) { + mkdir(dirname(__FILE__) . $pathNotificationData, 0775, true); + } + $filePath = dirname(__FILE__) . $pathNotificationData . '/' . $Iq . '.json'; + + if (!file_exists($filePath)) { + file_put_contents($filePath, ''); + } + $notificationsContent = file_get_contents($filePath); + $notifications = json_decode($notificationsContent, true); + + if ($notifications === null) { + $notifications = array(); + } + + foreach ($notifications as &$notification) { + if (isset($notification['data']['askParams'])) { + $askParams = json_decode($notification['data']['askParams'], true); + if ($askParams !== null && isset($askParams['timeout'])) { + $askParams['timeout'] = 0; + $notification['data']['askParams'] = json_encode($askParams); + } + } + } + $notifications[$idNotif] = $publishJson; + log::add('mobile', 'debug', '||| [INFO] Notification logged ─▶︎ ' . json_encode($notifications)); + file_put_contents($filePath, json_encode($notifications)); + } + } else { + // APP V1 + if ($os == 'android' && $version == 1) { + $android = [ + 'notification' => [ + 'title' => $titre, + 'body' => $message, + 'channel_id' => 'default', + 'color' => '#0000FF' + ] + ]; + + $data = [ + 'title' => $titre, + 'text' => $message, + 'idNotif' => strval($idNotif), + 'channelId' => 'default', + 'date' => $dateNotif + ]; + + if ($photo != null) { + $notification = [ + 'title' => $titre, + 'body' => $message, + 'image' => $photo + ]; + } else { + $notification = [ + 'title' => $titre, + 'body' => $message + ]; + } + + $publish = [ + 'token' => $token, + 'notification' => $notification, + 'android' => $android, + 'data' => $data + ]; + } } } - log::add('mobile', 'debug', 'JSON publish > : ' . json_encode($publish)); + log::add('mobile', 'debug', '||| [INFO] JSON publish ─▶︎ ' . json_encode($publish)); + log::add('mobile', 'debug', '||└─────────────────'); return $publish; } - public static function notification($arn, $os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version = 1, $optionsNotif = [], $critical = false) + /** + * send notification to app + * Call by class execute + * @return array + */ + public static function notification($arn, $os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version = 1, $optionsNotif = [], $critical = false, $Iq = null, $specific = false, $silent = false) { - log::add('mobile', 'debug', 'notification en cours !'); - $publish = mobile::jsonPublish($os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version, $optionsNotif, $critical); - log::add('mobile', 'debug', 'JSON publish > : ' . json_encode($publish)); + log::add('mobile', 'debug', '|┌──:fg-success: notification :/fg:──'); + //if ($version == 2) { + $publish = mobile::jsonPublish($os, $titre, $message, $type, $idNotif, $answer, $timeout, $token, $photo, $version, $optionsNotif, $critical, $Iq, $specific, $silent); if ($token != null) { if ($token == 'notifsBGDisabled') { - log::add('mobile', 'debug', 'NOTIFICATION NON ENVOYEE : SERVICES NOTIF DESACTIVE SUR VOTRE TELEPHONE : '); - message::add(__CLASS__, 'Échec de l\'envoie de notification : le service est désactivé dans les paramètres du téléphone', 'notifsbgSend', 'alertNotifsSend'); + log::add('mobile', 'debug', '|| [ERROR] NOTIFICATION NOT SENT ─▶︎ The notification service is disabled on the phone.'); + message::add(__CLASS__, __('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . __('le service est désactivé dans les paramètres du téléphone', __FILE__), 'notifsbgSend', 'alertNotifsSend'); return; } if ($token == 'desactivate') { - log::add('mobile', 'debug', 'NOTIFICATION NON ENVOYEE : VOUS AVEZ DESACTIVE LES NOTIFICATIONS SUR L\'APP : '); - message::add(__CLASS__, 'Échec de l\'envoie de notification : le service est désactivé dans les paramètres de l\'application', 'notifsbgSend', 'alertNotifsSend'); + log::add('mobile', 'debug', '|| [ERROR] NOTIFICATION NOT SENT ─▶︎ The notification service is disabled on the application.'); + message::add(__CLASS__, __('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . __('le service est désactivé dans les paramètres de l\'application', __FILE__), 'notifsbgSend', 'alertNotifsSend'); return; } $url = config::byKey('service::cloud::url', 'core', 'https://cloud.jeedom.com') . '/service/fcm'; @@ -778,14 +862,13 @@ public static function notification($arn, $os, $titre, $message, $type, $idNotif ]; $post = ['message' => $publish, 'options' => $options]; - log::add('mobile', 'debug', 'JSON envoyé en mode FCM : ' . json_encode($post)); + log::add('mobile', 'debug', '|| [INFO] JSON sent in FCM mode ─▶︎ ' . json_encode($post)); } elseif ($token == null && $version == 2) { - log::add('mobile', 'debug', 'NOTIFICATION NON ENVOYEE : PAS DE TOKEN ENREGISTRE SUR VOTRE TELEPHONE : '); - //message::removeAll(__CLASS__, 'noValidToken'); - message::add(__CLASS__, 'NOTIFICATION NON ENVOYÉE : PAS DE TOKEN ENREGISTRE SUR LE TÉLÉPHONE :', 'noValidTok', 'noValidToken'); + log::add('mobile', 'debug', '|| [ERROR] NOTIFICATION NOT SENT ─▶︎ No token registered on the phone'); + message::add(__CLASS__, __('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . __('pas de token enregistré sur le téléphone', __FILE__), 'noValidTok', 'noValidToken'); return; } else { - log::add('mobile', 'debug', 'JSON envoyé : APN' . $publish); + log::add('mobile', 'debug', '|| [INFO] JSON sent in APN mode ─▶︎ ' . $publish); $post = [ 'arn' => $arn, 'text' => $publish, @@ -798,534 +881,896 @@ public static function notification($arn, $os, $titre, $message, $type, $idNotif 'Content-Type: application/json', 'Autorization: ' . sha512(strtolower(config::byKey('market::username')) . ':' . config::byKey('market::password')) )); + //$request_http->setLogError(true); $request_http->setPost(json_encode($post)); - $result = json_decode($request_http->exec(3, 5), true); + $result = json_decode($request_http->exec(30, 3), true); if (!isset($result['state']) || $result['state'] != 'ok') { - throw new Exception(__('Echec de l\'envoi de la notification :', __FILE__) . json_encode($result)); + log::add('mobile', 'debug', '|| [WARNING] First attempt to send notification failed.'); + log::add('mobile', 'debug', '|| New attempt ....'); + sleep(rand(1, 10)); + $result = json_decode($request_http->exec(30, 3), true); } + if (!isset($result['state']) || $result['state'] != 'ok') { + if (isset($result['error']) && strpos($result['error'], 'Quotas exceeded') !== false) { + log::add('mobile', 'error', __("Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.", __FILE__)); + log::add('mobile', 'debug', __('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . json_encode($result)); + } else { + throw new Exception(__('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . json_encode($result)); + } + } + //} else { + //log::add('mobile', 'error', __('Echec de l\'envoi de la notification', __FILE__) . ' ─▶︎ ' . __('la version 1 de l\'app n\'est plus prise en charge', __FILE__)); + //} + log::add('mobile', 'debug', '|└─────────────────────────────'); } - public function SaveGeoloc($geoloc) + /*****************************************************/ + /******************** APP V2 *************************/ + /*****************************************************/ + + /** + * Get all notifications from Iq + * Call by ajax getNotificationsV2 + * @return array + */ + public static function getNotificationsV2($Iq) { - log::add('mobile', 'debug', '|-----------------------------------'); - log::add('mobile', 'debug', '|--debut de la fonction SaveGeoLoc--'); - log::add('mobile', 'debug', '|-----------------------------------'); - log::add('mobile', 'debug', '|'); - $eqLogicMobile = eqLogic::byLogicalId($geoloc['Iq'], 'mobile'); - log::add('mobile', 'debug', '| Iq = ' . $geoloc['Iq']); - if (is_object($eqLogicMobile)) { - log::add('mobile', 'debug', '| Mobile bien trouvé dans cette Jeedom'); - log::add('mobile', 'debug', '| Objet > ' . $eqLogicMobile->getId()); - $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoId_' . $geoloc['id']); - if (!is_object($cmdgeoloc)) { - $cmdgeoloc = new mobileCmd(); - $cmdgeoloc->setLogicalId('geoId_' . $geoloc['id']); - $cmdgeoloc->setEqLogic_id($eqLogicMobile->getId()); - $cmdgeoloc->setType('info'); - $cmdgeoloc->setSubType('binary'); - $cmdgeoloc->setGeneric_type('PRESENCE'); - $cmdgeoloc->setIsVisible(1); - } - $cmdgeoloc->setName(__($geoloc['id'] . '-' . $geoloc['name'], __FILE__)); - $cmdgeoloc->setConfiguration('latitude', $geoloc['latitude']); - $cmdgeoloc->setConfiguration('longitude', $geoloc['longitude']); - $cmdgeoloc->setConfiguration('subtitle', $geoloc['subtitle']); - $cmdgeoloc->setConfiguration('radius', $geoloc['radius']); - $cmdgeoloc->save(); - $cmdgeoloc->event($geoloc['value']); + $return = __('Aucune notification.', __FILE__); + $filePath = dirname(__FILE__) . '/../data/notifications/' . $Iq . '.json'; + if (file_exists($filePath)) { + $notifs = json_decode(file_get_contents($filePath), true); + if (is_array($notifs) && count($notifs) > 0) $return = json_encode(array_reverse($notifs)); } + return $return; } + /** + * remove notification from Id into filepath id + * Call by ajax removeNotificationV2 + */ + public static function removeNotificationV2($_iq, $_id) + { + $pathNotificationData = '/../data/notifications'; + $filePath = dirname(__FILE__) . $pathNotificationData . '/' . $_iq . '.json'; + if (file_exists($filePath)) { + $notificationsContent = file_get_contents($filePath); + $notifications = json_decode($notificationsContent, true); + if ($notifications === null) { + throw new Exception(__('Fichier de notification vide.', __FILE__)); + } + if (isset($notifications[$_id])) { + unset($notifications[$_id]); + file_put_contents($filePath, json_encode($notifications)); + return count($notifications); + } else { + throw new Exception(__('Id notification inexistant', __FILE__) . ' ─▶︎ ' . $_id); + } + } else { + throw new Exception(__('Fichier de notifications inexistant', __FILE__) . ' ─▶︎ ' . $filePath); + } + } + /** + * Create and update cmd geoloc + * Call By api : setConfigs + */ public static function createCmdGeoLocV2($Iq, $geolocs) { - log::add('mobile', 'debug', '|-----------------------------------'); - log::add('mobile', 'debug', '|-GeoLocV2--'); + log::add('mobile', 'debug', '|┌──:fg-success: createCmdGeoLocV2 :/fg:──'); $mobile = eqLogic::byLogicalId($Iq, 'mobile'); if (is_object($mobile)) { - log::add('mobile', 'debug', '| Mobile existant'); - log::add('mobile', 'debug', '| GEOLOCS > ' . $geolocs); - - $noExistCmd = 0; + log::add('mobile', 'debug', '|| OK Mobile found ─▶︎ ' . $mobile->getName()); + log::add('mobile', 'debug', '|| [INFO] GEOLOCS ─▶︎ ' . $geolocs); + $order = count($mobile->getCmd()); $decodedGeolocs = json_decode($geolocs, true); foreach ($decodedGeolocs as $index => $geoloc) { - log::add('mobile', 'debug', '| index > ' . $index . ' / ' . $geoloc['name']); - $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoloc_' . $index); - if (!is_object($cmdgeoloc)) { - $noExistCmd = 1; - $cmdgeoloc = new mobileCmd(); - $cmdgeoloc->setLogicalId('geoloc_' . $index); - $cmdgeoloc->setEqLogic_id($mobile->getId()); - $cmdgeoloc->setType('info'); - $cmdgeoloc->setSubType('binary'); - $cmdgeoloc->setIsVisible(1); - $cmdgeoloc->setGeneric_type('PRESENCE'); - $cmdgeoloc->setIsHistorized(1); + if (!isset($geoloc['name'])) continue; + $logicalId = 'geoloc_' . $index; + log::add('mobile', 'debug', '|| ' . $logicalId . ' ─▶︎ ' . $geoloc['name'] . ' ─▶︎ ' . $geoloc['value']); + $cmd = cmd::byEqLogicIdAndLogicalId($mobile->getId(), 'geoloc_' . $index); + if (!is_object($cmd)) { + if (!preg_match('/^geoloc_\d+$/', $logicalId)) { + foreach ($mobile->getCmd() as $existing) { + if ( + preg_match('/^geoloc_\d+$/', $existing->getLogicalId()) + && $existing->getName() === $geoloc['name'] + ) { + log::add('mobile', 'debug', '|| ↳ Migrate UUID ─▶︎ renaming ' . $existing->getLogicalId() . ' to ' . $logicalId); + $existing->setLogicalId($logicalId); + $existing->save(); + $cmd = $existing; + break; + } + } + } } - $cmdgeoloc->setName($geoloc['name']); - $cmdgeoloc->setConfiguration('latitude', $geoloc['latitude']); - $cmdgeoloc->setConfiguration('longitude', $geoloc['longitude']); - $cmdgeoloc->setConfiguration('radius', $geoloc['radius']); - $cmdgeoloc->save(); - if ($noExistCmd == 1) { - $cmdgeoloc->event($geoloc['value']); - log::add('mobile', 'debug', '| valeur enregistrée > ' . $geoloc['value']); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setLogicalId($logicalId); + $cmd->setEqLogic_id($mobile->getId()); + $cmd->setIsVisible(1); + $cmd->setGeneric_type('PRESENCE'); + $cmd->setTemplate('dashboard', 'core::presence'); + $cmd->setTemplate('mobile', 'core::presence'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setIsHistorized(1); + $cmd->setOrder($order); + $order++; + log::add('mobile', 'debug', '|| ↳ Adding geofence point ─▶︎ ' . $geoloc['name']); + } + $cmd->setName($geoloc['name']); + $cmd->setType('info'); + $cmd->setSubType('binary'); + $cmd->setConfiguration('latitude', $geoloc['latitude']); + $cmd->setConfiguration('longitude', $geoloc['longitude']); + $cmd->setConfiguration('radius', $geoloc['radius']); + if ($cmd->getChanged() === true) $cmd->save(); + if ($mobile->checkAndUpdateCmd($logicalId, $geoloc['value'])) { + log::add('mobile', 'debug', '|| ↳ Update geofence point ─▶︎ ' . $geoloc['value']); } - $noExistCmd = 0; } - log::add('mobile', 'debug', '|-----------------------------------'); } else { - log::add('mobile', 'debug', 'Mobile inexistant'); + log::add('mobile', 'debug', '| [WARNING] Mobile not detected !'); } + log::add('mobile', 'debug', '|└──────────────'); } - public function delGeoloc($geoloc) + /** + * Get menu default whitout "tab" + * @return array + */ + public static function getMenuDefaultV2($nbIcones = 3) { - log::add('mobile', 'debug', 'Geoloc lancement DEL du mobile > ' . $geoloc['Iq'] . ' pour ' . $geoloc['id']); - $eqLogicMobile = eqLogic::byLogicalId($geoloc['Iq'], 'mobile'); - $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoId_' . $geoloc['id']); - if (isset($cmdgeoloc)) { - $cmdgeoloc->remove(); + $namesMenus = ['home', 'overview', 'health', 'home', 'home', 'home', 'home', 'home']; + $renamesIcons = ['Accueil', 'Synthese', 'Santé', 'Accueil', 'Accueil', 'Accueil', 'Accueil', 'Accueil']; + $spanIcons = ['icon jeedomapp-in', 'fab fa-hubspot', 'fas fa-medkit', 'icon jeedomapp-in', 'icon jeedomapp-in', 'icon jeedomapp-in', 'icon jeedomapp-in', 'icon jeedomapp-in']; + $urlUsers = ['none', 'none', 'none', 'none', 'none', 'none', 'none', 'none']; + $j = 0; + $menuCustomArray = []; + for ($i = 1; $i <= $nbIcones; $i++) { + $menuCustomArray[$i]['selectNameMenu'] = $namesMenus[$j]; + $menuCustomArray[$i]['renameIcon'] = $renamesIcons[$j]; + $menuCustomArray[$i]['spanIcon'] = $spanIcons[$j]; + $menuCustomArray[$i]['urlUser'] = $urlUsers[$j]; + $j++; } + return $menuCustomArray; } - public function EventGeoloc($geoloc) + /** + * Get menu default with "tab" + * @return array + */ + public static function getMenuDefaultTab() { - log::add('mobile', 'debug', 'Geoloc Event du mobile > ' . $geoloc['Iq'] . ' pour ' . $geoloc['id']); - $eqLogicMobile = eqLogic::byLogicalId($geoloc['Iq'], 'mobile'); - $cmdgeoloc = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoId_' . $geoloc['id']); - $cmdgeolocv2 = cmd::byEqLogicIdAndLogicalId($eqLogicMobile->getId(), 'geoloc_' . $geoloc['id']); - if (is_object($cmdgeoloc)) { - log::add('mobile', 'debug', 'commande trouvé'); - if ($geoloc['value'] !== $cmdgeoloc->execCmd()) { - log::add('mobile', 'debug', 'Valeur non pareille.'); - $cmdgeoloc->event($geoloc['value']); - } else { - log::add('mobile', 'debug', 'Valeur pareille. >' . $geoloc['value'] . ' / ' . $cmdgeoloc->execCmd()); - } - } - if (is_object($cmdgeolocv2)) { - log::add('mobile', 'debug', 'commande trouvé'); - if ($geoloc['value'] !== $cmdgeolocv2->execCmd()) { - log::add('mobile', 'debug', 'Valeur non pareille.'); - $cmdgeolocv2->event($geoloc['value']); - } else { - log::add('mobile', 'debug', 'Valeur pareille. >' . $geoloc['value'] . ' / ' . $cmdgeolocv2->execCmd()); + $defaultMenuJson = '{"tab0":{"active":true,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&p=home"},"type":"WebviewApp"}, + "tab1":{"active":true,"icon":{"name":"hubspot","type":"fa"},"name":"Synthese","options":{"uri":"\/index.php?v=m&p=overview"},"type":"WebviewApp"}, + "tab2":{"active":true"icon":{"name":"medkit","type":"fa"},"name":"Sant\u00e9","options":{"uri":"\/index.php?v=m&p=health"},"type":"WebviewApp"}, + "tab3":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}, + "tab4":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}, + "tab5":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}, + "tab6":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}, + "tab7":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&app_mode=1"},"type":"WebviewApp"}}'; + return json_encode($defaultMenuJson); + } + + /** + * menu assignment + * Call by ajax menuDefault for modal.menuCustom + */ + public static function handleMenuDefaultBySelect($eqId, $eqDefault) + { + if (!is_object($mobile = eqLogic::byId($eqId, 'mobile'))) return; + log::add('mobile', 'debug', '┌──:fg-success: handleMenuDefaultBySelect( ' . $eqId . ', ' . $eqDefault . ') :/fg:──'); + // ATTRIBUTION D'UN MENU AU MOBILE + if ($eqDefault == 'default') { //reset menuCustom + log::add('mobile', 'debug', '| source menu ─▶︎ default'); + $menuCustomArray = mobile::getMenuDefaultV2(); + $mobile->setConfiguration('menuCustomArray', $menuCustomArray); + $mobile->setConfiguration('nbIcones', 3); + $mobile->setConfiguration('defaultIdMobile', 'default'); + $mobile->save(); + } else if (is_object($mobileDefault = eqLogic::byId($eqDefault, 'mobile'))) { + // ATTRIBUTION DU MENU DUN AUTRE MOBILE + log::add('mobile', 'debug', '| source menu ─▶︎ ' . $mobileDefault->getHumanName()); + $mobile->setConfiguration('defaultIdMobile', $eqDefault); + if ($mobile->getId() == $mobileDefault->getId()) { + log::add('mobile', 'debug', '| same source and target'); } + $nbIcones = $mobileDefault->getConfiguration('nbIcones', 3); + $menuCustomArray = $mobileDefault->getConfiguration('menuCustomArray'); + $mobile->setConfiguration('nbIcones', $nbIcones); + $mobile->setConfiguration('menuCustomArray', $menuCustomArray); + $mobile->save(); } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); } - public function postInsert() + /** + * Call by configMenuCustom() + * @return array + */ + public static function generateTabIcon($menuCustomArray, $i) { - if ($this->getLogicalId() == '') { - $key = config::genKey(32); - $this->setLogicalId($key); - $this->save(); + $result = array(); + $tabIconName = isset($menuCustomArray[$i]['spanIcon']) ? $menuCustomArray[$i]['spanIcon'] : 'none'; + + if ($tabIconName != 'none') { + $arrayIcon = explode(' ', $tabIconName); + $tabIconName = substr(strstr($arrayIcon[1], '-'), 1); + $tabLibName = strstr($arrayIcon[1], '-', true); + if ($tabLibName == 'mdi') $tabLibName = 'Mdi'; + } else { + $tabIconName = 'in'; + $tabLibName = 'jeedomapp'; } + + $tabRenameInput = (isset($menuCustomArray[$i]['renameIcon']) && $menuCustomArray[$i]['renameIcon'] != 'none') ? $menuCustomArray[$i]['renameIcon'] : 'Accueil'; + $result['tabIconName'] = $tabIconName; + $result['tabLibName'] = $tabLibName; + $result['tabRenameInput'] = $tabRenameInput; + + return $result; } - public static function deleteFileImg() + /** + * Call by configMenuCustom() + * @return array + */ + public static function generateTypeObject($pluginPanelMobile, $menuCustomArray) { - $directory = dirname(__FILE__) . '/../../data/images'; // Chemin vers le répertoire contenant les fichiers - // Récupérer la liste des fichiers dans le répertoire - $files = glob($directory . '/*'); - // Date actuelle - $currentDate = time(); - // Parcourir tous les fichiers - foreach ($files as $file) { - // Vérifier la date de modification du fichier - $modifiedDate = filemtime($file); - $differenceInDays = floor(($currentDate - $modifiedDate) / (60 * 60 * 24)); - // Vérifier si le fichier a plus de 30 jours - if ($differenceInDays > 30) { - // Supprimer le fichier - unlink($file); + $webviewUrl = 'd'; + $objectId = isset($menuCustomArray['selectNameMenu']) ? $menuCustomArray['selectNameMenu'] : ''; + $result = array(); + if ($objectId && $objectId != -1 && $objectId != 'none' && $objectId != 'url') { + // SPECIFIC OBJETS FOR URL + $excludedRefs = array('overview', 'health', 'home', 'timeline'); + if (!in_array($objectId, $excludedRefs)) { + $arrayObjects = explode('_', $objectId); + $objectId = $arrayObjects[0]; + $typeObject = $arrayObjects[1]; + $typewebviewurl = $webviewUrl; + $typeobjectId = $objectId; + + switch ($typeObject) { + case 'views': + $tabUrl = "/index.php?v={$webviewUrl}&p=view&view_id={$objectId}"; + break; + case 'dashboard': + $tabUrl = "/index.php?v={$webviewUrl}&p=dashboard&object_id={$objectId}"; + break; + case 'plan': + $tabUrl = "/index.php?v={$webviewUrl}&p=plan&fullscreen=1&plan_id={$objectId}"; + break; + case 'panel': + $tabUrl = (isset($pluginPanelMobile[$objectId]) && $pluginPanelMobile[$objectId] == $objectId) ? "/index.php?v=m&p={$objectId}" : "/index.php?v=m&p={$objectId}&app_mode=1"; + break; + default: + break; + } + } else { + $typeObject = $objectId; + $typewebviewurl = $webviewUrl; + $typeobjectId = ''; + + switch ($objectId) { + case 'overview': + $tabUrl = "/index.php?v=m&p=overview"; + break; + case 'home': + $tabUrl = "/index.php?v=m&p=home"; + break; + case 'health': + $tabUrl = "/index.php?v=m&p=health"; + break; + case 'timeline': + $tabUrl = "/index.php?v=m&p=timeline"; + break; + default: + $typeObject = $objectId; + $typewebviewurl = 'm'; + $typeobjectId = ''; + $tabUrl = '/index.php?v=m&app_mode=1'; + break; + } } + } elseif ($objectId == 'url') { + $typeObject = $objectId; + $typewebviewurl = $webviewUrl; + $typeobjectId = 'url'; + $tabUrl = $menuCustomArray['urlUser']; + } else { + $typeObject = $objectId; + $typewebviewurl = 'm'; + $typeobjectId = ''; + $tabUrl = '/index.php?v=m&app_mode=1'; } - } + $result['typeObject'] = $typeObject; + $result['typewebviewurl'] = $typewebviewurl; + $result['typeobjectId'] = $typeobjectId; + $result['tabUrl'] = $tabUrl; + + return $result; + } - public static function handleDefaultMenu($mobileActiveDefault){ - - $mobileActive = eqLogic::byId(intval($mobileActiveDefault)); - if (is_object($mobileActive)) { - $eqlogics = eqLogic::byType('mobile'); - $nbIcons = $mobileActive->getConfiguration('nbIcones', 4); - $menuCustomArray = $mobileActive->getConfiguration('menuCustomArray'); - foreach ($eqlogics as $eqlogic) { - $menuArrayTemp = []; - for ($i = 1; $i < 5; $i++) { - $menuArrayTemp[$i]['selectNameMenu'] = $menuCustomArray[$i]['selectNameMenu']; - $menuArrayTemp[$i]['renameIcon'] = $menuCustomArray[$i]['renameIcon']; - $menuArrayTemp[$i]['spanIcon'] = $menuCustomArray[$i]['spanIcon']; - $menuArrayTemp[$i]['urlUser'] = $menuCustomArray[$i]['urlUser']; + /** + * Create and update cmd + * Call by Api : nfc && qrcodemethod + */ + public static function cmdForApi($Iq, $logicalId, $value, $name = "", $subtype = "string", $_visible = 0) + { + $mobile = eqLogic::byLogicalId($Iq, 'mobile'); + if (is_object($mobile)) { + $order = count($mobile->getCmd()); + $cmd = $mobile->getCmd(null, $logicalId); + if (!is_object($cmd)) { + if ($name == "") { + $name = $logicalId; + } + $cmd = new mobileCmd(); + $cmd->setLogicalId($logicalId); + $cmd->setName($name); + $cmd->setOrder($order); + $cmd->setDisplay('icon', ''); + $cmd->setIsVisible($_visible); + if (in_array($logicalId, array('barrecodemethod', 'nfcPayload', 'nfcId'))) { + $cmd->setConfiguration('repeatEventManagement', 'always'); } - $eqlogic->setConfiguration('menuCustomArray', $menuArrayTemp); - $eqlogic->setConfiguration('nbIcones', $nbIcons); - $eqlogic->save(); } + $cmd->setEqLogic_id($mobile->getId()); + $cmd->setType('info'); + $cmd->setSubType($subtype); + if ($cmd->getChanged() === true) $cmd->save(); + $mobile->checkAndUpdateCmd($logicalId, $value); } } + /* * *********************Méthodes d'instance************************* */ - public static function handleMenuDefaultBySelect($eqId, $eqDefault){ - - if(!is_object($mobileDefault = eqLogic::byId($eqDefault, 'mobile'))) return; - if(!is_object($mobile = eqLogic::byId($eqId, 'mobile'))) return; - $namesMenus = ['home', 'overview', 'health', 'home']; - $renamesIcons = ['Accueil', 'Synthese', 'Santé', 'Accueil']; - $spanIcons = ['icon jeedomapp-in', 'fab fa-hubspot', 'fas fa-medkit', 'icon jeedomapp-in']; - $urlUsers = ['none', 'none', 'none', 'none']; - - // ATTRIBUTION DUN MENU PAR DEFAULT AU MOBILE - if ($eqDefault == 'default') { - $j = 0; - $menuCustomArray = []; - for ($i = 1; $i < 5; $i++) { - $menuCustomArray[$i]['selectNameMenu'] = $namesMenus[$j]; - $menuCustomArray[$i]['renameIcon'] = $renamesIcons[$j]; - $menuCustomArray[$i]['spanIcon'] = $spanIcons[$j]; - $menuCustomArray[$i]['urlUser'] = $urlUsers[$j]; - $j++; - } + /** + * Call by Api : getJson && getCustomMenu + * + * @return array + */ + public function configMenuCustom() + { + log::add('mobile', 'debug', '|┌──:fg-success: configMenuCustom (' . jeedom::version() . ') :/fg:──'); + $menuCustomArray = mobile::getMenuDefaultV2(); + $pluginPanelMobile = config::byKey('pluginPanelMobile', 'mobile'); + $defaultIdMobile = $this->getConfiguration('defaultIdMobile'); + + if ($defaultIdMobile == 'default') { + log::add('mobile', 'debug', '|| [WARNING] Send default menu'); + $this->setConfiguration('menuCustomArray', $menuCustomArray); + $this->save(); + } else if (is_object($eqDefault = eqLogic::byId($defaultIdMobile)) && $this->getId() != $defaultIdMobile) { + log::add('mobile', 'debug', '|| [WARNING] source menu ─▶︎ ' . $eqDefault->getHumanName()); + $menuCustomArray = $eqDefault->getConfiguration('menuCustomArray'); + $this->setConfiguration('menuCustomArray', $menuCustomArray); + $this->save(); + } else { + log::add('mobile', 'debug', '|| [INFO] source menu ─▶︎ ' . $this->getHumanName()); + $menuCustomArray = $this->getConfiguration('menuCustomArray'); + } + if (empty($menuCustomArray)) { + $menuCustomArray = mobile::getMenuDefaultV2(); + } + $nbIcones = count($menuCustomArray); + // ATTRIBUTION MOBILE PAR DEFAUT A TOUS LES MOBILES + $eqLogics = eqLogic::byType('mobile'); + foreach ($eqLogics as $mobile) { + if ($mobile->getConfiguration('defaultIdMobile') == $this->getId()) { $mobile->setConfiguration('menuCustomArray', $menuCustomArray); - $mobile->setConfiguration('nbIcones', 3); - $mobile->setConfiguration('defaultIdMobile', 'default'); + $mobile->setConfiguration('nbIcones', $nbIcones); $mobile->save(); - return; + }; } - // ATTRIBUTION DU MENU PAR DEFAULT DU MOBILE DEFAULT AU MOBILE - $mobile->setConfiguration('defaultIdMobile', $eqDefault); - $nbIcones = $mobileDefault->getConfiguration('nbIcones', 3); - $selectNameMenu = $renameIcon = $spanIcon = $urlUser = $menuTemp = []; - $menuCustomArray = $mobileDefault->getConfiguration('menuCustomArray'); - $j = 0; - for ($i = 1; $i < $nbIcones + 1; $i++) { - $menuTemp[$i]['selectNameMenu'] = isset($menuCustomArray[$i]['selectNameMenu']) ? $menuCustomArray[$i]['selectNameMenu'] : $namesMenus[$j]; - $menuTemp[$i]['renameIcon'] = isset($menuCustomArray[$i]['renameIcon']) ? $menuCustomArray[$i]['renameIcon'] : $renamesIcons[$j]; - $menuTemp[$i]['spanIcon'] = isset($menuCustomArray[$i]['spanIcon']) ? $menuCustomArray[$i]['spanIcon'] : $spanIcons[$j]; - $menuTemp[$i]['urlUser'] = isset($menuCustomArray[$i]['urlUser']) ? $menuCustomArray[$i]['urlUser'] : $urlUsers[$j]; - $j++; + $arrayElements = array(); + $j = 0; + $count = 1; + for ($i = 1; $i < 9; $i++) { + + // GENERATE TAB ICON LIBRARY AND RENAME BY USER + $resultTabIcon = self::generateTabIcon($menuCustomArray, $i); + $tabIconName = $resultTabIcon['tabIconName']; + $tabLibName = $resultTabIcon['tabLibName']; + $tabRenameInput = $resultTabIcon['tabRenameInput']; + $isActive = true; + // GENERATE URLS FOR MENU CUSTOM + $result = self::generateTypeObject($pluginPanelMobile, isset($menuCustomArray[$i]) ? $menuCustomArray[$i] : ''); + $typeObject = $result['typeObject']; + $typewebviewurl = $result['typewebviewurl']; + $typeobjectId = $result['typeobjectId']; + $tabUrl = $result['tabUrl']; + + if ($count > intval($nbIcones)) { + $isActive = false; } - $mobile->setConfiguration('nbIcones', $nbIcones); - $mobile->setConfiguration('menuCustomArray', $menuTemp); - $mobile->save(); + + $jsonTemplate = array( + 'active' => $isActive, + 'icon' => [ + 'name' => $tabIconName, + 'type' => $tabLibName + ], + 'name' => $tabRenameInput, + 'options' => [ + 'uri' => $tabUrl, + 'objectType' => $typeObject, + 'mobile' => $typewebviewurl, + 'objectId' => $typeobjectId + ], + 'type' => strpos($tabUrl, 'www') !== false ? 'urlwww' : 'WebviewApp' + ); + $arrayElements['tab' . $j] = $jsonTemplate; + $j++; + $count++; + } + log::add('mobile', 'debug', '|| [INFO] arrayElements ─▶︎ ' . json_encode($arrayElements)); + log::add('mobile', 'debug', '|└────────────────────'); + return $arrayElements; } + /** + * get QrCode base64 for a user + * use lib phpqrcode + * Call by ajax getQrCode for printEqLogic + * @return string + */ + public function getQrCode() + { + require_once dirname(__FILE__) . '/../../3rdparty/phpqrcode/qrlib.php'; + $interne = network::getNetworkAccess('internal'); + $externe = network::getNetworkAccess('external'); + if ($interne == null || $interne == 'http://:80' || $interne == 'https://:80') { + return 'internalError'; + } + if ($externe == null || $externe == 'http://:80' || $externe == 'https://:80') { + return 'externalError'; + } + if ($this->getConfiguration('affect_user') == '') { + return 'UserError'; + } + $key = $this->getLogicalId(); + $request_qrcode = array( + 'eqLogic_id' => $this->getId(), + 'url_internal' => $interne, + 'url_external' => $externe, + 'Iq' => $key, + ); + if ($this->getConfiguration('affect_user') != '') { + $username = user::byId($this->getConfiguration('affect_user')); + if (is_object($username)) { + $request_qrcode['username'] = $username->getLogin(); + $request_qrcode['apikey'] = $username->getHash(); + } + } + ob_start(); + QRcode::png(json_encode($request_qrcode)); + $imageString = base64_encode(ob_get_contents()); + ob_end_clean(); + return $imageString; + } - public static function configMenuCustom($eqId, $jeedomVersion){ + /** + * get QrCode base64 for a user + * use lib phpqrcode + * Call by ajax getQrCodeV2 for modal.qrcodev2 + * @return string + */ + public static function getQrCodeV2($userId) + { + require_once dirname(__FILE__) . '/../../3rdparty/phpqrcode/qrlib.php'; + $interne = network::getNetworkAccess('internal'); + $externe = network::getNetworkAccess('external'); + if ($interne == null || $interne == 'http://:80' || $interne == 'https://:80') { + return 'internalError'; + } + if ($externe == null || $externe == 'http://:80' || $externe == 'https://:80') { + return 'externalError'; + } + if (!is_object(user::byId($userId))) { + return 'UserError'; + } + $request_qrcode = array( + 'url_internal' => $interne, + 'url_external' => $externe + ); + if (is_object($user = user::byId($userId))) { + $request_qrcode['username'] = $user->getLogin(); + $request_qrcode['apikey'] = $user->getHash(); + } + ob_start(); + QRcode::png(json_encode($request_qrcode)); + $imageString = base64_encode(ob_get_contents()); + ob_end_clean(); + return $imageString; + } - if ($jeedomVersion < '4.4.0') { - log::add('mobile', 'info', '|-CONFIGMENU CUSTOM JEEDOM 4.3.0--'); - return $defaultMenuArray = self::getDefaultMenuArray(); - } - log::add('mobile', 'info', '|-CONFIGMENU CUSTOM JEEDOM 4.4.0--'); - $defaultMenuArray = self::getDefaultMenuArray(); - - if (is_object($eqLogic = eqLogic::byId($eqId))) { - $eqLogics = eqLogic::byType('mobile'); - $menuCustomArray = $eqLogic->getConfiguration('menuCustomArray'); - - // ATTRIBUTION MOBILE PAR DEFAUT A TOUS LES MOBILES - foreach ($eqLogics as $mobile) { - if ($mobile->getConfiguration('defaultIdMobile') == $eqId) { - $countFor = intval($eqLogic->getConfiguration('nbIcones', 3)) + 1; - $menuArrayTemp = []; - for ($i = 1; $i < $countFor; $i++) { - $menuArrayTemp[$i]['selectNameMenu'] = isset($menuCustomArray[$i]['selectNameMenu']) ? $menuCustomArray[$i]['selectNameMenu'] : 'none'; - $menuArrayTemp[$i]['renameIcon'] = isset($menuCustomArray[$i]['renameIcon']) ? $menuCustomArray[$i]['renameIcon'] : ''; - $menuArrayTemp[$i]['spanIcon'] = isset($menuCustomArray[$i]['spanIcon']) ? $menuCustomArray[$i]['spanIcon'] : 'none'; - $menuArrayTemp[$i]['urlUser'] = isset($menuCustomArray[$i]['urlUser']) ? $menuCustomArray[$i]['urlUser'] : 'none'; - } - $mobile->setConfiguration('menuCustomArray', $menuArrayTemp); - $mobile->save(); - }; + /** + * Create and update cmd for SpecificChannel + * Call by Api : mobile::geoloc && methodeForSpecificChannel + */ + public function cmdForSpecificChannel($params = array(), $_trigger = 'location') + { + log::add('mobile', 'debug', '|┌──:fg-success: cmdForSpecificChannel :/fg:──'); + if (isset($params[$_trigger])) { + $order = count($this->getCmd()); + $getDeviceInformations = (isset($params[$_trigger]['extras']) && isset($params[$_trigger]['extras']['method']) && $params[$_trigger]['extras']['method'] == 'getDeviceInformations'); + $eventAge = time() - intval(strtotime($params[$_trigger]['timestamp'])); + if ($eventAge > 1800) { + log::add('mobile', 'debug', '|| SKIP stale specific event (' . round($eventAge / 60) . 'min) '); + } else { + log::add('mobile', 'debug', '|| eventAge = ' . $eventAge . ' s'); + // Battery + if (isset($params[$_trigger]['battery'])) { + // level + if (isset($params[$_trigger]['battery']['level'])) { + if ($getDeviceInformations) { + $cmd = $this->getCmd(null, 'battery::level'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setLogicalId('battery::level'); + $cmd->setName(__('Batterie du téléphone', __FILE__)); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setConfiguration('historizeRound', 2); + $cmd->setConfiguration('minValue', 0); + $cmd->setConfiguration('maxValue', 100); + $cmd->setUnite('%'); + $cmd->setIsVisible(0); + $cmd->setOrder($order); + $order++; + log::add('mobile', 'debug', '|| Creating the "phone battery" command'); + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('info'); + $cmd->setConfiguration('calculValueOffset', '#value# * 100'); + $cmd->setSubType('numeric'); + if ($cmd->getChanged() === true) $cmd->save(); + } + if ($params[$_trigger]['battery']['level'] != -1) { + if ($this->checkAndUpdateCmd('battery::level', $params[$_trigger]['battery']['level'])) { + log::add('mobile', 'debug', '|| Updating "phone battery" value ─▶︎ ' . $params[$_trigger]['battery']['level'] * 100 . '%'); + } + } else { + log::add('mobile', 'debug', '|| [WARNING] No data available for battery level ─▶︎ ' . $params[$_trigger]['battery']['level']); + } + } + // charging + if (isset($params[$_trigger]['battery']['is_charging'])) { + if ($getDeviceInformations) { + $cmd = $this->getCmd(null, 'battery::isCharging'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setLogicalId('battery::isCharging'); + $cmd->setName(__('En charge', __FILE__)); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setTemplate('dashboard', 'core::line'); + $cmd->setTemplate('mobile', 'core::line'); + $cmd->setIsVisible(0); + $cmd->setOrder($order); + $order++; + log::add('mobile', 'debug', '|| Creating the "in charge" command'); + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('info'); + $cmd->setSubType('binary'); + if ($cmd->getChanged() === true) $cmd->save(); + } + if ($this->checkAndUpdateCmd('battery::isCharging', intval($params[$_trigger]['battery']['is_charging']))) { + log::add('mobile', 'debug', '|| Updating "in charge" value ─▶︎ ' . intval($params[$_trigger]['battery']['is_charging'])); + } + } } - $nbIcones = $eqLogic->getConfiguration('nbIcones', 3); - $arrayElements = array(); - $j = 0; - $count = 1; - for ($i = 1; $i < 5; $i++) { - - // GENERATE TAB ICON LIBRARY AND RENAME BY USER - $resultTabIcon = self::generateTabIcon($menuCustomArray, $i); - $tabIconName = $resultTabIcon['tabIconName']; - $tabLibName = $resultTabIcon['tabLibName']; - $tabRenameInput = $resultTabIcon['tabRenameInput']; - - - $objectId = $menuCustomArray[$i]['selectNameMenu']; - $isActive = true; - $webviewUrl = 'd'; - - log::add('mobile', 'debug', '| - objectId > ' . $objectId); - - // GENERATE URLS FOR MENU CUSTOM - $result = self::generateTypeObject($objectId, $i, $webviewUrl, $pluginPanelMobile); - $typeObject = $result['typeObject']; - $typewebviewurl = $result['typewebviewurl']; - $typeobjectId = $result['typeobjectId']; - $tabUrl = $result['tabUrl']; - - if ($count > intval($nbIcones)) { - $isActive = false; + // coords + if (isset($params[$_trigger]['coords'])) { + if (isset($params[$_trigger]['coords']['latitude']) && isset($params[$_trigger]['coords']['longitude'])) { + if ($getDeviceInformations) { + $cmd = $this->getCmd(null, 'coords'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setLogicalId('coords'); + $cmd->setName(__('Coordonnées', __FILE__)); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setTemplate('dashboard', 'core::line'); + $cmd->setTemplate('mobile', 'core::line'); + $cmd->setIsVisible(0); + $cmd->setOrder($order); + $order++; + log::add('mobile', 'debug', '|| Creating the "coordinates" command'); + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('info'); + $cmd->setSubType('string'); + if ($cmd->getChanged() === true) $cmd->save(); + } + $coord = $params[$_trigger]['coords']['latitude'] . ',' . $params[$_trigger]['coords']['longitude']; + if ($this->checkAndUpdateCmd('coords', $coord)) { + log::add('mobile', 'debug', '|| Updating "coordinates" value ─▶︎ ' . $coord); + } + } + if (isset($params[$_trigger]['coords']['altitude'])) { + if ($getDeviceInformations) { + $cmd = $this->getCmd(null, 'altitude'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setLogicalId('altitude'); + $cmd->setName(__('Altitude', __FILE__)); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setTemplate('dashboard', 'core::line'); + $cmd->setTemplate('mobile', 'core::line'); + $cmd->setIsVisible(0); + $cmd->setUnite('m'); + $cmd->setOrder($order); + $order++; + log::add('mobile', 'debug', '|| Creating the "altitude" command'); + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('info'); + $cmd->setSubType('string'); + if ($cmd->getChanged() === true) $cmd->save(); + } + if ($this->checkAndUpdateCmd('altitude', $params[$_trigger]['coords']['altitude'])) { + log::add('mobile', 'debug', '|| Updating "Altitude" value ─▶︎ ' . $params[$_trigger]['coords']['altitude'] . 'm'); + } } - log::add('mobile', 'debug', '| - Construction jsonTemplate'); - $jsonTemplate = array( - 'active' => $isActive, - 'icon' => [ - 'name' => $tabIconName, - 'type' => $tabLibName - ], - 'name' => $tabRenameInput, - 'options' => [ - 'uri' => $tabUrl, - 'objectType' => $typeObject, - 'mobile' => $typewebviewurl, - 'objectId' => $typeobjectId - ], - 'type' => strpos($tabUrl, 'www') !== false ? 'urlwww' : 'WebviewApp' - ); - $arrayElements['tab' . $j] = $jsonTemplate; - $j++; - $count++; } - - log::add('mobile', 'info', '| - Function MobileconfigMenuCustom :' . json_encode($arrayElements)); - log::add('mobile', 'debug', '|-----------------------------------'); - if (count($arrayElements) == 4) { - $j = 0; - for ($i = 0; $i < 4; $i++) { - $isBool = is_bool($arrayElements['tab' . $i]['active']); - if ($isBool) { - if ($arrayElements['tab' . $i]['active'] == true) { - $j++; - } - } else { - return $defaultMenuArray; - } - } - return ($j == 0) ? $defaultMenuArray : $arrayElements; - } - return $defaultMenuArray; - } - return $defaultMenuArray; - + } + } + log::add('mobile', 'debug', '|└──────────────'); } - public static function generateTabIcon($menuCustomArray, $i){ - $result = array(); - - $tabIconName = isset($menuCustomArray[$i]['spanIcon']) ? $menuCustomArray[$i]['spanIcon'] : 'none'; - - if ($tabIconName != 'none') { - $arrayIcon = explode(' ', $tabIconName); - $tabIconName = substr(strstr($arrayIcon[1], '-'), 1); - $tabLibName = strstr($arrayIcon[1], '-', true); - if ($tabLibName == 'mdi') { - $tabLibName = 'Mdi'; - } - } else { - $tabIconName = 'in'; - $tabLibName = 'jeedomapp'; - } - - $tabRenameInput = isset($menuCustomArray[$i]['renameIcon']) ? $menuCustomArray[$i]['renameIcon'] : 'none'; - - if ($tabRenameInput == 'none') { - $tabRenameInput = 'Accueil'; - } - $result['tabIconName'] = $tabIconName; - $result['tabLibName'] = $tabLibName; - $result['tabRenameInput'] = $tabRenameInput; - - return $result; - } - - - public static function generateTypeObject($objectId, $i, $webviewUrl, $pluginPanelMobile){ - - $result = array(); - if ($objectId && $objectId != -1 && $objectId != 'none' && $objectId != 'url') { - // SPECIFIC OBJETS FOR URL - $excludedRefs = array('overview', 'health', 'home', 'timeline'); - if (!in_array($objectId, $excludedRefs)) { - $arrayObjects = explode('_', $objectId); - $objectId = $arrayObjects[0]; - $typeObject = $arrayObjects[1]; - - $typewebviewurl = $webviewUrl; - $typeobjectId = $objectId; - - switch ($typeObject) { - case 'views': - $tabUrl = "/index.php?v={$webviewUrl}&p=view&view_id={$objectId}"; - break; - case 'dashboard': - $tabUrl = "/index.php?v={$webviewUrl}&p=dashboard&object_id={$objectId}"; - break; - case 'plan': - $tabUrl = "/index.php?v={$webviewUrl}&p=plan&plan_id={$objectId}"; - break; - case 'panel': - $tabUrl = ($pluginPanelMobile[$objectId] == $objectId) ? "/index.php?v=m&p={$objectId}" : "/index.php?v=m&p={$objectId}&app_mode=1"; - break; - default: - break; - } - } else { - $typeObject = $objectId; - $typewebviewurl = $webviewUrl; - $typeobjectId = ''; - - switch ($objectId) { - case 'overview': - $tabUrl = "/index.php?v=m&p=overview"; - break; - case 'home': - $tabUrl = "/index.php?v=m&p=home"; - break; - case 'health': - $tabUrl = "/index.php?v=m&p=health"; - break; - case 'timeline': - $tabUrl = "/index.php?v=m&p=timeline"; - break; - default: - $typeObject = $objectId; - $typewebviewurl = 'm'; - $typeobjectId = ''; - $tabUrl = '/index.php?v=m&app_mode=1'; - break; - } - } - } elseif ($objectId == 'url') { - $typeObject = $objectId; - $typewebviewurl = $webviewUrl; - $typeobjectId = 'url'; - $tabUrl = $menuCustomArray[$i]['urlUser']; - } else { - $typeObject = $objectId; - $typewebviewurl = 'm'; - $typeobjectId = ''; - $tabUrl = '/index.php?v=m&app_mode=1'; - } - - $result['typeObject'] = $typeObject; - $result['typewebviewurl'] = $typewebviewurl; - $result['typeobjectId'] = $typeobjectId; - $result['tabUrl'] = $tabUrl; - - return $result; -} - -private static function getDefaultMenuArray(){ - $defaultMenuJson = '{"tab0":{"active":true,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&p=home"},"type":"WebviewApp"}, - "tab1":{"active":false,"icon":{"name":"hubspot","type":"fa"},"name":"Synthese","options":{"uri":"\/index.php?v=m&p=overview"},"type":"WebviewApp"}, - "tab2":{"active":false,"icon":{"name":"medkit","type":"fa"},"name":"Sant\u00e9","options":{"uri":"\/index.php?v=m&p=health"},"type":"WebviewApp"}, - "tab3":{"active":false,"icon":{"name":"in","type":"jeedomapp"},"name":"Accueil","options":{"uri":"\/index.php?v=m&p=home"},"type":"WebviewApp"}}'; - return json_decode($defaultMenuJson, true); -} - - - /* - * Call by - - jsonrpc -> nfc - - jsonrpc -> qrcodemethod - */ - public function cmdForApi($Iq, $logicalId, $value, $name = "", $subtype = "string") + /** + * cleaning notifications based on time retention + * Call by cronDaily + */ + public function cleaningNotifications() { - $mobile = eqLogic::byLogicalId($Iq, 'mobile'); - if (is_object($mobile)) { - $cmd = $mobile->getCmd(null, $logicalId); - if (!is_object($cmd)) { - if ($name == "") { - $name = $logicalId; + $notifsTime = $this->getConfiguration('notifsTime', 30); + log::add('mobile', 'debug', '┌──────────▶︎ :fg-warning: cleaningNotifications :/fg: ──────────'); + log::add('mobile', 'debug', '| Current retention period ─▶︎ ' . $notifsTime . ' days'); + // Images + $retentionSeconds = intVal($notifsTime) * 24 * 60 * 60; + $currentTime = time(); + $pathImages = dirname(__FILE__) . '/../../data/images/'; + if (is_dir($pathImages)) { + $images = glob($pathImages . '*.jpg'); + foreach ($images as $image) { + if (strpos($image, $this->getLogicalId()) !== false) { + $fileCreationTime = filemtime($image); + if ($fileCreationTime < ($currentTime - $retentionSeconds)) { + if (!unlink($image)) { + log::add('mobile', 'error', __("Erreur lors de la suppression", __FILE__) . ' ─▶︎ ' . $image); + } else { + log::add('mobile', 'debug', '| [WARNING] image removal ─▶︎ ' . $image); + } + } } - $cmd = new mobileCmd(); - $cmd->setLogicalId($logicalId); - $cmd->setName($name); - $cmd->setOrder(0); - $cmd->setEqLogic_id($mobile->getId()); - $cmd->setType('info'); - $cmd->setSubType($subtype); - $cmd->setIsVisible(1); - if (in_array($logicalId, array('barrecodemethod', 'nfcPayload', 'nfcId'))) { - $cmd->setConfiguration('repeatEventManagement', 'always'); + } + } + // Notifications + $filePath = dirname(__FILE__) . '/../data/notifications/' . $this->getLogicalId() . '.json'; + $notifications = 'noNotifications'; + if (file_exists($filePath)) { + $notifications = file_get_contents($filePath); + if ($notifications) { + $notifications = json_decode($notifications, true); + if (json_last_error() !== JSON_ERROR_NONE) { + log::add('mobile', 'error', __("Erreur decodage du JSON", __FILE__) . ' ─▶︎ ' . json_last_error_msg()); + return; + } + $notificationsModified = false; + + foreach ($notifications as $id => $value) { + $notificationDate = strtotime($value['data']['date']); + if (($currentTime - $notificationDate) > $retentionSeconds) { + log::add('mobile', 'debug', '| [WARNING] notification removal ─▶︎ N°' . $id); + unset($notifications[$id]); + $notificationsModified = true; + } + } + $notifications = json_encode($notifications); + if ($notificationsModified) { + file_put_contents($filePath, $notifications); } - $cmd->save(); } - $cmd->event($value); } + log::add('mobile', 'debug', '└───────────────────────────────────────────'); } + /** + * Call by core after insert into bdd + */ + public function postInsert() + { + if ($this->getLogicalId() == '') { + $key = config::genKey(32); + $this->setLogicalId($key); + } + if ($this->getConfiguration('appVersion', 1) == 2) { + $this->setConfiguration('defaultIdMobile', $this->getId()); + } + $this->save(); + } + + /** + * Call by core after save into bdd + */ public function postSave() { - $cmdNotif = $this->getCmd(null, 'notif'); - if (!is_object($cmdNotif)) { - $cmdNotif = new mobileCmd(); - } - $cmdNotif->setLogicalId('notif'); - $cmdNotif->setName(__('Notification', __FILE__)); - $cmdNotif->setOrder(0); - $cmdNotif->setEqLogic_id($this->getId()); - $cmdNotif->setDisplay('generic_type', 'GENERIC_ACTION'); - $cmdNotif->setType('action'); - $cmdNotif->setSubType('message'); - $cmdNotif->setIsVisible(1); - $cmdNotif->save(); + $order = count($this->getCmd()); + + // Notification command + $cmd = $this->getCmd(null, 'notif'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setIsVisible(1); + $cmd->setName(__('Notification', __FILE__)); + $cmd->setLogicalId('notif'); + $cmd->setGeneric_type('GENERIC_ACTION'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setOrder($order); + $order++; + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('action'); + $cmd->setSubType('message'); + if ($cmd->getChanged() === true) $cmd->save(); if ($this->getConfiguration('appVersion', 1) == 2) { - $cmdNotif = $this->getCmd(null, 'notifCritical'); - if (!is_object($cmdNotif)) { - $cmdNotif = new mobileCmd(); + // Critical Notification Command + $cmd = $this->getCmd(null, 'notifCritical'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setIsVisible(1); + $cmd->setName(__('Notification Critique', __FILE__)); + $cmd->setLogicalId('notifCritical'); + $cmd->setGeneric_type('GENERIC_ACTION'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setOrder($order); + $order++; } - $cmdNotif->setLogicalId('notifCritical'); - $cmdNotif->setName(__('Notification Critique', __FILE__)); - $cmdNotif->setOrder(0); - $cmdNotif->setEqLogic_id($this->getId()); - $cmdNotif->setDisplay('generic_type', 'GENERIC_ACTION'); - $cmdNotif->setType('action'); - $cmdNotif->setSubType('message'); - $cmdNotif->setIsVisible(1); - $cmdNotif->save(); - } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('action'); + $cmd->setSubType('message'); + if ($cmd->getChanged() === true) $cmd->save(); - $cmdaskText = $this->getCmd(null, 'ask_Text'); - if (is_object($cmdaskText)) { - $cmdaskText->remove(); + // Silent notification command + $cmd = $this->getCmd(null, 'notifSilent'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setIsVisible(1); + $cmd->setName(__('Notification Silencieuse', __FILE__)); + $cmd->setLogicalId('notifSilent'); + $cmd->setGeneric_type('GENERIC_ACTION'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setOrder($order); + $order++; + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('action'); + $cmd->setSubType('message'); + if ($cmd->getChanged() === true) $cmd->save(); + + // command to retrieve specific information + $cmd = $this->getCmd(null, 'notifSpecific'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setIsVisible(0); + $cmd->setName(__('Récupérer les informations du téléphone', __FILE__)); + $cmd->setLogicalId('notifSpecific'); + $cmd->setGeneric_type('GENERIC_ACTION'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setOrder($order); + $order++; + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('action'); + $cmd->setSubType('other'); + if ($cmd->getChanged() === true) $cmd->save(); + + // Command to delete notifications + $cmd = $this->getCmd(null, 'removeNotifs'); + if (!is_object($cmd)) { + $cmd = new mobileCmd(); + $cmd->setIsVisible(1); + $cmd->setName(__('Supprimer les Notifications', __FILE__)); + $cmd->setLogicalId('removeNotifs'); + $cmd->setGeneric_type('GENERIC_ACTION'); + $cmd->setDisplay('icon', ''); + $cmd->setDisplay('forceReturnLineAfter', 1); + $cmd->setDisplay('showIconAndNamedashboard', 1); + $cmd->setDisplay('showIconAndNamemobile', 1); + $cmd->setOrder($order); + $order++; + } + $cmd->setEqLogic_id($this->getId()); + $cmd->setType('action'); + $cmd->setSubType('select'); + $listValue = "1|" . __('Supprimer toutes les Notifications', __FILE__) . ";2|" . __('Supprimer les Asks expirés', __FILE__) . ";3|" . __('Supprimer les Asks répondus', __FILE__); + $cmd->setConfiguration('listValue', $listValue); + if ($cmd->getChanged() === true) $cmd->save(); } - $cmdaskYN = $this->getCmd(null, 'ask_YN'); - if (is_object($cmdaskYN)) { - $cmdaskYN->remove(); + + if ($this->getConfiguration('appVersion', 1) != 2) { + $cmdaskText = $this->getCmd(null, 'ask_Text'); + if (is_object($cmdaskText)) { + $cmdaskText->remove(); + } + $cmdaskYN = $this->getCmd(null, 'ask_YN'); + if (is_object($cmdaskYN)) { + $cmdaskYN->remove(); + } } } + /** + * Call by core before remove eqLogic + */ public function preRemove() { - $eqId = $this->getId(); - $idMobileActive = config::byKey('checkdefaultID', 'mobile'); - if ($idMobileActive == $eqId) { - config::save('checkdefaultID', 'noActivMobile', 'mobile'); + log::add('mobile', 'debug', '┌──:fg-success: preRemove() :/fg:──'); + $Iq = $this->getId(); + /* App V2 */ + foreach (eqLogic::byType('mobile') as $mobile) { + if ($Iq == $mobile->getId()) continue; + if ($mobile->getConfiguration('defaultIdMobile', 'none') == $Iq) { + $mobile->setConfiguration('defaultIdMobile', $mobile->getId()); + $mobile->save(); + log::add('mobile', 'debug', '| Update defaultIdMobile for mobile ' . $mobile->getHumanName(false) . ' ( ' . $mobile->getId() . ' ) '); + } + } + $fileNotif = dirname(__FILE__) . '/../data/notifications/' . $this->getLogicalId() . '.json'; + if (file_exists($fileNotif)) { + log::add('mobile', 'debug', '| Deleting notifications file ─▶︎ ' . $fileNotif); + shell_exec('rm ' . $fileNotif); } + /* App V1 */ + $path = dirname(__FILE__) . '/../../data/' . $this->getLogicalId(); + if (file_exists($path)) { + log::add('mobile', 'debug', '| Deleting folder ─▶︎ ' . $path); + shell_exec('rm -rf ' . $path); + } + log::add('mobile', 'debug', '└────────────────────'); } + /** + * Call by core after remove eqLogic + */ + /* + public function postRemove() { - /* public function postRemove() { - $eqId = $this->getId(); - $mobileActive = eqLogic::byId(intval($mobileActiveDefault)); - - }*/ - - /* * *********************Méthodes d'instance************************* */ + } + */ /* * **********************Getteur Setteur*************************** */ - public static function cronDaily() - { - mobile::makeTemplateJson(); - mobile::deleteFileImg(); - } } class mobileCmd extends cmd @@ -1342,23 +1787,28 @@ class mobileCmd extends cmd public static function fileInMessage($data) { - log::add('mobile', 'debug', 'test FileInMessage'); + log::add('mobile', 'debug', '|┌──:fg-success: fileInMessage :/fg:──'); $dataArray = explode('|', $data); $result = array(); foreach ($dataArray as $item) { - $arg = explode('=', trim($item), 2); if (count($arg) == 2) { $result[trim($arg[0])] = trim($arg[1]); } } $result['message'] = $dataArray[0]; - log::add('mobile', 'debug', 'file Parse > ' . json_encode($result)); + $decodedMessage = json_decode($result['message']); + if (json_last_error() === JSON_ERROR_NONE) { + log::add('mobile', 'debug', '|| [INFO] Message ─▶︎ ' . $decodedMessage); + } else { + log::add('mobile', 'debug', '|| [INFO] Message ─▶︎ ' . str_replace(["\r", "\n"], "", $result['message'])); + } if (array_key_exists('file', $result)) { - log::add('mobile', 'debug', 'file > ' . $result['file']); + log::add('mobile', 'debug', '|| file ─▶︎ ' . $result['file']); + log::add('mobile', 'debug', '|└────────────────────'); return $result; } else { - log::add('mobile', 'debug', 'null'); + log::add('mobile', 'debug', '|└────────────────────'); return null; } } @@ -1368,60 +1818,103 @@ public function execute($_options = array()) if ($this->getType() != 'action') { return; } + log::add('mobile', 'debug', '┌──:fg-success: execute :/fg:──'); $optionsNotif = []; $eqLogic = $this->getEqLogic(); + $Iq = $eqLogic->getLogicalId(); - if ($this->getLogicalId() == 'notif' || $this->getLogicalId() == 'notifCritical') { - - if ($_options['title'] == '' || $_options['title'] == $_options['message'] || $_options['title'] == ' ') { - $_options['title'] = config::byKey('product_name'); + if ($this->getLogicalId() == 'removeNotifs') { + $filePath = dirname(__FILE__) . '/../data/notifications/' . $Iq . '.json'; + if (!file_exists($filePath)) { + log::add('mobile', 'debug', '| ' . __('Fichier de notifications inexistant', __FILE__) . ' ─▶︎ ' . $filePath); + return; + } + $valueUser = $_options['select']; + switch ($valueUser) { + case 1: + file_put_contents($filePath, ''); + log::add('mobile', 'debug', '| Deleting all notifications'); + break; + case 2: + $notifs = json_decode(file_get_contents($filePath), true); + $notifs = array_filter($notifs, function ($notif) { + $askParams = json_decode($notif['data']['askParams'], true); + $notifTime = strtotime($notif['data']['date']); + $currentTime = time(); + $timeout = (isset($askParams['timeout'])) ? $askParams['timeout'] / 1000 : 0; + return $notif['data']['askVariable'] == 'rien' || ($currentTime - $notifTime) < $timeout; + }); + file_put_contents($filePath, json_encode($notifs)); + log::add('mobile', 'debug', '| Deleting all ask expired'); + break; + case 3: + $notifs = json_decode(file_get_contents($filePath), true); + $notifs = array_filter($notifs, function ($notif) { + return !isset($notif['data']['choiceAsk']) || $notif['data']['choiceAsk'] == ''; + }); + file_put_contents($filePath, json_encode($notifs)); + log::add('mobile', 'debug', '| Deleting all ask answered'); + break; } - $critical = false; + log::add('mobile', 'debug', '└────────────────────'); + } + if ($this->getLogicalId() == 'notif' || $this->getLogicalId() == 'notifCritical' || $this->getLogicalId() == 'notifSpecific' || $this->getLogicalId() == 'notifSilent') { + $notificationArn = $eqLogic->getConfiguration('notificationArn', null); + $typeMobile = $eqLogic->getConfiguration('type_mobile', null); + $critical = false; + $silent = false; + $specific = false; + $defaultName = empty(config::byKey('name')) ? config::byKey('product_name') : config::byKey('name'); if ($this->getLogicalId() == 'notifCritical') { $critical = true; } - + if ($this->getLogicalId() == 'notifSilent') { + $silent = true; + } + if ($this->getLogicalId() == 'notifSpecific') { + $specific = true; + $_options['title'] = 'getDeviceInformations'; + $_options['message'] = 'getDeviceInformations'; + } + if (trim($_options['title']) == '') $_options['title'] = $defaultName; $file = mobileCmd::fileInMessage($_options['message']); if (!isset($_options['files']) && $file != null) { $_options['files'] = array(); array_push($_options['files'], $file['file']); $_options['message'] = $file['message']; - log::add('mobile', 'debug', 'file detected ' . json_encode($file)); + log::add('mobile', 'debug', '| file detected ' . json_encode($file)); } - - $answer = ($_options['answer']) ? join(';', $_options['answer']) : null; - $askVariable = $_options['variable']; - $askType = ($_options['answer']) ? 'ask_Text' : 'notif'; - $timeout = ($_options['timeout']) ? $_options['timeout'] : 'nok'; + log::add('mobile', 'DEBUG', '| [INFO] Title ─▶︎ ' . $_options['title']); + log::add('mobile', 'DEBUG', '| [INFO] Message ─▶︎ ' . str_replace(["\r", "\n"], "", $_options['message'])); + if ($typeMobile == 'android') $_options['message'] = nl2br($_options['message']); + $answer = (isset($_options['answer']) && $_options['answer']) ? join(';', $_options['answer']) : null; + $askVariable = isset($_options['variable']) ? $_options['variable'] : null; + $askType = isset($_options['answer']) && $_options['answer'] ? 'ask_Text' : 'notif'; + if ($askType == 'ask_Text') $_options['title'] = $defaultName; + $timeout = isset($_options['timeout']) && $_options['timeout'] ? $_options['timeout'] : 'nok'; $optionsNotif['askVariable'] = $askVariable; - - log::add('mobile', 'debug', 'Commande de notification ' . $askType, 'config'); - if (($eqLogic->getConfiguration('notificationArn', null) != null || $eqLogic->getConfiguration('notificationRegistrationToken', null) != null) && $eqLogic->getConfiguration('type_mobile', null) != null) { + log::add('mobile', 'debug', '| Notification command ─▶︎ ' . $askType); + if (($notificationArn != null || $eqLogic->getConfiguration('notificationRegistrationToken', null) != null) && $typeMobile != null) { $idNotif = $eqLogic->getConfiguration('idNotif', 0); $idNotif = $idNotif + 1; $eqLogic->setConfiguration('idNotif', $idNotif); $eqLogic->save(); - - log::add('mobile', 'debug', 'Notif > ' . json_encode($_options) . ' / ' . $eqLogic->getId() . ' / ' . $this->getLogicalId() . ' / idNotif =' . $idNotif, 'config'); + log::add('mobile', 'debug', '| [INFO] Notif ─▶︎ ' . json_encode($_options)); + log::add('mobile', 'debug', '| eqLogic ─▶︎ ' . $eqLogic->getId() . ' | LogicalId ─▶︎ ' . $this->getLogicalId() . ' | idNotif ─▶︎ ' . $idNotif); if (isset($options['file'])) { - log::add('mobile', 'debug', 'FILE'); - unset($data['file']); $_options['files'] = explode(',', $options['file']); } if (isset($_options['files']) && is_array($_options['files'])) { - log::add('mobile', 'debug', 'FILES'); + log::add('mobile', 'debug', '| file detected'); foreach ($_options['files'] as $file) { - log::add('mobile', 'debug', 'FILES as FILE'); - if (trim($file) == '') { - continue; - } - log::add('mobile', 'debug', 'Continue'); + if (trim($file) == '') continue; $ext = pathinfo($file, PATHINFO_EXTENSION); - log::add('mobile', 'debug', $ext . ' pour > ' . $file); + $url = null; + log::add('mobile', 'debug', '| ' . $file); if (in_array($ext, array('gif', 'jpeg', 'jpg', 'png'))) { - log::add('mobile', 'debug', 'type photo !'); + log::add('mobile', 'debug', '| ↳ type photo !'); if ($ext == "gif") { $typeHint = "com.compuserve.gif"; } else if ($ext == "jpeg") { @@ -1434,34 +1927,31 @@ public function execute($_options = array()) $typeHint = "public.jpeg"; } $optionsNotif['typeHint'] = $typeHint; - $url = network::getNetworkAccess('external'); - $url .= '/plugins/mobile/core/php/image.php?'; - $nameFile = base64_encode($file) . '.' . $ext; + $nameFile = $Iq . '__' . base64_encode($file) . '.' . $ext; $path = dirname(__FILE__) . '/../../data/images'; $newfile = $path . '/' . $nameFile; - log::add('mobile', 'debug', 'copie sur > ' . $newfile); + log::add('mobile', 'debug', '| ↳ copy on ─▶︎ ' . $newfile); if (!file_exists($path)) { mkdir($path); } if (!copy($file, $newfile)) { - log::add('mobile', 'error', 'la copie de l\'image a echoué'); + log::add('mobile', 'error', __("la copie de l\'image a échouée", __FILE__)); + } else { + $keyFile = md5_file($newfile); + $url = network::getNetworkAccess('external') . '/plugins/mobile/core/php/image.php?key=' . $keyFile . '&name=' . $nameFile; + log::add('mobile', 'debug', '| ↳ url ─▶︎ ' . $url); } - $keyFile = md5_file($newfile); - $url .= 'key=' . $keyFile . '&name=' . $nameFile; - log::add('mobile', 'debug', 'url > ' . $url); - mobile::notification($eqLogic->getConfiguration('notificationArn', null), $eqLogic->getConfiguration('type_mobile', null), $_options['title'], $_options['message'], $askType, $idNotif, $answer, $timeout, $eqLogic->getConfiguration('notificationRegistrationToken', null), $url, $eqLogic->getConfiguration('appVersion', 1), $optionsNotif, $critical); - } else { - mobile::notification($eqLogic->getConfiguration('notificationArn', null), $eqLogic->getConfiguration('type_mobile', null), $_options['title'], $_options['message'], $askType, $idNotif, $answer, $timeout, $eqLogic->getConfiguration('notificationRegistrationToken', null), null, $eqLogic->getConfiguration('appVersion', 1), $optionsNotif, $critical); } + mobile::notification($notificationArn, $typeMobile, $_options['title'], $_options['message'], $askType, $idNotif, $answer, $timeout, $eqLogic->getConfiguration('notificationRegistrationToken', null), $url, $eqLogic->getConfiguration('appVersion', 1), $optionsNotif, $critical, $Iq, $specific, $silent); } } else { - mobile::notification($eqLogic->getConfiguration('notificationArn', null), $eqLogic->getConfiguration('type_mobile', null), $_options['title'], $_options['message'], $askType, $idNotif, $answer, $timeout, $eqLogic->getConfiguration('notificationRegistrationToken', null), null, $eqLogic->getConfiguration('appVersion', 1), $optionsNotif, $critical); + mobile::notification($notificationArn, $typeMobile, $_options['title'], $_options['message'], $askType, $idNotif, $answer, $timeout, $eqLogic->getConfiguration('notificationRegistrationToken', null), null, $eqLogic->getConfiguration('appVersion', 1), $optionsNotif, $critical, $Iq, $specific, $silent); } - - log::add('mobile', 'debug', 'Action : Envoi d\'une configuration ', 'config'); } else { - log::add('mobile', 'debug', 'ARN non configuré ', 'config'); + if ($typeMobile == null) log::add('mobile', 'debug', '| [ERROR] Mobile type not configured'); + else log::add('mobile', 'debug', '| [ERROR] ARN not configured'); } + log::add('mobile', 'debug', '└────────────────────'); } } diff --git a/core/data/wizard.json b/core/data/wizard.json deleted file mode 100755 index 8003e5d3..00000000 --- a/core/data/wizard.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "trame": { - "firstPage": { - "title": "Bien demarrer", - "wizard": "firstPage", - "order": 1, - "custom": "", - "visible": 1 - }, - "SecPage": { - "title": "Identification", - "wizard": "secPage", - "order": 2, - "custom": "", - "visible": 1 - }, - "ThirdPage": { - "title": "Mes Boxs", - "wizard": "thirdPage", - "order": 3, - "custom": "", - "visible": 1 - }, - "FourPage": { - "title": "Synchronisation Boxs", - "wizard": "fourPage", - "order": 4, - "custom": "", - "visible": 1 - }, - "FivePage": { - "title": "Geolocalisation", - "wizard": "fivePage", - "order": 5, - "custom": "", - "visible": 1 - }, - "SixPage": { - "title": "Personnalisation Menu", - "wizard": "sixPage", - "order": 6, - "custom": "", - "visible": 1 - } - } -} diff --git a/core/i18n/de_DE.json b/core/i18n/de_DE.json index 4807b97a..46947862 100755 --- a/core/i18n/de_DE.json +++ b/core/i18n/de_DE.json @@ -3,28 +3,6 @@ "Notifications de l'app": "App-Benachrichtigungen", "Réponse Ask sensible à la case : ": "Fragen Sie die Antwort, die für die Box empfindlich ist:" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Les Pièces - Application V1": "Teile - Anwendung V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Équipement": "Gerät", - "Type de Mobile": "Mobiler Typ", - "Utilisateur": "Benutzer", - "Dernière activité": "Letzte Aktivität", - "Date création": "Erstellungsdatum", - "Utilisateur non trouvé": "Benutzer nicht gefunden" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "COMPTE MARKET": "MARKTKONTO", - "BOX ID": "BOX-ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Sie müssen lediglich Ihre Markt-ID und Ihr Passwort eingeben", - "Plusieurs choix sur cet écran :": "Mehrere Auswahlmöglichkeiten auf diesem Bildschirm:", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Sie geben die URL Ihres Jeedom (intern oder extern) sowie die Zugangskennungen dazu ein und bestätigen mit dem LOGIN-Button", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Sie klicken auf QR-Code: ein neuer Bildschirm erscheint; Sie können einen QRCode aus dem Mobile-Plugin der Box, die Sie hinzufügen möchten, über die Registerkarte QRCODE des Plugins scannen" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 – Unbefugter Zugriff", "Équipement": "Ausrüstung", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Benutzer nicht gefunden", "Configuration Menu Enregistrée": "Gespeicherte Menükonfiguration" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Plugins Spéciaux Compatibles": "Kompatible Spezial-Plugins", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Verfügbar in der Liste der Plugins und in das Dashboard der Mobile App integriert", - "Plugins Validés Type générique": "Validierte Plugins Generischer Typ", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "In der App sichtbar, erfordert möglicherweise einen generischen Typ, ist möglicherweise deaktiviert", - "Plugins compatibles non transmis": "Kompatible Plugins werden nicht übertragen", - "Ne sont pas transmis à l’App Mobile.": "Werden nicht an die Mobile App übertragen", - "Plugins non testés transmis à l'application": "Nicht getestete Plugins werden an die Anwendung übertragen", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Werden basierend auf generischen Typen an die Mobile App übertragen", - "Plugins non testés et non transmis": "Plugins nicht getestet und nicht übertragen", - "Ne sont pas transmis à l’App Mobile": "Werden nicht an die Mobile App übertragen" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Fonctionnement de la Géolocalisation": "So funktioniert Geolokalisierung", - "On ajoute une zone de Géolocalisation": "Wir fügen eine Geolocation-Zone hinzu", - "On recherche l'adresse, on nomme la Zone, et on valide": "Wir suchen nach der Adresse, benennen die Zone und validieren", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "Die Zone wird rot angezeigt, was bedeutet, dass Sie sich nicht in der Zone befinden", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Wenn Sie sich beim Erstellen in dem Bereich befinden, wird es nach einigen Sekunden grün", - "Modifier largueur de la zone": "Zonenbreite ändern", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Durch das Hinzufügen einer Zone wird Ihrer Telefonanlage im Mobile-Plugin ein binärer Befehl hinzugefügt, mit dem wir Aktionen basierend auf ihrem Zustand programmieren können" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "HINZUFÜGEN DER BOX ZU IHRER MOBILEN APP", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Sie können einen Benutzer auswählen: Es wird ein QRCode generiert. Anschließend können Sie den QRCode aus der neuen Anwendung scannen und so dieses Feld zu Ihrer Anwendung hinzufügen", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Fehler Keine externe Adresse (siehe Konfiguration Ihres Jeedom!)", "Erreur Pas d\\'utilisateur selectionné": "Fehler Kein Benutzer ausgewählt" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Personnalisation du Menu": "Menüanpassung", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Sie können das Menü Ihres WebView über das Mobile-Plugin oder die Anwendung anpassen", - "On clique sur Menu Custom": "Wir klicken auf Menü Benutzerdefiniert", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Ein Modal öffnet sich und bietet Ihnen Ihre bereits verbundenen Telefone an", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Klicken Sie auf dem ausgewählten Telefon auf Menü konfigurieren", - "Le nombre d'icônes peut aller de 1 à 4": "Die Anzahl der Symbole kann zwischen 1 und 4 liegen", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "Wenn Sie „Menüstandard“ aktivieren, wird das auf diesem Telefon konfigurierte Menü zum Standardmenü auf allen Ihren Telefonen", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Über die mobile Anwendung: Wenn Sie ein Standardfeld konfiguriert haben, erscheint das benutzerdefinierte Menü im Anwendungsmenü", - "Même principe que via le plugin Mobile": "Gleiches Prinzip wie über das Mobile-Plugin" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "So verbinden Sie Ihr Telefon: Es gibt 2 mögliche Methoden" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Nicht autorisierter Zugriff", - "Pause": "Pause", - "Rechercher": "Suchen nach" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Envoi auprès de l'app mobile": "Senden an die mobile App", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Dieses Plugin ist voll kompatibel und erfordert keine Aktion von Ihrer Seite", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Dieses Plugin ist kompatibel. Denken Sie daran, die generischen Typen der Befehle zu überprüfen", - "Activer": "Aktivieren", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Das Plugin ist nicht kompatibel, Sie können es bei Bedarf aktivieren", - "Type Générique du Plugin": "Generischer Plugin-Typ", - "Sauvegarder": "Speichern", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Name der Bestellung", - "Type Générique": "Typ Gattung", - "Icône": "Symbol", - "Aucun": "Ohne", - " . $info['family'] . ": "$ info ['Familie']", - "Plugins compatibles": "Kompatible Plugins", - "Modifications sauvegardées avec succès": "Änderungen erfolgreich gespeichert", - "Sauvegarde effectuée": "Sicherung abgeschlossen" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Nicht autorisierter Zugriff", - "Scénarios": "Szenarien", - "Sauvegarder": "Speichern", - "ID": "Identifikation", - "Scénario": "Szenario", - "Transmis": "Übertragen", - "Actions": "Lager", - "Envoyer à l\\'application": "An Bewerbung senden" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Envoyer cette pièce vers l\\'application": "Senden Sie diesen Teil an die Anwendung", - "Activer": "Aktivieren", - "Type Générique de cet objet": "Generischer Typ dieses Objekts", - "Sauvegarder": "Speichern", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Name der Bestellung", - "Type Générique": "Typ Gattung", - "Icône": "Symbol", - "Aucun": "Ohne", - " . $info['family'] . ": "$ info ['Familie']", - "Objets \/ Pièces": "Objekte \/ Stücke", - "Modifications sauvegardées avec succès": "Änderungen erfolgreich gespeichert", - "Sauvegarde effectuée avec succès": "Speichern erfolgreich abgeschlossen" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "JSON valide": "Gültiger json", - "Objets \/ Pièces": "Objekte \/ Stücke", - "Modules": "Module", - "Commandes": "Befehle", - "Scénarios": "Szenarien", - "Messages": "Nachricht", - "Designs": "Design", - "Configurations": "Konfigurationen" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Fonctionnement de la Géolocalisation": "So funktioniert Geolokalisierung", - "On ajoute une zone de Géolocalisation": "Wir fügen eine Geolocation-Zone hinzu", - "On recherche l'adresse, on nomme la Zone, et on valide": "Wir suchen nach der Adresse, benennen die Zone und validieren", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "Die Zone wird rot angezeigt, was bedeutet, dass Sie sich nicht in der Zone befinden", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Wenn Sie sich beim Erstellen in dem Bereich befinden, wird es nach einigen Sekunden grün", - "Modifier largueur de la zone": "Zonenbreite ändern", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Durch das Hinzufügen einer Zone wird Ihrer Telefonanlage im Mobile-Plugin ein binärer Befehl hinzugefügt, mit dem Sie Aktionen basierend auf ihrem Zustand programmieren können" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Um auf Funktionen wie Benachrichtigungen, Menüpersonalisierung oder Geolokalisierung zugreifen zu können, müssen Sie zunächst mindestens ein aktuelles Feld ausgewählt haben", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Dazu müssen Sie im Reiter „Boxen“ eine Box auswählen und sich identifizieren", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Sobald die Kennungen eingegeben wurden, wird das Feld an den Anfang der Liste verschoben", - "Si elle répond au ping, elle a un voyant vert": "Wenn es auf den Ping reagiert, zeigt es grünes Licht", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "Sie können auf „Synchronisieren“ klicken, um den Status der Boxen zu aktualisieren", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Um auf alle Funktionen zuzugreifen, müssen Sie auf das konfigurierte Feld klicken. Dadurch kann die Anwendung ihre Informationen abrufen und somit die Menüanzeigen autorisieren", - "Menu Complet": "Volles Menü" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Équipement": "Ausrüstung", - "Type de Mobile": "Mobiler Typ", - "Utilisateur": "Benutzer", - "Menu Enregistrés": "Menü gespeichert", - "Aucun menu enregistré": "Kein gespeichertes Menü", - "APPLICATION V2 NON INTALLÉE": "ANWENDUNG V2 NICHT INSTALLIERT", - "Utilisateur non trouvé": "Benutzer nicht gefunden", - "Configuration Menu Enregistrée": "Gespeicherte Menükonfiguration" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 – Unbefugter Zugriff" }, @@ -194,25 +35,18 @@ "Configuration": "Konfiguration", "Gestion Mobiles": "Mobiles Management", "QR Code": "QR-Code", - "Sauvegardes Menu Custom Mobile": "Backups-Menü, benutzerdefiniert, mobil", - "Documentation APP": "APP-Dokumentation", "Mes Téléphones Mobiles": "Meine Handys", "Rechercher": "Suchen nach", "Équipement visible": "Sichtbare Ausrüstung", "Équipement non visible": "Ausrüstung nicht sichtbar", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Um ein Telefon hinzuzufügen, gibt es zwei Möglichkeiten:", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Auf dem ersten Bildschirm der Anwendung werden Sie aufgefordert, Ihr Marktkonto zu verbinden und so alle mit diesem Konto verknüpften Boxen zu finden, oder einfach eine Box hinzuzufügen", "App V1": "Anwendung V1", - "Ajouter": "Hinzufügen", - "Plugins": "Plugins", - "Objets\/Pièces": "Artikel\/Teile", - "Scénarios": "Szenarien", - "Régénérer la configuration": "Konfiguration neu generieren", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Bitte beachten Sie, dass es in der Betaversion nicht mehr möglich ist, die APP V1 zu verwenden", "Configuration avancée": "Erweiterte Konfiguration", - "Infos envoyées à l'app": "Info an die App gesendet", "Sauvegarder": "Speichern", "Supprimer": "Löschen", "Mobile": "Handy", - "Notifications": "Benachrichtigungen", - "Sauvegarde Mobile": "Mobile Backup", "Commandes": "Befehle", "Paramètres généraux": "Allgemeine Einstellungen", "Nom de l'équipement": "Ausrüstungsname", @@ -223,33 +57,21 @@ "Activer": "Aktivieren", "Visible": "Sichtbar", "Paramètres spécifiques": "Spezifische Einstellungen", + "Verrouiller le menu géolocalisation": "Geolokalisierungsmenü sperren", + "Verrouiller le menu custom": "Benutzerdefiniertes Menü sperren", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Information", "Type de Mobile": "Mobiler Typ", - "iPhone": "iphone", - "Android": "Androide", - "Windows (non officiel)": "Windows (inoffiziell)", "Utilisateur": "Benutzer", - "QRCode": "QR-Code", - "Id Mobile": "IdMobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "RNA", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobil", - "TOKEN": "ZEICHEN", - "ARN pour Monitoring": "ARN zur Überwachung", - "Copier pour Monitoring": "Kopie zur Überwachung", - "Sauvegarde": "Sicherung", - "Sauvegarde Dashboard": "Dashboard-Sicherung", - "Vérification en Cours": "Überprüfung läuft", - "Sauvegarde Favoris": "Favoriten speichern", "Nom": "Name", "Type": "Typ", "Valeur": "Wert", "Actions": "Aktionen" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 – Unbefugter Zugriff", - "Pas de configuration sur ce plugin": "Keine Konfiguration für dieses Plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 – Unbefugter Zugriff", "ERREUR SUR LA COMMANDE": "BESTELLFEHLER" @@ -262,21 +84,9 @@ "Température": "Temperatur" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Kompatible Plugins – Anwendung V1", - "Objets \/ Pièces - Application V1": "Objekte \/ Teile - Anwendung V1", - "Scénarios - Application V1": "Szenarien – Anwendung V1", "Informations envoyées à l'app": "Informationen an die App gesendet", "Gestion des Mobiles": "Mobiles Management", "QrCode": "QR-Code", - "Bien demarrer": "Einen guten Start hinlegen", - "Scénarios - Application V1": "Szenarien – Anwendung V1", - "Menu Custom": "Benutzerdefiniertes Menü", - "Configuration Mobile de la Pièce - Application V1": "Mobile Raumkonfiguration – Anwendung V1", - "Menus enregistrés": "Gespeicherte Menüs", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Kein interner Adressfehler (siehe Konfiguration Ihres Jeedom!)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Kein externer Adressfehler (siehe Konfiguration Ihres Jeedom!)", - "Erreur pas d'utilisateur selectionné": "Fehler: Kein Benutzer ausgewählt", - "Configuration mise à jour": "Aktualisierte Konfiguration", "Nom de la commande": "Befehlsname", "Choisir une icône": "Wählen Sie ein Symbol", "Afficher": "Anzeige", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Nicht autorisierter Zugriff", "Equipement non trouvé : ": "Ausrüstung nicht gefunden:", "User inexistant : ": "Nicht vorhandener Benutzer:", - "scenario non trouvé": "Szenario nicht gefunden", "Aucune methode correspondante à : ": "Keine Methode entsprechend:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Die Kontingente für fcm sind überschritten. Es sind maximal 5 Anfragen pro Minute zulässig", "Echec de l\\'envoi de la notification :": "Benachrichtigung konnte nicht gesendet werden:", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Benachrichtigung konnte nicht gesendet werden: Version 1 der App wird nicht mehr unterstützt!", + "Batterie du téléphone": "Telefonbatterie", + "En charge": "Verantwortlich", + "Coordonnées": "Kontaktdaten", "Notification": "Benachrichtigung", - "Notification Critique": "Kritische Benachrichtigung" + "Notification Critique": "Kritische Benachrichtigung", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Telefoninformationen wiederherstellen", + "Supprimer les Notifications": "Benachrichtigungen löschen", + "Supprimer toutes les Notifications": "Alle Benachrichtigungen löschen", + "Supprimer les Asks expirés": "Abgelaufene Anfragen löschen", + "Supprimer les Asks répondus": "Beantwortete Fragen löschen" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Farbe des Wertindikators", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC-Objekt nicht definiert", "EqLogic inconnu : ": "Unbekanntes EqLogic:", "Cmd inconnu : ": "Unbekannter Befehl:", - "pas d\\'id : ": "keine ID:", - "pas de parametre de geofencing : ": "kein Geofencing-Parameter:", - "Aucune demande": "Keine Anfrage" + "| [ERROR] EqLogic inconnu : ": "| [FEHLER] Unbekannte EqLogic:", + "| Pas de paramètre de geofencing": "| Keine Geofencing-Einstellungen", + "| [ERROR] Paramètre Iq inexistant !": "| [FEHLER] Iq-Parameter existiert nicht!", + "Aucune demande": "Keine Anfrage", + "Aucun": "Keiner" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Achtung: Die v1-App ist nicht mit dem neuesten Android kompatibel. Mit der offiziellen Jeedom-Anwendung können Sie Ihr Jeedom-Hausautomationssystem steuern, sei es im lokalen WLAN oder im 3G\/4G-Netzwerk Ihres Betreibers. Die App verbindet sich automatisch mit Ihrem Jeedom mit automatischer Initialisierung per QR-Code, eine Konfiguration ist nicht erforderlich. (Möglichkeit, dies manuell zu tun) Auf Ihrem Handy finden Sie alle Funktionen Ihres Jeedom. Sie können Ihre Anwendung mit Verknüpfungen und mehr anpassen ... Aktuelle Funktionen: - Verwaltung Ihrer Szenarien. - Verwaltung Ihrer Hausautomation entsprechend Ihren Räumen und Ihrer Ausstattung. - Umschalten und automatische Statusrückgabe - Kompatibilität mit Plugins wie Thermostat, Alarm, Kamera usw. - Anpassbare Benutzeroberfläche mit Verknüpfungen. - Allgemeine Zusammenfassung der Hausautomation und nach Raum - Benachrichtigungen (mit ASK-Unterstützung) - Anzeige von Designs Weitere Funktionen und Kompatibilitäten folgen in zukünftigen Updates! Privatsphäre. Auf unseren Servern werden keine Daten (hausautomatische oder persönliche) gespeichert oder gespeichert" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Bitte beachten Sie: Die BETA-Version unterstützt die V1-App nicht mehr, sie ist für die neue V2-App (derzeit Beta) reserviert. Erfordert mindestens Android14 oder IOS 12.4. Bitte beachten Sie, dass die v1-App nicht mit dem neuesten Android kompatibel ist. Mit der offiziellen Jeedom-Anwendung können Sie Ihr Jeedom-Hausautomationssystem steuern, sei es über lokales WLAN oder über das 3G\/4G-Netzwerk Ihres Betreibers. Die App verbindet sich automatisch mit Ihrem Jeedom mit automatischer Initialisierung per QR-Code, eine Konfiguration ist nicht erforderlich. (Möglichkeit, dies manuell zu tun) Sie finden alle Funktionen Ihres Jeedom auf Ihrem Handy. Sie können Ihre Anwendung mit Verknüpfungen und mehr personalisieren ... Aktuelle Funktionen: - Verwaltung Ihrer Szenarien. - Verwaltung Ihrer Hausautomation entsprechend Ihren Räumen und Ihrer Ausstattung. - Automatische Statusverschiebung und -rückkehr - Kompatibilität mit Plugins wie Thermostat, Alarm, Kamera usw. - Anpassbare Benutzeroberfläche mit Verknüpfungen. - Allgemeine Zusammenfassung der Hausautomation und nach Raum - Benachrichtigungen (mit ASK-Unterstützung) - Anzeige von Designs Weitere Funktionen und Kompatibilität folgen in zukünftigen Updates! Respekt vor der Privatsphäre. Auf unseren Servern werden keine Daten (hausautomatische oder persönliche) gespeichert oder aufbewahrt" } } \ No newline at end of file diff --git a/core/i18n/en_US.json b/core/i18n/en_US.json index 1c1c0d0d..23fa9133 100755 --- a/core/i18n/en_US.json +++ b/core/i18n/en_US.json @@ -3,28 +3,6 @@ "Notifications de l'app": "App notifications", "Réponse Ask sensible à la case : ": "Ask answer sensitive to the box:" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Les Pièces - Application V1": "Parts - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Équipement": "Device", - "Type de Mobile": "Mobile Type", - "Utilisateur": "User", - "Dernière activité": "Last activity", - "Date création": "Creation Date", - "Utilisateur non trouvé": "User not found" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "COMPTE MARKET": "MARKET ACCOUNT", - "BOX ID": "BOX-ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "All you have to do is enter your Market ID and password", - "Plusieurs choix sur cet écran :": "Several choices on this screen:", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- You enter the url of your Jeedom (internal or external), as well as the access identifiers to it and you confirm with the LOGIN button", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- You click on QR Code: a new screen appears; you can scan a QRCode from the Mobile plugin of the box you want to add, via the QRCODE tab of the plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Unauthorized Access", "Équipement": "Equipment", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "User not found", "Configuration Menu Enregistrée": "Saved Menu Configuration" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Plugins Spéciaux Compatibles": "Compatible Special Plugins", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Available in the list of plugins and integrated into the Dashboard of the Mobile App", - "Plugins Validés Type générique": "Validated plugins Generic type", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visible in the app, may require a generic type, may be disabled", - "Plugins compatibles non transmis": "Compatible plugins not transmitted", - "Ne sont pas transmis à l’App Mobile.": "Are not transmitted to the Mobile App", - "Plugins non testés transmis à l'application": "Untested plugins transmitted to the application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Are transmitted to the Mobile App based on generic types", - "Plugins non testés et non transmis": "Plugins not tested and not transmitted", - "Ne sont pas transmis à l’App Mobile": "Are not transmitted to the Mobile App" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Fonctionnement de la Géolocalisation": "How Geolocation works", - "On ajoute une zone de Géolocalisation": "We add a Geolocation zone", - "On recherche l'adresse, on nomme la Zone, et on valide": "We search for the address, name the Zone, and validate", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "The zone will appear in red, meaning that you are not in the Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "If you are in the area when it is created, it will turn green after a few seconds", - "Modifier largueur de la zone": "Change zone width", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Adding a zone will add a binary command to your telephone equipment in the Mobile plugin, which we can use to program actions based on its state" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "ADDING THE BOX TO YOUR MOBILE APP", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "You can choose a user: a QRCode will be generated. You can then scan the QRCode from the new application, and thus add this box to your application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Error No external address (see configuration of your Jeedom!)", "Erreur Pas d\\'utilisateur selectionné": "Error No user selected" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Personnalisation du Menu": "Menu Customization", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "You can customize the Menu of your WebView via the Mobile plugin or the application", - "On clique sur Menu Custom": "We click on Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "A modal opens and offers you your phones already connected", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Click on Configure Menu on the chosen phone", - "Le nombre d'icônes peut aller de 1 à 4": "The number of icons can range from 1 to 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "By checking Menu Default, the menu configured on this phone becomes the default on all your phones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via the Mobile application: if you have configured a default box, then the Custom Menu appears in the application menu", - "Même principe que via le plugin Mobile": "Same principle as via the Mobile plugin" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "To connect your phone: there are 2 possible methods" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Unauthorized access", - "Pause": "Pause", - "Rechercher": "Search" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Envoi auprès de l'app mobile": "Sending to the mobile app", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "This plugin is fully compatible, it requires no action on your part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "This plugin is compatible, remember to check the Generic Types on the commands", - "Activer": "Activate", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "The Plugin is not compatible, you can activate it if you wish", - "Type Générique du Plugin": "Generic Plugin Type", - "Sauvegarder": "Save", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Name of the order", - "Type Générique": "Type generic", - "Icône": "Icon", - "Aucun": "None", - " . $info['family'] . ": "$ info ['family']", - "Plugins compatibles": "Compatible plugins", - "Modifications sauvegardées avec succès": "Changes successfully saved", - "Sauvegarde effectuée": "Backup completed" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Unauthorized access", - "Scénarios": "Scenarios", - "Sauvegarder": "Save", - "ID": "Id", - "Scénario": "Scenario", - "Transmis": "Transmitted", - "Actions": "Actions", - "Envoyer à l\\'application": "Send to application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Envoyer cette pièce vers l\\'application": "Send this part to the application", - "Activer": "Activate", - "Type Générique de cet objet": "Generic type of this object", - "Sauvegarder": "Save", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Name of the order", - "Type Générique": "Type generic", - "Icône": "Icon", - "Aucun": "None", - " . $info['family'] . ": "$ info ['family']", - "Objets \/ Pièces": "Objects \/ Pieces", - "Modifications sauvegardées avec succès": "Changes successfully saved", - "Sauvegarde effectuée avec succès": "Successfully saved" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "JSON valide": "Valid json", - "Objets \/ Pièces": "Objects \/ Pieces", - "Modules": "Modules", - "Commandes": "Commands", - "Scénarios": "Scenarios", - "Messages": "Posts", - "Designs": "Designs", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Fonctionnement de la Géolocalisation": "How Geolocation works", - "On ajoute une zone de Géolocalisation": "We add a Geolocation zone", - "On recherche l'adresse, on nomme la Zone, et on valide": "We search for the address, name the Zone, and validate", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "The zone will appear in red, meaning that you are not in the Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "If you are in the area when it is created, it will turn green after a few seconds", - "Modifier largueur de la zone": "Change zone width", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Adding a zone will add a binary command to your telephone equipment in the Mobile plugin, which you can use to program actions based on its state" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "To access features such as Notifications, Menu Personalization or Geolocation, you must first have selected at least one current box", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "To do this, in the Boxes tab, you must select a box and identify yourself", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Once the identifiers have been entered, the box moves to the top of the list", - "Si elle répond au ping, elle a un voyant vert": "If it responds to the ping, it has a green light", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "You can click on Synchronize to update the status of the boxes", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "To access all the features, you must click on the configured box; this will allow the application to retrieve its information, and therefore authorize the menu displays", - "Menu Complet": "Full Menu" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Équipement": "Equipment", - "Type de Mobile": "Mobile Type", - "Utilisateur": "User", - "Menu Enregistrés": "Menu Saved", - "Aucun menu enregistré": "No saved menu", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NOT INSTALLED", - "Utilisateur non trouvé": "User not found", - "Configuration Menu Enregistrée": "Saved Menu Configuration" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Unauthorized Access" }, @@ -194,25 +35,18 @@ "Configuration": "Setup", "Gestion Mobiles": "Mobile Management", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Backups Menu Custom Mobile", - "Documentation APP": "APP Documentation", "Mes Téléphones Mobiles": "My Mobile Phones", "Rechercher": "Search", "Équipement visible": "Visible equipment", "Équipement non visible": "Equipment not visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "To add a phone, there are 2 possible methods:", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "On the first screen of the application, you are offered to connect your market account, and thus find all the boxes associated with this account, or simply add a box", "App V1": "App V1", - "Ajouter": "Add", - "Plugins": "Plugins", - "Objets\/Pièces": "Items\/Parts", - "Scénarios": "Scenarios", - "Régénérer la configuration": "Regenerate configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Please note, in beta it is no longer possible to use APP V1", "Configuration avancée": "Advanced configuration", - "Infos envoyées à l'app": "Info sent to the app", "Sauvegarder": "Save", "Supprimer": "Delete", "Mobile": "Mobile", - "Notifications": "Notifications", - "Sauvegarde Mobile": "Mobile Backup", "Commandes": "Commands", "Paramètres généraux": "General settings", "Nom de l'équipement": "Equipment Name", @@ -223,33 +57,21 @@ "Activer": "Activate", "Visible": "Visible", "Paramètres spécifiques": "Specific settings", + "Verrouiller le menu géolocalisation": "Lock the geolocation menu", + "Verrouiller le menu custom": "Lock the custom menu", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Information", "Type de Mobile": "Mobile Type", - "iPhone": "iphone", - "Android": "Android", - "Windows (non officiel)": "Windows (unofficial)", "Utilisateur": "User", - "QRCode": "QRCode", - "Id Mobile": "IdMobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "RNA", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN for Monitoring", - "Copier pour Monitoring": "Copy for Monitoring", - "Sauvegarde": "Backup", - "Sauvegarde Dashboard": "Dashboard Backup", - "Vérification en Cours": "Verification in progress", - "Sauvegarde Favoris": "Save Favorites", "Nom": "Name", "Type": "Type", "Valeur": "Value", "Actions": "Shares" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Unauthorized Access", - "Pas de configuration sur ce plugin": "No configuration on this plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Unauthorized Access", "ERREUR SUR LA COMMANDE": "ORDER ERROR" @@ -262,21 +84,9 @@ "Température": "Temperature" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Compatible plugins - Application V1", - "Objets \/ Pièces - Application V1": "Objects \/ Parts - Application V1", - "Scénarios - Application V1": "Scenarios - Application V1", "Informations envoyées à l'app": "Information sent to the app", "Gestion des Mobiles": "Mobile Management", "QrCode": "QrCode", - "Bien demarrer": "Get off to a good start", - "Scénarios - Application V1": "Scenarios - Application V1", - "Menu Custom": "Custom menu", - "Configuration Mobile de la Pièce - Application V1": "Mobile Room Configuration - Application V1", - "Menus enregistrés": "Saved menus", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "No internal address error (see configuration of your Jeedom!)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "No external address error (see configuration of your Jeedom!)", - "Erreur pas d'utilisateur selectionné": "Error no user selected", - "Configuration mise à jour": "Updated configuration", "Nom de la commande": "Command name", "Choisir une icône": "Choose an icon", "Afficher": "Display", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Unauthorized access", "Equipement non trouvé : ": "Equipment not found:", "User inexistant : ": "Non-existent user:", - "scenario non trouvé": "scenario not found", "Aucune methode correspondante à : ": "No method corresponding to:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Quotas for fcm are exceeded. The maximum allowed is 5 requests per minute", "Echec de l\\'envoi de la notification :": "Failed to send notification:", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Failed to send notification: App version 1 is no longer supported!", + "Batterie du téléphone": "Phone battery", + "En charge": "In charge", + "Coordonnées": "Contact details", "Notification": "Notification", - "Notification Critique": "Critical Notification" + "Notification Critique": "Critical Notification", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Retrieve phone information", + "Supprimer les Notifications": "Delete Notifications", + "Supprimer toutes les Notifications": "Delete All Notifications", + "Supprimer les Asks expirés": "Delete Expired Asks", + "Supprimer les Asks répondus": "Delete answered Asks" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Value indicator color", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "Unknown EqLogic:", "Cmd inconnu : ": "Unknown Cmd:", - "pas d\\'id : ": "no id:", - "pas de parametre de geofencing : ": "no geofencing parameter:", - "Aucune demande": "No request" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] Unknown EqLogic:", + "| Pas de paramètre de geofencing": "| No geofencing settings", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Iq parameter does not exist!", + "Aucune demande": "No request", + "Aucun": "None" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion the v1 app is not compatible with the latest Android. The official Jeedom application allows you to control your Jeedom home automation system, whether in local Wifi, or on your operator's 3G\/4G network. The app automatically connects to your Jeedom with automatic initialization by QRcode, no configuration is necessary. (possibility to do it manually) You will find on your mobile all the features of your Jeedom. You will be able to customize your application with shortcuts and more... Current features: - Management of your scenarios. - Management of your home automation according to your rooms and equipment. - Shift and automatic status return - Compatibility with plugins, such as thermostat, alarm, camera etc... - Customizable interface with shortcuts. - General home automation summary and by room - Notifications (with ASK support) - Display of Designs More features and compatibilities are coming in future updates! Privacy. No data (home automation or personal) is stored or kept on our servers" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Warning: the BETA version no longer supports the V1 app, it is reserved for the new V2 app (currently beta). Requires Android14 or IOS 12.4 minimum. Please note that the v1 app is not compatible with the latest Android. The official Jeedom application allows you to control your Jeedom home automation system, whether in local WiFi, or on your operator's 3G\/4G network. The app automatically connects to your Jeedom with automatic initialization by QRcode, no configuration is necessary. (possibility to do it manually) You will find all the features of your Jeedom on your mobile. You will be able to customize your application with shortcuts and more... Current features: - Management of your scenarios. - Management of your home automation based on your rooms and equipment. - Automatic shift and return to state - Compatibility with plugins, such as thermostat, alarm, camera etc... - Customizable interface with shortcuts. - General and room-by-room home automation summary - Notifications (with ASK support) - Displaying Designs More features and compatibilities are coming in future updates! Respect for privacy. No data (home automation or personal) is stored or kept on our servers" } } \ No newline at end of file diff --git a/core/i18n/es_ES.json b/core/i18n/es_ES.json index 838aa4ae..15941bda 100755 --- a/core/i18n/es_ES.json +++ b/core/i18n/es_ES.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notificaciones de aplicaciones", "Réponse Ask sensible à la case : ": "Pregunta respuesta sensible a la caja:" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Les Pièces - Application V1": "Piezas - Aplicación V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Équipement": "Dispositivos", - "Type de Mobile": "Tipo de móvil", - "Utilisateur": "Usuario", - "Dernière activité": "Última actividad", - "Date création": "Fecha de creación", - "Utilisateur non trouvé": "Usuario no encontrado" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "COMPTE MARKET": "CUENTA DE MERCADO", - "BOX ID": "BOX-ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Todo lo que tiene que hacer es ingresar su Market ID y contraseña", - "Plusieurs choix sur cet écran :": "Varias opciones en esta pantalla:", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Ingresas la url de tu Jeedom (interna o externa), así como los identificadores de acceso a la misma y confirmas con el botón LOGIN", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Haces clic en Código QR: aparece una nueva pantalla; puede escanear un QRCode desde el complemento móvil del cuadro que desea agregar, a través de la pestaña QRCODE del complemento" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Acceso no autorizado", "Équipement": "Equipo", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Usuario no encontrado", "Configuration Menu Enregistrée": "Configuración del menú guardado" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Plugins Spéciaux Compatibles": "Complementos especiales compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponible en la lista de complementos e integrado en el Panel de la aplicación móvil", - "Plugins Validés Type générique": "Complementos validados Tipo genérico", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visible en la aplicación, puede requerir un tipo genérico, puede estar deshabilitado", - "Plugins compatibles non transmis": "Complementos compatibles no transmitidos", - "Ne sont pas transmis à l’App Mobile.": "No se transmiten a la aplicación móvil", - "Plugins non testés transmis à l'application": "Complementos no probados transmitidos a la aplicación", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Se transmiten a la aplicación móvil en base a tipos genéricos", - "Plugins non testés et non transmis": "Complementos no probados y no transmitidos", - "Ne sont pas transmis à l’App Mobile": "No se transmiten a la aplicación móvil" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Fonctionnement de la Géolocalisation": "Cómo funciona la geolocalización", - "On ajoute une zone de Géolocalisation": "Agregamos una zona de Geolocalización", - "On recherche l'adresse, on nomme la Zone, et on valide": "Buscamos la dirección, nombramos la Zona y validamos", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zona aparecerá en rojo, lo que significa que no estás en la Zona", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si estás en el área cuando se crea, se volverá verde después de unos segundos", - "Modifier largueur de la zone": "Cambiar ancho de zona", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Agregar una zona agregará un comando binario a tu equipo telefónico en el complemento Móvil, que podremos utilizar para programar acciones en función de su estado" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AGREGAR LA CAJA A SU APLICACIÓN MÓVIL", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Puedes elegir un usuario: se generará un QRCode. Luego podrás escanear el QRCode desde la nueva aplicación, y así agregar este cuadro a tu aplicación", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Error Sin dirección externa (ver configuración de su Jeedom!)", "Erreur Pas d\\'utilisateur selectionné": "Error Ningún usuario seleccionado" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Personnalisation du Menu": "Personalización del menú", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Puede personalizar el menú de su WebView a través del complemento móvil o la aplicación", - "On clique sur Menu Custom": "Damos clic en Menú Personalizado", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Se abre un modal y te ofrece tus teléfonos ya conectados", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Haga clic en Configurar Menú en el teléfono elegido", - "Le nombre d'icônes peut aller de 1 à 4": "El número de iconos puede variar de 1 a 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "Al marcar Menú predeterminado, el menú configurado en este teléfono se convierte en el predeterminado en todos sus teléfonos", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "A través de la aplicación móvil: si ha configurado un cuadro predeterminado, aparece el Menú personalizado en el menú de la aplicación", - "Même principe que via le plugin Mobile": "Mismo principio que a través del complemento móvil" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Para conectar su teléfono: hay 2 métodos posibles" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Pause": "Pausa", - "Rechercher": "Buscar" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Envoi auprès de l'app mobile": "Envío a la aplicación móvil", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Este complemento es totalmente compatible, no requiere ninguna acción por su parte", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Este complemento es compatible, recuerde verificar los tipos genéricos en los comandos", - "Activer": "Activar", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "El Plugin no es compatible, puedes activarlo si lo deseas", - "Type Générique du Plugin": "Tipo de complemento genérico", - "Sauvegarder": "Guardar", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nombre de la orden", - "Type Générique": "Tipo genérico", - "Icône": "Icono", - "Aucun": "Ninguna", - " . $info['family'] . ": "$ info ['familia']", - "Plugins compatibles": "Complementos compatibles", - "Modifications sauvegardées avec succès": "Cambios guardados exitosamente", - "Sauvegarde effectuée": "Guardado correctamente" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Scénarios": "Escenarios", - "Sauvegarder": "Guardar", - "ID": "Identificación", - "Scénario": "Escenario", - "Transmis": "Transmitido", - "Actions": "Acciones", - "Envoyer à l\\'application": "Enviar a la solicitud" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Envoyer cette pièce vers l\\'application": "Enviar esta parte a la aplicación", - "Activer": "Activar", - "Type Générique de cet objet": "Tipo genérico de este objeto", - "Sauvegarder": "Guardar", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nombre de la orden", - "Type Générique": "Tipo genérico", - "Icône": "Icono", - "Aucun": "Ninguna", - " . $info['family'] . ": "$ info ['familia']", - "Objets \/ Pièces": "Objetos \/ Piezas", - "Modifications sauvegardées avec succès": "Cambios guardados exitosamente", - "Sauvegarde effectuée avec succès": "Guardado correctamente" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "JSON valide": "Json válido", - "Objets \/ Pièces": "Objetos \/ Piezas", - "Modules": "Módulos", - "Commandes": "Comandos", - "Scénarios": "Escenarios", - "Messages": "Mensajes", - "Designs": "Diseños", - "Configurations": "Configuraciones" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Fonctionnement de la Géolocalisation": "Cómo funciona la geolocalización", - "On ajoute une zone de Géolocalisation": "Agregamos una zona de Geolocalización", - "On recherche l'adresse, on nomme la Zone, et on valide": "Buscamos la dirección, nombramos la Zona y validamos", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zona aparecerá en rojo, lo que significa que no estás en la Zona", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si estás en el área cuando se crea, se volverá verde después de unos segundos", - "Modifier largueur de la zone": "Cambiar ancho de zona", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Agregar una zona agregará un comando binario a su equipo telefónico en el complemento Móvil, que puede usar para programar acciones según su estado" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Para acceder a funciones como Notificaciones, Personalización de Menú o Geolocalización, primero debes haber seleccionado al menos una casilla actual", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Para ello, en la pestaña Casillas, deberás seleccionar una casilla e identificarte", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Una vez que se han ingresado los identificadores, el cuadro se mueve a la parte superior de la lista", - "Si elle répond au ping, elle a un voyant vert": "Si responde al ping tiene luz verde", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "Puede hacer clic en Sincronizar para actualizar el estado de las casillas", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Para acceder a todas las funciones, debe hacer clic en la casilla configurada; esto permitirá que la aplicación recupere su información y, por lo tanto, autorizará la visualización del menú", - "Menu Complet": "Menú completo" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Équipement": "Equipo", - "Type de Mobile": "Tipo de móvil", - "Utilisateur": "Usuario", - "Menu Enregistrés": "Menú guardado", - "Aucun menu enregistré": "No hay menú guardado", - "APPLICATION V2 NON INTALLÉE": "APLICACIÓN V2 NO INSTALADA", - "Utilisateur non trouvé": "Usuario no encontrado", - "Configuration Menu Enregistrée": "Configuración del menú guardado" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Acceso no autorizado" }, @@ -194,25 +35,18 @@ "Configuration": "Configuración", "Gestion Mobiles": "Gestión Móvil", "QR Code": "Código QR", - "Sauvegardes Menu Custom Mobile": "Menú de copias de seguridad Móvil personalizado", - "Documentation APP": "Documentación de la aplicación", "Mes Téléphones Mobiles": "Mis teléfonos móviles", "Rechercher": "Buscar", "Équipement visible": "Equipos visibles", "Équipement non visible": "Equipo no visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Para agregar un teléfono, existen 2 métodos posibles:", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "En la primera pantalla de la aplicación, se le solicita que conecte su cuenta de mercado, y así encontrar todas las casillas asociadas a esta cuenta, o simplemente agregar una casilla", "App V1": "Aplicación V1", - "Ajouter": "Añadir", - "Plugins": "Plugins", - "Objets\/Pièces": "Artículos\/Piezas", - "Scénarios": "Escenarios", - "Régénérer la configuration": "Regenerar configuración", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Tenga en cuenta que en versión beta ya no es posible utilizar la APLICACIÓN V1", "Configuration avancée": "Configuración avanzada", - "Infos envoyées à l'app": "Información enviada a la aplicación", "Sauvegarder": "Guardar", "Supprimer": "Borrar", "Mobile": "Móvil", - "Notifications": "Notificaciones", - "Sauvegarde Mobile": "Copia de seguridad móvil", "Commandes": "Comandos", "Paramètres généraux": "Configuración general", "Nom de l'équipement": "Nombre del equipo", @@ -223,33 +57,21 @@ "Activer": "Activar", "Visible": "Visible", "Paramètres spécifiques": "Configuraciones específicas", + "Verrouiller le menu géolocalisation": "Bloquear menú de geolocalización", + "Verrouiller le menu custom": "Bloquear menú personalizado", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Información", "Type de Mobile": "Tipo de móvil", - "iPhone": "IPhone", - "Android": "Androide", - "Windows (non officiel)": "Windows (no oficial)", "Utilisateur": "Usuario", - "QRCode": "Código QR", - "Id Mobile": "IDMobile", - "Iq": "Iq", - "ARN Mobile": "ARN Móvil", - "ARN": "ARN", + "Iq Mobile": "Iq Móvil", "TOKEN Mobile": "TOKEN Móvil", - "TOKEN": "SIMBÓLICO", - "ARN pour Monitoring": "ARN para monitoreo", - "Copier pour Monitoring": "Copia para monitoreo", - "Sauvegarde": "Respaldo", - "Sauvegarde Dashboard": "Copia de seguridad del panel", - "Vérification en Cours": "Verificación en progreso", - "Sauvegarde Favoris": "Guardar favoritos", "Nom": "Nombre", "Type": "Tipo", "Valeur": "Valor", "Actions": "Comportamiento" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Acceso no autorizado", - "Pas de configuration sur ce plugin": "No hay configuración en este complemento" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Acceso no autorizado", "ERREUR SUR LA COMMANDE": "ERROR DE ORDEN" @@ -262,21 +84,9 @@ "Température": "Temperatura" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Complementos compatibles: Aplicación V1", - "Objets \/ Pièces - Application V1": "Objetos \/ Piezas - Aplicación V1", - "Scénarios - Application V1": "Escenarios - Aplicación V1", "Informations envoyées à l'app": "Información enviada a la aplicación", "Gestion des Mobiles": "Gestión Móvil", "QrCode": "Código QR", - "Bien demarrer": "Empezar bien", - "Scénarios - Application V1": "Escenarios - Aplicación V1", - "Menu Custom": "Menú personalizado", - "Configuration Mobile de la Pièce - Application V1": "Configuración de sala móvil: aplicación V1", - "Menus enregistrés": "Menús guardados", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "No hay error de dirección interna (¡consulte la configuración de su Jeedom!)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Sin error de dirección externa (¡consulte la configuración de su Jeedom!)", - "Erreur pas d'utilisateur selectionné": "Error ningún usuario seleccionado", - "Configuration mise à jour": "Configuración actualizada", "Nom de la commande": "Nombre del comando", "Choisir une icône": "Elige un icono", "Afficher": "Mostrar", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Acceso no autorizado", "Equipement non trouvé : ": "Equipo no encontrado:", "User inexistant : ": "Usuario inexistente:", - "scenario non trouvé": "escenario no encontrado", "Aucune methode correspondante à : ": "Ningún método correspondiente a:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Se superan las cuotas de fcm. El máximo permitido es 5 solicitudes por minuto", "Echec de l\\'envoi de la notification :": "Error al enviar la notificación:", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-'. $geoloc['nombre']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "No se pudo enviar la notificación: ¡la versión 1 de la aplicación ya no es compatible!", + "Batterie du téléphone": "Batería del teléfono", + "En charge": "Encargado", + "Coordonnées": "Detalles de contacto", "Notification": "Notificación", - "Notification Critique": "Notificación crítica" + "Notification Critique": "Notificación crítica", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Recuperar información del teléfono", + "Supprimer les Notifications": "Eliminar notificaciones", + "Supprimer toutes les Notifications": "Eliminar todas las notificaciones", + "Supprimer les Asks expirés": "Eliminar preguntas caducadas", + "Supprimer les Asks répondus": "Eliminar preguntas respondidas" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Color del indicador de valor", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "Objeto JSONRPC no definido", "EqLogic inconnu : ": "EqLogic desconocido:", "Cmd inconnu : ": "Cmd desconocido:", - "pas d\\'id : ": "sin identificación:", - "pas de parametre de geofencing : ": "sin parámetro de geocerca:", - "Aucune demande": "Ninguna solicitud" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic desconocido:", + "| Pas de paramètre de geofencing": "| Sin configuración de geocercas", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] ¡El parámetro Iq no existe!", + "Aucune demande": "Ninguna solicitud", + "Aucun": "Ninguno" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion, la aplicación v1 no es compatible con la última versión de Android. La aplicación oficial Jeedom le permite controlar su sistema domótico Jeedom, ya sea en Wifi local o en la red 3G\/4G de su operador. La aplicación se conecta automáticamente a su Jeedom con inicialización automática por código QR, no es necesaria ninguna configuración. (posibilidad de hacerlo manualmente) Encontrará en su móvil todas las características de su Jeedom. Podrás personalizar tu aplicación con accesos directos y más... Características actuales: - Gestión de sus escenarios. - Gestión de la domótica de tu hogar según tus estancias y equipamientos. - Turno y retorno de estado automático - Compatibilidad con complementos, como termostato, alarma, cámara, etc. - Interfaz personalizable con accesos directos. - Resumen domótica general y por estancias - Notificaciones (con soporte ASK) - Exhibición de Diseños ¡Más características y compatibilidades vendrán en futuras actualizaciones! Privacidad. Ningún dato (domótico o personal) es almacenado o guardado en nuestros servidores" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Tenga en cuenta: la versión BETA ya no es compatible con la aplicación V1, está reservada para la nueva aplicación V2 (actualmente beta). Requiere Android14 o IOS 12.4 mínimo. Tenga en cuenta que la aplicación v1 no es compatible con la última versión de Android. La aplicación oficial Jeedom te permite controlar tu sistema domótico Jeedom, ya sea a través de WiFi local o en la red 3G\/4G de tu operador. La aplicación se conecta automáticamente a tu Jeedom con inicialización automática mediante código QR, no es necesaria ninguna configuración. (posibilidad de hacerlo manualmente) Encontrarás todas las funciones de tu Jeedom en tu móvil. Podrás personalizar tu aplicación con atajos y más... Características actuales: - Gestión de tus escenarios. - Gestión de tu domótica en función de tus estancias y equipamientos. - Cambio y retorno automático de estado. - Compatibilidad con complementos, como termostato, alarma, cámara, etc... - Interfaz personalizable con atajos. - Resumen general de domótica y por estancias - Notificaciones (con soporte ASK) - Exhibición de Diseños ¡Más funciones y compatibilidad estarán disponibles en futuras actualizaciones! Respeto a la privacidad. No se almacena ni retiene ningún dato (domótico o personal) en nuestros servidores" } } \ No newline at end of file diff --git a/core/i18n/fr_FR.json b/core/i18n/fr_FR.json index dabee3ec..3afb5af9 100755 --- a/core/i18n/fr_FR.json +++ b/core/i18n/fr_FR.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case : " }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin." - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile.", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques.", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état." - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pause": "Pause", - "Rechercher": "Rechercher" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "Activer", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "Sauvegarder", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Type Générique", - "Icône": "Icône", - "Aucun": "Aucun", - " . $info['family'] . ": " . $info['family'] . ", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée": "Sauvegarde effectuée" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Scénarios": "Scénarios", - "Sauvegarder": "Sauvegarder", - "ID": "ID", - "Scénario": "Scénario", - "Transmis": "Transmis", - "Actions": "Actions", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "Activer", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "Sauvegarder", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Type Générique", - "Icône": "Icône", - "Aucun": "Aucun", - " . $info['family'] . ": " . $info['family'] . ", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée avec succès": "Sauvegarde effectuée avec succès" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "Commandes", - "Scénarios": "Scénarios", - "Messages": "Messages", - "Designs": "Designs", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état." - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste.", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "Configuration", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "Rechercher", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.", "App V1": "App V1", - "Ajouter": "Ajouter", - "Plugins": "Plugins", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "Scénarios", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "Configuration avancée", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "Sauvegarder", "Supprimer": "Supprimer", "Mobile": "Mobile", - "Notifications": "Notifications", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "Commandes", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "Activer", "Visible": "Visible", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "Nom", "Type": "Type", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Accès non autorisé", "Equipement non trouvé : ": "Equipement non trouvé : ", "User inexistant : ": "User inexistant : ", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "Aucune methode correspondante à : " }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu : ", "Cmd inconnu : ": "Cmd inconnu : ", - "pas d\\'id : ": "pas d\\'id : ", - "pas de parametre de geofencing : ": "pas de parametre de geofencing : ", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu : ", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs." + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs." } } \ No newline at end of file diff --git a/core/i18n/id_ID.json b/core/i18n/id_ID.json index 25fce231..6cbe1f5b 100755 --- a/core/i18n/id_ID.json +++ b/core/i18n/id_ID.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case :" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Peralatan", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Akses tidak sah", - "Pause": "Berhenti Sebentar", - "Rechercher": "Pencarian" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "Mengaktifkan", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "Menyimpan", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Jenis generik", - "Icône": "Icon", - "Aucun": "Tak ada", - " . $info['family'] . ": ". $info['family'] .", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée": "Backup dibuat" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Akses tidak sah", - "Scénarios": "Skenario", - "Sauvegarder": "Menyimpan", - "ID": "ID", - "Scénario": "Skenario", - "Transmis": "Transmis", - "Actions": "Tindakan", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "Mengaktifkan", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "Menyimpan", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Jenis generik", - "Icône": "Icon", - "Aucun": "Tak ada", - " . $info['family'] . ": ". $info['family'] .", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée avec succès": "Cadangan selesai dengan sukses" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "Perintah", - "Scénarios": "Skenario", - "Messages": "Posting", - "Designs": "Desain", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "Konfigurasi", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "Pencarian", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", "App V1": "App V1", - "Ajouter": "Tambahan", - "Plugins": "Plugins", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "Skenario", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "Konfigurasi lanjutan", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "Menyimpan", "Supprimer": "Menghapus", "Mobile": "Mobil", - "Notifications": "Pemberitahuan", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "Perintah", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "Mengaktifkan", "Visible": "Terlihat", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "Nama", "Type": "Jenis", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Akses tidak sah", "Equipement non trouvé : ": "Equipement non trouvé :", "User inexistant : ": "User inexistant :", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "Aucune methode correspondante à :" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu :", "Cmd inconnu : ": "Cmd inconnu :", - "pas d\\'id : ": "pas d\\'id :", - "pas de parametre de geofencing : ": "pas de parametre de geofencing :", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu :", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" } } \ No newline at end of file diff --git a/core/i18n/it_IT.json b/core/i18n/it_IT.json index 9162cd52..266d335e 100755 --- a/core/i18n/it_IT.json +++ b/core/i18n/it_IT.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case :" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Dispositivo", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Accesso non autorizzato", - "Pause": "Pausa", - "Rechercher": "Ricercare" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "Attivare", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "Salva", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Tipo generico", - "Icône": "Icona", - "Aucun": "Nessuno", - " . $info['family'] . ": ". $info['family'] .", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée": "Backup completato" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Accesso non autorizzato", - "Scénarios": "Scenari", - "Sauvegarder": "Salva", - "ID": "ID", - "Scénario": "Scena", - "Transmis": "Transmis", - "Actions": "Stock", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "Attivare", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "Salva", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Tipo generico", - "Icône": "Icona", - "Aucun": "Nessuno", - " . $info['family'] . ": ". $info['family'] .", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée avec succès": "Backup completato con successo" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "Comandi", - "Scénarios": "Scenari", - "Messages": "Messaggi", - "Designs": "Disegni", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "Configurazione", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "Ricercare", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", "App V1": "App V1", - "Ajouter": "Aggiungi", - "Plugins": "Plugins", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "Scenari", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "Configurazione avanzata", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "Salva", "Supprimer": "Rimuovere", "Mobile": "Mobile", - "Notifications": "Notifiche", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "Comandi", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "Attivare", "Visible": "Visibile", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "Nome", "Type": "Tipo", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Accesso non autorizzato", "Equipement non trouvé : ": "Equipement non trouvé :", "User inexistant : ": "User inexistant :", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "Nessun metodo corrispondente a:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu :", "Cmd inconnu : ": "Cmd sconosciuto:", - "pas d\\'id : ": "pas d\\'id :", - "pas de parametre de geofencing : ": "pas de parametre de geofencing :", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu :", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" } } \ No newline at end of file diff --git a/core/i18n/ja_JP.json b/core/i18n/ja_JP.json index 1aec4f30..db3eb6ca 100755 --- a/core/i18n/ja_JP.json +++ b/core/i18n/ja_JP.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case :" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "設備", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401-不正アクセス", - "Pause": "休止", - "Rechercher": "検索" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "アクティブ", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "セーブ", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "ジェネリック型", - "Icône": "アイコン", - "Aucun": "何でもありません", - " . $info['family'] . ": "。 $ info ['family']。", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "変更が保存されました", - "Sauvegarde effectuée": "バックアップ完了" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401-不正アクセス", - "Scénarios": "シナリオ", - "Sauvegarder": "セーブ", - "ID": "ID", - "Scénario": "シナリオ", - "Transmis": "Transmis", - "Actions": "株式", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "アクティブ", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "セーブ", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "ジェネリック型", - "Icône": "アイコン", - "Aucun": "何でもありません", - " . $info['family'] . ": "。 $ info ['family']。", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "変更が保存されました", - "Sauvegarde effectuée avec succès": "バックアップが正常に完了" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "コマンド", - "Scénarios": "シナリオ", - "Messages": "投稿", - "Designs": "デザイン", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "コンフィギュレーション", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "検索", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", "App V1": "App V1", - "Ajouter": "加えます", - "Plugins": "プラグイン", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "シナリオ", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "高度な構成", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "セーブ", "Supprimer": "取り除きます", "Mobile": "モバイル", - "Notifications": "通知", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "コマンド", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "アクティブ", "Visible": "目に見えます", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "表題", "Type": "タイプ", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401-不正アクセス", "Equipement non trouvé : ": "Equipement non trouvé :", "User inexistant : ": "User inexistant :", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "以下に対応するメソッドはありません:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu :", "Cmd inconnu : ": "不明なコマンド:", - "pas d\\'id : ": "pas d\\'id :", - "pas de parametre de geofencing : ": "pas de parametre de geofencing :", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu :", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" } } \ No newline at end of file diff --git a/core/i18n/pt_PT.json b/core/i18n/pt_PT.json index 1978fe73..077607eb 100755 --- a/core/i18n/pt_PT.json +++ b/core/i18n/pt_PT.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notificações de aplicativos", "Réponse Ask sensible à la case : ": "Peça resposta sensível à caixa:" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Les Pièces - Application V1": "Peças - Aplicação V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Équipement": "Equipamento", - "Type de Mobile": "Tipo de celular", - "Utilisateur": "Do utilizador", - "Dernière activité": "Ultima atividade", - "Date création": "Data de criação", - "Utilisateur non trouvé": "Usuário não encontrado" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "COMPTE MARKET": "CONTA DE MERCADO", - "BOX ID": "BOX-ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Tudo o que você precisa fazer é inserir seu Market ID e senha", - "Plusieurs choix sur cet écran :": "Várias opções nesta tela:", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Você insere a url do seu Jeedom (interno ou externo), bem como os identificadores de acesso a ele e confirma com o botão LOGIN", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Você clica em QR Code: uma nova tela aparece; você pode digitalizar um QRCode do plug-in Mobile da caixa que deseja adicionar, por meio da guia QRCODE do plug-in" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Acesso não autorizado", "Équipement": "Equipamento", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Usuário não encontrado", "Configuration Menu Enregistrée": "Configuração de menu salva" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Plugins Spéciaux Compatibles": "Plugins Especiais Compatíveis", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponível na lista de plug-ins e integrado ao Painel do aplicativo móvel", - "Plugins Validés Type générique": "Plug-ins validados Tipo genérico", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visível no aplicativo, pode exigir um tipo genérico, pode estar desativado", - "Plugins compatibles non transmis": "Plugins compatíveis não transmitidos", - "Ne sont pas transmis à l’App Mobile.": "Não são transmitidos para o aplicativo móvel", - "Plugins non testés transmis à l'application": "Plugins não testados transmitidos ao aplicativo", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "São transmitidos para o aplicativo móvel com base em tipos genéricos", - "Plugins non testés et non transmis": "Plugins não testados e não transmitidos", - "Ne sont pas transmis à l’App Mobile": "Não são transmitidos para o aplicativo móvel" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Fonctionnement de la Géolocalisation": "Como funciona a geolocalização", - "On ajoute une zone de Géolocalisation": "Adicionamos uma zona de geolocalização", - "On recherche l'adresse, on nomme la Zone, et on valide": "Procuramos o endereço, nomeamos a Zona e validamos", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "A zona aparecerá em vermelho, significando que você não está na Zona", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Se você estiver na área quando ela for criada, ela ficará verde após alguns segundos", - "Modifier largueur de la zone": "Alterar largura da zona", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Adicionar uma zona adicionará um comando binário ao seu equipamento telefônico no plugin Mobile, que podemos usar para programar ações com base em seu estado" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "ADICIONANDO A CAIXA AO SEU APLICATIVO MÓVEL", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Você pode escolher um usuário: um QRCode será gerado. Você pode então escanear o QRCode do novo aplicativo, e assim adicionar esta caixa ao seu aplicativo", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erro Sem endereço externo (veja a configuração do seu Jeedom!)", "Erreur Pas d\\'utilisateur selectionné": "Erro Nenhum usuário selecionado" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Personnalisation du Menu": "Personalização do Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Você pode personalizar o Menu do seu WebView através do plugin Mobile ou do aplicativo", - "On clique sur Menu Custom": "Clicamos em Menu Personalizado", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Um modal abre e oferece seus telefones já conectados", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Clique em Configurar Menu no telefone escolhido", - "Le nombre d'icônes peut aller de 1 à 4": "O número de ícones pode variar de 1 a 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "Ao marcar Menu Padrão, o menu configurado neste telefone se torna o padrão em todos os seus telefones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Através do aplicativo Mobile: se você configurou uma caixa padrão, o Menu Personalizado aparece no menu do aplicativo", - "Même principe que via le plugin Mobile": "O mesmo princípio do plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Para conectar seu telefone: existem 2 métodos possíveis" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Pause": "Pausa", - "Rechercher": "Pesquisa" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Envoi auprès de l'app mobile": "Enviando para o aplicativo móvel", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Este plugin é totalmente compatível, não requer nenhuma ação de sua parte", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Este plugin é compatível, lembre-se de verificar os Tipos Genéricos nos comandos", - "Activer": "Ativar", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "O Plugin não é compatível, você pode ativá-lo se desejar", - "Type Générique du Plugin": "Tipo genérico de plug-in", - "Sauvegarder": "Salvar", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nome do comando", - "Type Générique": "Tipo genérico", - "Icône": "ícone", - "Aucun": "Nemhum", - " . $info['family'] . ": "$ info ['família']", - "Plugins compatibles": "Plugins compatíveis", - "Modifications sauvegardées avec succès": "Alterações salvas com sucesso", - "Sauvegarde effectuée": "Backup feito" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Scénarios": "Cenas", - "Sauvegarder": "Salvar", - "ID": "ID", - "Scénario": "Cenas", - "Transmis": "Transmitido", - "Actions": "Estoque", - "Envoyer à l\\'application": "Enviar para a aplicação" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Envoyer cette pièce vers l\\'application": "Envie esta parte para o aplicativo", - "Activer": "Ativar", - "Type Générique de cet objet": "Tipo genérico deste objeto", - "Sauvegarder": "Salvar", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nome do comando", - "Type Générique": "Tipo genérico", - "Icône": "ícone", - "Aucun": "Nemhum", - " . $info['family'] . ": "$ info ['família']", - "Objets \/ Pièces": "Objetos \/ Peças", - "Modifications sauvegardées avec succès": "Alterações salvas com sucesso", - "Sauvegarde effectuée avec succès": "Backup concluído com êxito" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "JSON valide": "Json válido", - "Objets \/ Pièces": "Objetos \/ Peças", - "Modules": "Módulos", - "Commandes": "Comandos", - "Scénarios": "Cenas", - "Messages": "Mensagens", - "Designs": "Projetos", - "Configurations": "Configurações" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Fonctionnement de la Géolocalisation": "Como funciona a geolocalização", - "On ajoute une zone de Géolocalisation": "Adicionamos uma zona de geolocalização", - "On recherche l'adresse, on nomme la Zone, et on valide": "Procuramos o endereço, nomeamos a Zona e validamos", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "A zona aparecerá em vermelho, significando que você não está na Zona", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Se você estiver na área quando ela for criada, ela ficará verde após alguns segundos", - "Modifier largueur de la zone": "Alterar largura da zona", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Adicionar uma zona adicionará um comando binário ao seu equipamento telefônico no plugin Mobile, que você pode usar para programar ações com base em seu estado" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Para acessar recursos como Notificações, Personalização de Menu ou Geolocalização, você deve primeiro ter selecionado pelo menos uma caixa atual", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Para isso, na aba Caixas, você deve selecionar uma caixa e se identificar", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Depois que os identificadores forem inseridos, a caixa passará para o topo da lista", - "Si elle répond au ping, elle a un voyant vert": "Se responder ao ping, terá luz verde", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "Você pode clicar em Sincronizar para atualizar o status das caixas", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Para acessar todos os recursos, você deve clicar na caixa configurada; isso permitirá que o aplicativo recupere suas informações e, portanto, autorize a exibição do menu", - "Menu Complet": "Menu completo" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Équipement": "Equipamento", - "Type de Mobile": "Tipo de celular", - "Utilisateur": "Do utilizador", - "Menu Enregistrés": "Menu salvo", - "Aucun menu enregistré": "Nenhum menu salvo", - "APPLICATION V2 NON INTALLÉE": "APLICATIVO V2 NÃO INSTALADO", - "Utilisateur non trouvé": "Usuário não encontrado", - "Configuration Menu Enregistrée": "Configuração de menu salva" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Acesso não autorizado" }, @@ -194,25 +35,18 @@ "Configuration": "Configuração", "Gestion Mobiles": "Gerenciamento móvel", "QR Code": "Código QR", - "Sauvegardes Menu Custom Mobile": "Menu Backups Personalizado Móvel", - "Documentation APP": "Documentação do APP", "Mes Téléphones Mobiles": "Meus telefones móveis", "Rechercher": "Pesquisa", "Équipement visible": "Equipamento visível", "Équipement non visible": "Equipamento não visível", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Para adicionar um telefone, existem 2 métodos possíveis:", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Na primeira tela do aplicativo, você será solicitado a conectar sua conta de mercado, e assim encontrar todas as caixas associadas a esta conta, ou simplesmente adicionar uma caixa", "App V1": "Aplicativo V1", - "Ajouter": "Adicionar", - "Plugins": "Plugins", - "Objets\/Pièces": "Itens\/peças", - "Scénarios": "Cenas", - "Régénérer la configuration": "Regenerar configuração", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Observe que em beta não é mais possível usar o APP V1", "Configuration avancée": "Configuração avançada", - "Infos envoyées à l'app": "Informações enviadas para o aplicativo", "Sauvegarder": "Salvar", "Supprimer": "Remover", "Mobile": "Móvel", - "Notifications": "Notificações", - "Sauvegarde Mobile": "Backup móvel", "Commandes": "Comandos", "Paramètres généraux": "Configurações Gerais", "Nom de l'équipement": "Nome do equipamento", @@ -223,33 +57,21 @@ "Activer": "Ativar", "Visible": "Visivél", "Paramètres spécifiques": "Configurações específicas", + "Verrouiller le menu géolocalisation": "Bloquear menu de geolocalização", + "Verrouiller le menu custom": "Bloquear menu personalizado", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informação", "Type de Mobile": "Tipo de celular", - "iPhone": "Iphone", - "Android": "Andróide", - "Windows (non officiel)": "Windows (não oficial)", "Utilisateur": "Do utilizador", - "QRCode": "Código QR", - "Id Mobile": "IdMobile", - "Iq": "Iq", - "ARN Mobile": "ARN móvel", - "ARN": "RNA", + "Iq Mobile": "QI Móvel", "TOKEN Mobile": "TOKEN Móvel", - "TOKEN": "SÍMBOLO", - "ARN pour Monitoring": "ARN para Monitoramento", - "Copier pour Monitoring": "Cópia para monitoramento", - "Sauvegarde": "Cópia de segurança", - "Sauvegarde Dashboard": "Backup do painel", - "Vérification en Cours": "Verificação em andamento", - "Sauvegarde Favoris": "Salvar Favoritos", "Nom": "Nome", "Type": "Tipo", "Valeur": "Valor", "Actions": "Ações" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Acesso não autorizado", - "Pas de configuration sur ce plugin": "Nenhuma configuração neste plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Acesso não autorizado", "ERREUR SUR LA COMMANDE": "ERRO DE ORDEM" @@ -262,21 +84,9 @@ "Température": "Temperatura" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plug-ins compatíveis - Aplicativo V1", - "Objets \/ Pièces - Application V1": "Objetos\/Peças - Aplicação V1", - "Scénarios - Application V1": "Cenários - Aplicação V1", "Informations envoyées à l'app": "Informações enviadas para o aplicativo", "Gestion des Mobiles": "Gerenciamento móvel", "QrCode": "Código QR", - "Bien demarrer": "Comece bem", - "Scénarios - Application V1": "Cenários - Aplicação V1", - "Menu Custom": "Menu customizado", - "Configuration Mobile de la Pièce - Application V1": "Configuração de Sala Móvel - Aplicação V1", - "Menus enregistrés": "Menus salvos", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Nenhum erro de endereço interno (veja a configuração do seu Jeedom!)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Nenhum erro de endereço externo (veja a configuração do seu Jeedom!)", - "Erreur pas d'utilisateur selectionné": "Erro nenhum usuário selecionado", - "Configuration mise à jour": "Configuração atualizada", "Nom de la commande": "Nome do comando", "Choisir une icône": "Escolha um ícone", "Afficher": "Mostrar", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Acesso não autorizado", "Equipement non trouvé : ": "Equipamento não encontrado:", "User inexistant : ": "Usuário inexistente:", - "scenario non trouvé": "cenário não encontrado", "Aucune methode correspondante à : ": "Aucune methode correspondante à :" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "As cotas para FCM foram excedidas. O máximo permitido são 5 solicitações por minuto", "Echec de l\\'envoi de la notification :": "Falha ao enviar notificação:", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['nome']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Falha ao enviar notificação: a versão 1 do aplicativo não é mais compatível!", + "Batterie du téléphone": "Bateria do telefone", + "En charge": "Responsável", + "Coordonnées": "Detalhes de contato", "Notification": "Notificação", - "Notification Critique": "Notificação Crítica" + "Notification Critique": "Notificação Crítica", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Recuperar informações do telefone", + "Supprimer les Notifications": "Excluir notificações", + "Supprimer toutes les Notifications": "Excluir todas as notificações", + "Supprimer les Asks expirés": "Excluir perguntas expiradas", + "Supprimer les Asks répondus": "Excluir perguntas respondidas" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Cor do indicador de valor", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "Objeto JSONRPC não definido", "EqLogic inconnu : ": "EqLogic desconhecido:", "Cmd inconnu : ": "Cmd desconhecido:", - "pas d\\'id : ": "no id:", - "pas de parametre de geofencing : ": "nenhum parâmetro de geofencing:", - "Aucune demande": "Nenhum pedido" + "| [ERROR] EqLogic inconnu : ": "| [ERRO] EqLogic desconhecido:", + "| Pas de paramètre de geofencing": "| Sem configurações de cerca geográfica", + "| [ERROR] Paramètre Iq inexistant !": "| [ERRO] O parâmetro Iq não existe!", + "Aucune demande": "Nenhum pedido", + "Aucun": "Nenhum" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion, o aplicativo v1 não é compatível com o Android mais recente. O aplicativo oficial Jeedom permite que você controle seu sistema de automação residencial Jeedom, seja no Wifi local, seja na rede 3G\/4G da sua operadora. O app se conecta automaticamente ao seu Jeedom com inicialização automática por QRcode, não sendo necessária nenhuma configuração. (possibilidade de fazer manualmente) Você encontrará no seu celular todas as funcionalidades do seu Jeedom. Você poderá customizar seu aplicativo com atalhos e muito mais... Características atuais: - Gestão dos seus cenários. - Gestão da sua domótica de acordo com as suas divisões e equipamentos. - Turno e retorno automático de status - Compatibilidade com plugins, como termostato, alarme, câmera etc... - Interface personalizável com atalhos. - Resumo da domótica geral e por divisão - Notificações (com suporte ASK) - Exibição de Projetos Mais recursos e compatibilidades estão chegando em futuras atualizações! Privacidade. Nenhum dado (doméstico ou pessoal) é armazenado ou mantido em nossos servidores" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Observação: a versão BETA não suporta mais o aplicativo V1, está reservada para o novo aplicativo V2 (atualmente beta). Requer no mínimo Android14 ou IOS 12.4. Observe que o aplicativo v1 não é compatível com o Android mais recente. O aplicativo oficial Jeedom permite que você controle seu sistema de automação residencial Jeedom, seja via WiFi local, ou na rede 3G\/4G da sua operadora. O aplicativo se conecta automaticamente ao seu Jeedom com inicialização automática por QRcode, nenhuma configuração é necessária. (possibilidade de fazer manualmente) Você encontrará todos os recursos do seu Jeedom no seu celular. Você poderá personalizar seu aplicativo com atalhos e muito mais... Recursos atuais: - Gestão dos seus cenários. - Gestão da sua domótica de acordo com as suas divisões e equipamentos. - Mudança e retorno automático de status - Compatibilidade com plugins, como termostato, alarme, câmera etc... - Interface personalizável com atalhos. - Resumo geral de automação residencial e por cômodo - Notificações (com suporte ASK) - Exibição de Projetos Mais recursos e compatibilidade chegarão em atualizações futuras! Respeito pela privacidade. Nenhum dado (domótico ou pessoal) é armazenado ou retido em nossos servidores" } } \ No newline at end of file diff --git a/core/i18n/ru_RU.json b/core/i18n/ru_RU.json index 611d7ef9..b5068f78 100755 --- a/core/i18n/ru_RU.json +++ b/core/i18n/ru_RU.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case :" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Оборудование", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Несанкционированный доступ", - "Pause": "Пауза", - "Rechercher": "поиск" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "активировать", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "Сохранить", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "общий тип", - "Icône": "Иконка", - "Aucun": "Нет", - " . $info['family'] . ": ", $ info ['family']", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "Изменения успешно сохранены", - "Sauvegarde effectuée": "Резервное копирование завершено" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Несанкционированный доступ", - "Scénarios": "Сценарии", - "Sauvegarder": "Сохранить", - "ID": "Идентификатор", - "Scénario": "Сценарий", - "Transmis": "Transmis", - "Actions": "акции", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "активировать", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "Сохранить", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "общий тип", - "Icône": "Иконка", - "Aucun": "Нет", - " . $info['family'] . ": ", $ info ['family']", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "Изменения успешно сохранены", - "Sauvegarde effectuée avec succès": "Резервное копирование завершено успешно" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "Команды", - "Scénarios": "Сценарии", - "Messages": "Сообщения", - "Designs": "конструкции", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "Конфигурация", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "поиск", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", "App V1": "App V1", - "Ajouter": "Добавить", - "Plugins": "Плагины", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "Сценарии", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "Расширенные настройки", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "Сохранить", "Supprimer": "удаление", "Mobile": "мобильный", - "Notifications": "Уведомления", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "Команды", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "активировать", "Visible": "Видимый", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "Имя", "Type": "Тип", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Несанкционированный доступ", "Equipement non trouvé : ": "Equipement non trouvé :", "User inexistant : ": "User inexistant :", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "Aucune methode correspondante à :" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu :", "Cmd inconnu : ": "Cmd inconnu :", - "pas d\\'id : ": "pas d\\'id :", - "pas de parametre de geofencing : ": "pas de parametre de geofencing :", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu :", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" } } \ No newline at end of file diff --git a/core/i18n/tr.json b/core/i18n/tr.json index 2732478b..48d5ceaa 100755 --- a/core/i18n/tr.json +++ b/core/i18n/tr.json @@ -3,28 +3,6 @@ "Notifications de l'app": "Notifications de l'app", "Réponse Ask sensible à la case : ": "Réponse Ask sensible à la case :" }, - "plugins\/mobile\/desktop\/modal\/piece.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Les Pièces - Application V1": "Les Pièces - Application V1" - }, - "plugins\/mobile\/desktop\/modal\/health.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Cihaz", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Dernière activité": "Dernière activité", - "Date création": "Date création", - "Utilisateur non trouvé": "Utilisateur non trouvé" - }, - "plugins\/mobile\/desktop\/modal\/secPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "COMPTE MARKET": "COMPTE MARKET", - "BOX ID": "BOX ID", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "Plusieurs choix sur cet écran :": "Plusieurs choix sur cet écran :", - "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.": "- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin" - }, "plugins\/mobile\/desktop\/modal\/menuCustom.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "Équipement": "Équipement", @@ -38,29 +16,6 @@ "Utilisateur non trouvé": "Utilisateur non trouvé", "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" }, - "plugins\/mobile\/desktop\/modal\/plugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Plugins Spéciaux Compatibles": "Plugins Spéciaux Compatibles", - "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile.": "Disponibles dans la liste des plugins et intégrés au Dashboard de l’App Mobile", - "Plugins Validés Type générique": "Plugins Validés Type générique", - "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés.": "Visibles dans l'app, peuvent nécessiter un type générique, peuvent être désactivés", - "Plugins compatibles non transmis": "Plugins compatibles non transmis", - "Ne sont pas transmis à l’App Mobile.": "Ne sont pas transmis à l’App Mobile", - "Plugins non testés transmis à l'application": "Plugins non testés transmis à l'application", - "Sont transmis à l’App Mobile en se basant sur les types génériques.": "Sont transmis à l’App Mobile en se basant sur les types génériques", - "Plugins non testés et non transmis": "Plugins non testés et non transmis", - "Ne sont pas transmis à l’App Mobile": "Ne sont pas transmis à l’App Mobile" - }, - "plugins\/mobile\/desktop\/modal\/fivePage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état" - }, "plugins\/mobile\/desktop\/modal\/qrcodev2.php": { "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE ": "AJOUT DE LA BOX SUR VOTRE APPLICATiON MOBILE", "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application": "Vous pouvez choisir un utilisateur : un QRCode sera généré. Vous pourrez ensuite scanner le QRCode depuis la nouvelle application, et ainsi ajouter cette box à votre application", @@ -71,120 +26,6 @@ "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)": "Erreur Pas d\\'adresse externe (voir configuration de votre Jeedom !)", "Erreur Pas d\\'utilisateur selectionné": "Erreur Pas d\\'utilisateur selectionné" }, - "plugins\/mobile\/desktop\/modal\/thirdPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/wizard.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé" - }, - "plugins\/mobile\/desktop\/modal\/sixPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Personnalisation du Menu": "Personnalisation du Menu", - "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application": "Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application", - "On clique sur Menu Custom": "On clique sur Menu Custom", - "Une modale s'ouvre et vous propose vos téléphones deja connectés": "Une modale s'ouvre et vous propose vos téléphones deja connectés", - "Cliquer sur Configurer Menu sur le téléphone choisi": "Cliquer sur Configurer Menu sur le téléphone choisi", - "Le nombre d'icônes peut aller de 1 à 4": "Le nombre d'icônes peut aller de 1 à 4", - "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones": "En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones", - "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application": "Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application", - "Même principe que via le plugin Mobile": "Même principe que via le plugin Mobile" - }, - "plugins\/mobile\/desktop\/modal\/firstPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour connecter votre téléphone : il y a 2 méthodes possible": "Pour connecter votre téléphone : il y a 2 méthodes possible" - }, - "plugins\/mobile\/desktop\/modal\/update.mobile.php": { - "401 - Accès non autorisé": "401 - Yetkisiz erişim", - "Pause": "Durdur", - "Rechercher": "Arayın" - }, - "plugins\/mobile\/desktop\/modal\/plugin.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoi auprès de l'app mobile": "Envoi auprès de l'app mobile", - "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part": "Ce Plugin est entièrement compatible, il ne nécessite aucune action de votre part", - "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes": "Ce plugin est compatible, penser à vérifier les Types Génériques sur les commandes", - "Activer": "Etkinleştir", - "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez": "Le Plugin n\\'est pas compatible, vous pouvez l\\'activer si vous le souhaitez", - "Type Générique du Plugin": "Type Générique du Plugin", - "Sauvegarder": "Kaydet", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Genel tip", - "Icône": "Icon", - "Aucun": "Hiçbir", - " . $info['family'] . ": ". $info['family'] .", - "Plugins compatibles": "Plugins compatibles", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée": "Yedekleme gerçekleştirildi" - }, - "plugins\/mobile\/desktop\/modal\/scenario.php": { - "401 - Accès non autorisé": "401 - Yetkisiz erişim", - "Scénarios": "Senaryolar", - "Sauvegarder": "Kaydet", - "ID": "Kimlik", - "Scénario": "Senaryo", - "Transmis": "Transmis", - "Actions": "Işlemler", - "Envoyer à l\\'application": "Envoyer à l\\'application" - }, - "plugins\/mobile\/desktop\/modal\/object.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Envoyer cette pièce vers l\\'application": "Envoyer cette pièce vers l\\'application", - "Activer": "Etkinleştir", - "Type Générique de cet objet": "Type Générique de cet objet", - "Sauvegarder": "Kaydet", - "Id Cmd": "Id Cmd", - "Nom de la Commande": "Nom de la Commande", - "Type Générique": "Genel tip", - "Icône": "Icon", - "Aucun": "Hiçbir", - " . $info['family'] . ": ". $info['family'] .", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modifications sauvegardées avec succès": "Modifications sauvegardées avec succès", - "Sauvegarde effectuée avec succès": "Kayıt başarıyla sonuçlandı" - }, - "plugins\/mobile\/desktop\/modal\/info_app.mobile.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "JSON valide": "JSON valide", - "Objets \/ Pièces": "Objets \/ Pièces", - "Modules": "Modules", - "Commandes": "Komutalar", - "Scénarios": "Senaryolar", - "Messages": "Mesajlar", - "Designs": "Tasarımlar", - "Configurations": "Configurations" - }, - "plugins\/mobile\/desktop\/modal\/fiveModal.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "On ajoute une zone de Géolocalisation": "On ajoute une zone de Géolocalisation", - "On recherche l'adresse, on nomme la Zone, et on valide": "On recherche l'adresse, on nomme la Zone, et on valide", - "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone": "La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone", - "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes": "Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes", - "Modifier largueur de la zone": "Modifier largueur de la zone", - "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.": "Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état" - }, - "plugins\/mobile\/desktop\/modal\/fourPage.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.": "Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier", - "Une fois les identifiants entrés, la box passe en haut de liste.": "Une fois les identifiants entrés, la box passe en haut de liste", - "Si elle répond au ping, elle a un voyant vert": "Si elle répond au ping, elle a un voyant vert", - "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs": "On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs", - "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.": "Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu", - "Menu Complet": "Menu Complet" - }, - "plugins\/mobile\/desktop\/modal\/modal.previousMenus.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Équipement": "Équipement", - "Type de Mobile": "Type de Mobile", - "Utilisateur": "Utilisateur", - "Menu Enregistrés": "Menu Enregistrés", - "Aucun menu enregistré": "Aucun menu enregistré", - "APPLICATION V2 NON INTALLÉE": "APPLICATION V2 NON INTALLÉE", - "Utilisateur non trouvé": "Utilisateur non trouvé", - "Configuration Menu Enregistrée": "Configuration Menu Enregistrée" - }, "plugins\/mobile\/desktop\/php\/widgetLight.php": { "401 - Accès non autorisé": "401 - Accès non autorisé" }, @@ -194,25 +35,18 @@ "Configuration": "Ayar", "Gestion Mobiles": "Gestion Mobiles", "QR Code": "QR Code", - "Sauvegardes Menu Custom Mobile": "Sauvegardes Menu Custom Mobile", - "Documentation APP": "Documentation APP", "Mes Téléphones Mobiles": "Mes Téléphones Mobiles", "Rechercher": "Arayın", "Équipement visible": "Équipement visible", "Équipement non visible": "Équipement non visible", + "Pour ajouter un téléphone, il y a 2 méthodes possible :": "Pour ajouter un téléphone, il y a 2 méthodes possible :", + "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.": "Sur le premier écran de l\\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", "App V1": "App V1", - "Ajouter": "Ekle", - "Plugins": "Ekler", - "Objets\/Pièces": "Objets\/Pièces", - "Scénarios": "Senaryolar", - "Régénérer la configuration": "Régénérer la configuration", + "Attention, en beta il n'est plus possible d'utiliser l'APP V1": "Attention, en beta il n'est plus possible d'utiliser l'APP V1", "Configuration avancée": "Gelişmiş ayarlar", - "Infos envoyées à l'app": "Infos envoyées à l'app", "Sauvegarder": "Kaydet", "Supprimer": "Sil", "Mobile": "Mobil", - "Notifications": "Bildirimler", - "Sauvegarde Mobile": "Sauvegarde Mobile", "Commandes": "Komutalar", "Paramètres généraux": "Paramètres généraux", "Nom de l'équipement": "Nom de l'équipement", @@ -223,33 +57,21 @@ "Activer": "Etkinleştir", "Visible": "Görülebilir", "Paramètres spécifiques": "Paramètres spécifiques", + "Verrouiller le menu géolocalisation": "Verrouiller le menu géolocalisation", + "Verrouiller le menu custom": "Verrouiller le menu custom", + "NFC : Envoi direct": "NFC : Envoi direct", + "Non": "Non", + "Oui": "Oui", + "Informations": "Informations", "Type de Mobile": "Type de Mobile", - "iPhone": "iPhone", - "Android": "Android", - "Windows (non officiel)": "Windows (non officiel)", "Utilisateur": "Utilisateur", - "QRCode": "QRCode", - "Id Mobile": "Id Mobile", - "Iq": "Iq", - "ARN Mobile": "ARN Mobile", - "ARN": "ARN", + "Iq Mobile": "Iq Mobile", "TOKEN Mobile": "TOKEN Mobile", - "TOKEN": "TOKEN", - "ARN pour Monitoring": "ARN pour Monitoring", - "Copier pour Monitoring": "Copier pour Monitoring", - "Sauvegarde": "Sauvegarde", - "Sauvegarde Dashboard": "Sauvegarde Dashboard", - "Vérification en Cours": "Vérification en Cours", - "Sauvegarde Favoris": "Sauvegarde Favoris", "Nom": "İsim", "Type": "Çeşit", "Valeur": "Valeur", "Actions": "Actions" }, - "plugins\/mobile\/desktop\/php\/modalConfigPlugin.php": { - "401 - Accès non autorisé": "401 - Accès non autorisé", - "Pas de configuration sur ce plugin": "Pas de configuration sur ce plugin" - }, "plugins\/mobile\/desktop\/php\/widgetSlider.php": { "401 - Accès non autorisé": "401 - Accès non autorisé", "ERREUR SUR LA COMMANDE": "ERREUR SUR LA COMMANDE" @@ -262,21 +84,9 @@ "Température": "Température" }, "plugins\/mobile\/desktop\/js\/mobile.js": { - "Plugins compatibles - Application V1": "Plugins compatibles - Application V1", - "Objets \/ Pièces - Application V1": "Objets \/ Pièces - Application V1", - "Scénarios - Application V1": "Scénarios - Application V1", "Informations envoyées à l'app": "Informations envoyées à l'app", "Gestion des Mobiles": "Gestion des Mobiles", "QrCode": "QrCode", - "Bien demarrer": "Bien demarrer", - "Scénarios - Application V1": "Scénarios - Application V1", - "Menu Custom": "Menu Custom", - "Configuration Mobile de la Pièce - Application V1": "Configuration Mobile de la Pièce - Application V1", - "Menus enregistrés": "Menus enregistrés", - "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)": "Erreur pas d'adresse interne (voir configuration de votre Jeedom !)", - "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)": "Erreur pas d'adresse externe (voir configuration de votre Jeedom !)", - "Erreur pas d'utilisateur selectionné": "Erreur pas d'utilisateur selectionné", - "Configuration mise à jour": "Configuration mise à jour", "Nom de la commande": "Nom de la commande", "Choisir une icône": "Choisir une icône", "Afficher": "Afficher", @@ -292,14 +102,23 @@ "401 - Accès non autorisé": "401 - Yetkisiz erişim", "Equipement non trouvé : ": "Equipement non trouvé :", "User inexistant : ": "User inexistant :", - "scenario non trouvé": "scenario non trouvé", "Aucune methode correspondante à : ": "Aşağıdakilere karşılık gelen bir yöntem yok:" }, "plugins\/mobile\/core\/class\/mobile.class.php": { + "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute.": "Les quotas pour fcm sont dépassés. Le maximum autorisé est de 5 requêtes par minute", "Echec de l\\'envoi de la notification :": "Echec de l\\'envoi de la notification :", - "$geoloc['id'] . '-' . $geoloc['name']": "$geoloc['id'] . '-' . $geoloc['name']", + "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !": "Échec de l'envoi de notification : la version 1 de l'app n'est plus prise en charge !", + "Batterie du téléphone": "Batterie du téléphone", + "En charge": "En charge", + "Coordonnées": "Coordonnées", "Notification": "Notification", - "Notification Critique": "Notification Critique" + "Notification Critique": "Notification Critique", + "Notification Silencieuse": "Notification Silencieuse", + "Récupérer les informations du téléphone": "Récupérer les informations du téléphone", + "Supprimer les Notifications": "Supprimer les Notifications", + "Supprimer toutes les Notifications": "Supprimer toutes les Notifications", + "Supprimer les Asks expirés": "Supprimer les Asks expirés", + "Supprimer les Asks répondus": "Supprimer les Asks répondus" }, "plugins\/mobile\/core\/template\/widgets.html": { "Couleur de l'indicateur de valeur": "Couleur de l'indicateur de valeur", @@ -313,11 +132,13 @@ "JSONRPC object not defined": "JSONRPC object not defined", "EqLogic inconnu : ": "EqLogic inconnu :", "Cmd inconnu : ": "Cmd inconnu :", - "pas d\\'id : ": "pas d\\'id :", - "pas de parametre de geofencing : ": "pas de parametre de geofencing :", - "Aucune demande": "Aucune demande" + "| [ERROR] EqLogic inconnu : ": "| [ERROR] EqLogic inconnu :", + "| Pas de paramètre de geofencing": "| Pas de paramètre de geofencing", + "| [ERROR] Paramètre Iq inexistant !": "| [ERROR] Paramètre Iq inexistant !", + "Aucune demande": "Aucune demande", + "Aucun": "Aucun" }, "info.json": { - "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" } } \ No newline at end of file diff --git a/core/img/Button_Dashboard_icon@3x.png b/core/img/Button_Dashboard_icon@3x.png deleted file mode 100755 index 3eafc626..00000000 Binary files a/core/img/Button_Dashboard_icon@3x.png and /dev/null differ diff --git a/core/img/Button_Design_icon@3x.png b/core/img/Button_Design_icon@3x.png deleted file mode 100755 index e5e6d7af..00000000 Binary files a/core/img/Button_Design_icon@3x.png and /dev/null differ diff --git a/core/img/Button_Synthese_icon@3x.png b/core/img/Button_Synthese_icon@3x.png deleted file mode 100755 index eaab45c0..00000000 Binary files a/core/img/Button_Synthese_icon@3x.png and /dev/null differ diff --git a/core/img/Button_URL_icon@3x.png b/core/img/Button_URL_icon@3x.png deleted file mode 100755 index 6af241c1..00000000 Binary files a/core/img/Button_URL_icon@3x.png and /dev/null differ diff --git a/core/img/IMG_0738.PNG b/core/img/IMG_0738.PNG deleted file mode 100755 index 2b3367ab..00000000 Binary files a/core/img/IMG_0738.PNG and /dev/null differ diff --git a/core/img/android.png b/core/img/android.png deleted file mode 100755 index e33724b6..00000000 Binary files a/core/img/android.png and /dev/null differ diff --git a/core/img/ios.png b/core/img/ios.png deleted file mode 100755 index 462de40f..00000000 Binary files a/core/img/ios.png and /dev/null differ diff --git a/core/img/mobile_icon.png b/core/img/mobile_icon.png deleted file mode 100755 index d4fd114e..00000000 Binary files a/core/img/mobile_icon.png and /dev/null differ diff --git a/core/img/v22methods.jpeg b/core/img/v22methods.jpeg deleted file mode 100755 index 4b0d0f6a..00000000 Binary files a/core/img/v22methods.jpeg and /dev/null differ diff --git a/core/img/v2ActualBoxFlouted.jpeg b/core/img/v2ActualBoxFlouted.jpeg deleted file mode 100755 index 4fb7c69d..00000000 Binary files a/core/img/v2ActualBoxFlouted.jpeg and /dev/null differ diff --git a/core/img/v2AddZone.jpeg b/core/img/v2AddZone.jpeg deleted file mode 100755 index 926f7d9c..00000000 Binary files a/core/img/v2AddZone.jpeg and /dev/null differ diff --git a/core/img/v2ConnectBox.jpeg b/core/img/v2ConnectBox.jpeg deleted file mode 100755 index c0da35a3..00000000 Binary files a/core/img/v2ConnectBox.jpeg and /dev/null differ diff --git a/core/img/v2FullMenu.jpeg b/core/img/v2FullMenu.jpeg deleted file mode 100755 index 757f5264..00000000 Binary files a/core/img/v2FullMenu.jpeg and /dev/null differ diff --git a/core/img/v2MenuBoxs.PNG b/core/img/v2MenuBoxs.PNG deleted file mode 100755 index 1b0bd7f8..00000000 Binary files a/core/img/v2MenuBoxs.PNG and /dev/null differ diff --git a/core/img/v2MenuBoxs.jpeg b/core/img/v2MenuBoxs.jpeg deleted file mode 100755 index 1b0bd7f8..00000000 Binary files a/core/img/v2MenuBoxs.jpeg and /dev/null differ diff --git a/core/img/v2ModalMenuCustom.png b/core/img/v2ModalMenuCustom.png deleted file mode 100755 index 4ae1f831..00000000 Binary files a/core/img/v2ModalMenuCustom.png and /dev/null differ diff --git a/core/img/v2ModalQrCode.png b/core/img/v2ModalQrCode.png deleted file mode 100755 index 33c7290c..00000000 Binary files a/core/img/v2ModalQrCode.png and /dev/null differ diff --git a/core/img/v2ModifyBigRadius.jpeg b/core/img/v2ModifyBigRadius.jpeg deleted file mode 100755 index e27354fb..00000000 Binary files a/core/img/v2ModifyBigRadius.jpeg and /dev/null differ diff --git a/core/img/v2ModifyLittleRadius.jpeg b/core/img/v2ModifyLittleRadius.jpeg deleted file mode 100755 index ffbf2b27..00000000 Binary files a/core/img/v2ModifyLittleRadius.jpeg and /dev/null differ diff --git a/core/img/v2QRCodeConnect.PNG b/core/img/v2QRCodeConnect.PNG deleted file mode 100755 index e7647963..00000000 Binary files a/core/img/v2QRCodeConnect.PNG and /dev/null differ diff --git a/core/img/v2ZoneInactive.jpeg b/core/img/v2ZoneInactive.jpeg deleted file mode 100755 index 7bce54cf..00000000 Binary files a/core/img/v2ZoneInactive.jpeg and /dev/null differ diff --git a/core/img/v2connectMarket.jpeg b/core/img/v2connectMarket.jpeg deleted file mode 100755 index 03c218dc..00000000 Binary files a/core/img/v2connectMarket.jpeg and /dev/null differ diff --git a/core/img/v2firstConnect.jpeg b/core/img/v2firstConnect.jpeg deleted file mode 100755 index 966fcdda..00000000 Binary files a/core/img/v2firstConnect.jpeg and /dev/null differ diff --git a/core/img/v2floutedBoxs.png b/core/img/v2floutedBoxs.png deleted file mode 100755 index 3e0118e2..00000000 Binary files a/core/img/v2floutedBoxs.png and /dev/null differ diff --git a/core/img/v2greenBtnAdd.PNG b/core/img/v2greenBtnAdd.PNG deleted file mode 100755 index d205d20a..00000000 Binary files a/core/img/v2greenBtnAdd.PNG and /dev/null differ diff --git a/core/php/image.php b/core/php/image.php index 1009acf2..5757c9a1 100755 --- a/core/php/image.php +++ b/core/php/image.php @@ -18,29 +18,29 @@ require_once dirname(__FILE__) . "/../../../../core/php/core.inc.php"; -if(init('name') == null || init('key') == null){ - die(); +if (init('name') == null || init('key') == null) { + die(); } /* Variables */ $keyFile = init('key'); $nameFile = init('name'); -$file = dirname(__FILE__) .'/../../data/images/'.$nameFile; +$file = dirname(__FILE__) . '/../../data/images/' . $nameFile; -if(!file_exists($file)){ +if (!file_exists($file)) { echo "FILE NON EXISTE !"; - die(); + die(); } $nameMD5 = md5_file($file); -if($nameMD5 != $keyFile){ +if ($nameMD5 != $keyFile) { echo "KEY NOK !"; die(); } //ob_clean(); -header('Content-Type: image/'.pathinfo($file, PATHINFO_EXTENSION)); - echo file_get_contents($file); +header('Content-Type: image/' . pathinfo($file, PATHINFO_EXTENSION)); +echo file_get_contents($file); //unlink($file); diff --git a/core/template/mobile/cmd.info.numeric.arcSlider.html b/core/template/mobile/cmd.info.numeric.arcSlider.html index 404d502d..750c1a11 100644 --- a/core/template/mobile/cmd.info.numeric.arcSlider.html +++ b/core/template/mobile/cmd.info.numeric.arcSlider.html @@ -40,7 +40,7 @@ .css("transform", "scale(0.94) rotate(" + angle + "deg)"); cmd.find(".state strong").first().text(_options.display_value); }); - + if (is_numeric("#state#")) { jeedom.cmd.refreshValue([ { diff --git a/desktop/css/notification.css b/desktop/css/notification.css new file mode 100644 index 00000000..75786447 --- /dev/null +++ b/desktop/css/notification.css @@ -0,0 +1,129 @@ +.notification-box { + padding: 32px; +} + +.notification-step { + display: flex; + margin-bottom: 32px; + position: relative; +} + +.notification-step:last-child { + margin-bottom: 0px; +} + +.notification-line { + position: absolute; + left: 114px; + top: 40px; + bottom: -32px; + width: 2px; + background-color: var(--logo-primary-color); + z-index: 1; +} + +.notification-date { + display: flex; + height: 40px; + align-items: center; + margin-right: 16px; + width: 79px; + font-size: 12px; + padding: 5px; + text-align: center; + border-radius: var(--border-radius) var(--border-radius) var(--border-radius) var(--border-radius) !important; + background-color: var(--form-bg-color); + /* z-index: 1;*/ +} + +.notification-step:last-child .notification-line { + display: none; +} + +.notification-circle { + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-right: 16px; + background-color: var(--form-bg-color); + border: 2px solid var(--txt-color); + z-index: 2; +} + +.ask-timeout .notification-circle { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-info-color) !important; + border: none; +} + +.ask-success .notification-circle { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-success-color) !important; + border: none; +} + +.ask-in-progress .notification-circle { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-warning-color) !important; + border: none; +} + +.stepper-critical .notification-circle { + border: 1px solid red; +} + +.notification-content { + flex: 1; + padding: 10px; + border-radius: var(--border-radius) var(--border-radius) var(--border-radius) var(--border-radius); + background-color: var(--form-bg-color); +} + +.notification-img { + margin-top: 10px; +} + +.notification-img img { + max-width: 250px; +} + +.notification-title { + font-weight: 600; + margin-bottom: 4px; + font-size: 18px; +} + +.notification-status { + font-size: 13px; + display: inline-block; + padding: 2px 8px; + border-radius: 12px; + margin-top: 4px; +} + +.ask-success .notification-status { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-success-color) !important; + border: none; +} + +.ask-timeout .notification-status { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-info-color) !important; + border: none; +} + +.ask-in-progress .notification-status { + color: var(--linkHoverLight-color) !important; + background-color: var(--al-warning-color) !important; + border: none; +} + +.notification-button { + display: flex; + margin-bottom: 32px; + justify-content: end; +} \ No newline at end of file diff --git a/desktop/css/wizard.css b/desktop/css/wizard.css new file mode 100644 index 00000000..13612994 --- /dev/null +++ b/desktop/css/wizard.css @@ -0,0 +1,372 @@ +body { + padding-top: unset; +} + +#jeedomMenuBar { + display: none; +} + +#div_mainContainer { + display: flex; + justify-content: center; + align-items: center; +} + +#div_pageContainer { + background-color: rgba(var(--eq-bg-color), var(--opacity)); + border-radius: var(--border-radius); +} + +#mobile_wizard .flex-evenly { + width: 100%; + height: 100%; + display: flex; + justify-content: space-evenly; + align-items: center; +} + +#mobile_wizard .flex-column { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +#bt_quitmobile { + position: absolute; + top: 5%; + right: 5%; +} + +/* #wizard_container { + height: 600px; + display: grid; + justify-items: center; + align-items: center; + grid-template-columns: 100%; + grid-template-rows: 50px 225px 0 25px auto; +} */ + +#wizard_container { + height: 600px; + display: flex; + flex-direction: column; + justify-items: center; + align-items: center; +} + + +#wizard_container>h3 { + grid-row-start: 1 +} + +#wizard_container>img { + max-width: 350px; + max-height: 500px; + grid-row-start: 2 +} + +#wizard_container>.logo { + grid-row-start: 2 +} + +#wizard_container .input-group { + max-width: 450px; + margin: auto; +} + +#wizard_container .form-control { + font-weight: bold; + text-align-last: center; +} + +.bold { + font-weight: bold; +} + +/*** OBJECTS ***/ +#wizard_container>.step_father .sel_father, +#wizard_container>.step_childs .sel_child { + border-radius: var(--border-radius); + background-color: var(--el-defaultColor); + overflow: hidden; +} + +#wizard_container>.step_father .sel_father:hover, +#wizard_container>.step_father .sel_father.selected { + transform: scale(1.2); +} + +#wizard_container>.step_childs .sel_child { + opacity: .25; +} + +#wizard_container>.step_childs .sel_child:hover { + opacity: 1; +} + +#wizard_container>.step_childs .sel_child.selected { + opacity: 1; + border: solid 3px var(--logo-primary-color); +} + +#wizard_container>.step_father img { + width: 250px; + max-width: 100%; + max-height: 150px; +} + +#wizard_container>.step_childs .panel { + width: 100%; + max-width: 1000px; +} + +#wizard_container>.step_childs .panel-body { + padding: 12px 0 10px 10px; +} + +#wizard_container>.step_childs img { + width: 180px; + max-width: 100%; + max-height: 100px; +} + +#wizard_container>.step_father .object_name, +#wizard_container>.step_childs .object_name { + font-weight: bold; + color: white; + padding: 2px; + background-color: var(--al-info-color); +} + +/*** PLUGINS ***/ +#wizard_container>#plugins { + min-height: 250px; +} + +#wizard_container>#plugins>.plugin { + max-height: 50%; + min-width: 10%; + opacity: .5; + border: solid 3px var(--linkHover-color); + border-radius: var(--border-radius); + padding: 6px 0; +} + +#wizard_container>#plugins>.plugin:hover { + opacity: 1; +} + +#wizard_container>#plugins>.plugin.selected { + opacity: 1; + border: solid 3px var(--logo-primary-color); +} + +#wizard_container>#plugins>.plugin.selected[data-installed="true"] { + border: solid 3px var(--al-info-color); +} + +#wizard_container>#plugins>.plugin>img { + max-height: 95px; + max-width: 85%; +} + +/*** NAVIGATION ***/ +#wizard_navigation { + margin: 15px auto; +} + +#wizard_navigation>div { + margin: auto 10px; + min-width: 50px; +} + +.navBtn, +#bt_jeedom_ready { + font-size: 45px; + cursor: pointer !important; + color: #F18D15; +} + +.navDot { + width: 25px; + height: 25px; + margin: 5px; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; + color: white; + background-color: rgb(var(--contrast-color), .7); + user-select: none; +} + +.navDot:hover, +.navDot.active { + transform: scale(1.5); +} + +.navDot.active { + margin: 0 10px; +} + +.navDot.blocked { + opacity: .5; +} + + + +/* + +@media (max-width: 768px) { + #wizard_container { + height: auto; + grid-template-rows: auto auto auto auto auto; + padding: 10px; + } + + #wizard_container>img { + max-width: 250px; + max-height: 150px; + } + + #wizard_navigation { + flex-direction: row; + justify-content: center; + position: fixed; + bottom: 10px; + width: 100%; + padding-bottom: 10px; + background-color: rgba(var(--panel-bg-color), 0.9); + } + + #wizard_navigation>div { + margin: 0 5px; + } + + .navBtn, + #bt_jeedom_ready { + font-size: 30px; + } + + .navDot { + width: 20px; + height: 20px; + margin: 3px; + } + + .navDot:hover, + .navDot.active { + transform: scale(1.2); + } + + #wizard_container>#updates>.update, + #wizard_container>#plugins>.plugin { + width: 70px; + height: auto; + } + + #wizard_container>#updates>.update>img, + #wizard_container>#plugins>.plugin>img { + width: 60px; + } + + #wizard_container>.services .service { + height: 150px; + max-width: 100%; + } +} */ + + + +/* TABLETS (portrait) */ +@media (max-width: 1024px) { + #div_mainContainer { + flex-direction: column; + padding: 10px; + } + + #wizard_container { + height: auto; + grid-template-rows: auto auto auto auto auto; + } + + #wizard_container>img, + #wizard_container>.logo { + max-width: 250px; + max-height: 180px; + } + + #wizard_container .input-group { + width: 90%; + } + + #wizard_container>#plugins>.plugin { + max-height: 120px; + min-width: 25%; + } +} + +/* PHONES */ +@media (max-width: 768px) { + #wizard_container .input-group { + width: 100%; + flex-direction: column; + align-items: stretch; + } + + #wizard_container .input-group label { + display: block; + margin-bottom: 5px; + width: 100%; + text-align: left; + font-size: 14px; + } + + #wizard_container .input-group select, + #wizard_container .input-group input, + #wizard_container .form-control { + width: 100%; + box-sizing: border-box; + } + #bt_quitJeeasyWizard { + top: 10px; + right: 10px; + } + + #wizard_container { + padding: 10px; + grid-template-rows: auto auto auto auto auto; + text-align: center; + } + + #wizard_container>img, + #wizard_container>.logo { + max-width: 200px; + max-height: 150px; + } + + #wizard_container .form-control { + font-size: 16px; + } + + #wizard_container>#plugins>.plugin { + min-width: 40%; + margin-bottom: 10px; + } + + .navBtn, + #bt_jeedom_ready { + font-size: 30px; + } + + .navDot { + width: 18px; + height: 18px; + margin: 3px; + } +} + + + diff --git a/desktop/js/mobile.js b/desktop/js/mobile.js index 972ef60b..5861fb3f 100755 --- a/desktop/js/mobile.js +++ b/desktop/js/mobile.js @@ -14,584 +14,625 @@ * along with Jeedom. If not, see . */ -if (typeof jeeDialog !== "undefined") { - document - .querySelector("#bt_pluguinmobile") - .addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "pluginsCompatibles", - title: "{{Plugins compatibles - Application V1}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=plugin", - }); - }); - - document - .querySelector("#bt_piecemobile") - .addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "objectsModal", - title: "{{Objets / Pièces - Application V1}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=piece", - }); - }); - - document - .querySelector("#bt_scenariomobile") - .addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "scenariosModal", - title: "{{Scénarios - Application V1}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=scenario", - }); - }); - - document - .querySelector("#info_app") - .addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "infosApp", - title: "{{Informations envoyées à l'app}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=info_app.mobile", - }); - }); - - document - .querySelector("#bt_handlePhones") - ?.addEventListener("click", function (event) { - jeedom.version({ - success: function (version) { - if (version >= "4.4.0") { - jeeDialog.dialog({ - id: "menuCustom", - title: "{{Gestion des Mobiles}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=menuCustom", - }); - } else { - $("#div_alert").showAlert({ - message: - "Module compatible uniquement avec la version core 4.4.0 et supérieure", - level: "warning", - }); - return; - } - }, - }); - }); +// AppV2 \\\ - document - .querySelector("#bt_qrCodev2") - .addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "qrcodev2", - title: "{{QrCode}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=qrcodev2", - }); - }); - - document - .querySelector("#bt_startTuto") - ?.addEventListener("click", function (event) { - jeeDialog.dialog({ - id: "startTuto", - title: "{{Bien demarrer}}", - - fullScreen: 1, - contentUrl: "index.php?v=d&plugin=mobile&modal=wizard", - }); - }); -} else { - $("#bt_startTuto").on("click", function () { - $("#md_modal").dialog({ title: "{{Bien demarrer}}" }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=wizard") - .dialog("open"); - }); - $("#bt_pluguinmobile").on("click", function () { - $("#md_modal").dialog({ - title: "{{Plugins compatibles - Application V1}}", - }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=plugin") - .dialog("open"); - }); - $("#bt_piecemobile").on("click", function () { - $("#md_modal").dialog({ title: "{{Objets / Pièces - Application V1}}" }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=piece") - .dialog("open"); - }); - $("#bt_scenariomobile").on("click", function () { - $("#md_modal").dialog({ title: "{{Scénarios - Application V1}}" }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=scenario") - .dialog("open"); - }); - $("#info_app").on("click", function () { - $("#md_modal").dialog({ title: "{{Informations envoyées à l'app}}" }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=info_app.mobile") - .dialog("open"); - }); - $("#bt_customMenu").on("click", function () { - jeedom.version({ - success: function (version) { - if (version >= "4.4.0") { - $("#md_modal").dialog({ title: "{{Menu Custom}}" }); - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=menuCustom") - .dialog("open"); - } else { - $("#div_alert").showAlert({ - message: - "Module compatible uniquement avec la version core 4.4.0 et supérieure", - level: "warning", - }); - return; - } - }, - }); - }); +document.querySelector("#bt_handlePhones")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "menuCustom", + title: "{{Gestion des Mobiles}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=menuCustom", + }) + return +}) - $("#bt_qrCodev2").on("click", function () { - $("#md_modal") - .load("index.php?v=d&plugin=mobile&modal=qrcodev2") - .dialog("open"); - }); -} +document.querySelector("#bt_qrCodev2")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "qrcodev2", + title: "{{QrCode}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=qrcodev2", + }) +}) -function clickplugin(id_plugin, name_plugin) { - if (typeof jeeDialog !== "undefined") { - jeeDialog.dialog({ - id: "configMobile", - title: - "{{Configuration Mobile du Plugin " + - name_plugin + - " - Application V1}}", - contentUrl: - "index.php?v=d&plugin=mobile&modal=plugin.mobile&plugin_id=" + - id_plugin, - }); - } else { - $("#md_modal").dialog({ - title: - "{{Configuration Mobile du Plugin " + - name_plugin + - " - Application V1}}", - }); - $("#md_modal") - .load( - "index.php?v=d&plugin=mobile&modal=plugin.mobile&plugin_id=" + - id_plugin, - ) - .dialog("open"); - } -} - -function clickobject(id_object) { - if (typeof jeeDialog !== "undefined") { - jeeDialog.dialog({ - id: "configMobilePiece", - title: "{{Configuration Mobile de la Pièce - Application V1}}", - contentUrl: - "index.php?v=d&plugin=mobile&modal=object.mobile&object_id=" + - id_object, - }); - } else { - $("#md_modal").dialog({ - title: "{{Configuration Mobile de la Pièce - Application V1}}", - }); - $("#md_modal") - .load( - "index.php?v=d&plugin=mobile&modal=object.mobile&object_id=" + - id_object, - ) - .dialog("open"); - } -} - -function clickscenario(id_scenario, name_scenario) { - if (typeof jeeDialog !== "undefined") { - jeeDialog.dialog({ - id: "configMobileScenario", - title: - "{{Configuration Mobile du Scénario " + - name_scenario + - " - Application V1}}", - contentUrl: - "index.php?v=d&plugin=mobile&modal=scenario.mobile&scenario_id=" + - id_scenario, - }); - } else { - $("#md_modal").dialog({ - title: - "{{Configuration Mobile du Scénario " + - name_scenario + - " - Application V1}}", - }); - $("#md_modal") - .load( - "index.php?v=d&plugin=mobile&modal=scenario.mobile&scenario_id=" + - id_scenario, - ) - .dialog("open"); - } -} - -document.querySelector("li").click(function () { - setTimeout(function () { - $(".eqLogicThumbnailContainer").packery(); - }, 50); +document.querySelector("#bt_doc")?.addEventListener("click", function (event) { + jeedomUtils.loadPage('index.php?v=d&m=mobile&p=wizard') }); -var hash = document.location.hash; -if (hash) { - $('.nav-tabs a[href="' + hash + '"]').tab("show"); - /*document.querySelector('.nav-tabs a[href="'+hash+'"]').tab('show');*/ -} +// AppV1 \\ -/* -var aTabs = document.querySelectorAll('a[data-toggle="tabPlug"'); -for (let i = 0; i < aTabs.length; i++) { - console.log(aTabs[i].id); - aTabs[i].addEventListener('click', function(event) { - window.location.hash = e.target.hash; - }); -}*/ - -document - .querySelector(".nav-tabs a") - .addEventListener("shown.bs.tab", function (e) { - window.location.hash = e.target.hash; - }); +document.querySelector("#info_app")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "infosApp", + title: "{{Informations envoyées - Application V1}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=AppV1Info" + }) +}) -document.querySelectorAll(".renameDivClass").forEach((el) => { - el.addEventListener("input", function (e) { - let idElement = this.getAttribute("id"); - let eqLogicId = this.getAttribute("eqId"); - let numElement = idElement.substr(-1, 1); - let areatitleEl = document.querySelector("#titleArea" + numElement); - areatitleEl.innerHTML = ""; - areatitleEl.innerHTML = this.children[1].value; +document.querySelector("#bt_pluginmobile")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "pluginsCompatibles", + title: "{{Plugins compatibles - Application V1}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=AppV1Plugin", }); }); -document.querySelectorAll(".btIconClass").forEach((el) => { - el.addEventListener("click", function (e) { - let idElement = this.getAttribute("id"); - let eqLogicId = this.getAttribute("eqId"); - let numElement = idElement.substr(-1, 1); - var _icon = false; - jeedomUtils.chooseIcon( - function (_icon) { - let spanIcon = document.querySelector( - "#spanIconTest" + numElement + '[eqid="' + eqLogicId + '"]', - ); - spanIcon.innerHTML = ""; - spanIcon.insertAdjacentHTML("beforeend", _icon); - $("#spanIconTest" + numElement) - .children("i:nth-child(1)") - .css("font-size", "60px"); - spanIcon.setAttribute("eqId", eqLogicId); - $("#spanIconTest" + numElement) - .children("i:nth-child(1)") - .attr("id", "area" + numElement); - }, - { - icon: _icon, - }, - ); +document.querySelector("#bt_piecemobile")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "objectsModal", + title: "{{Objets / Pièces - Application V1}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=AppV1Piece", }); }); - - -document.querySelector("#bt_previousMenu")?.addEventListener("click", function (event) { - jeedom.version({ - success: function (version) { - if (version >= "4.4.0") { - jeeDialog.dialog({ - id: "PreviousMenus", - title: "{{Menus enregistrés}}", - contentUrl: "index.php?v=d&plugin=mobile&modal=modal.previousMenus", - }); - } else { - $("#div_alert").showAlert({ - message: - "Module compatible uniquement avec la version core 4.4.0 et supérieure", - level: "warning", - }); - return; - } - }, +document.querySelector("#bt_scenariomobile")?.addEventListener("click", function (event) { + jeeDialog.dialog({ + id: "scenariosModal", + title: "{{Scénarios - Application V1}}", + contentUrl: "index.php?v=d&plugin=mobile&modal=AppV1Scenario", }); }); -function userSelect(idSelect) { - let eqLogicId = document.getElementById(idSelect).getAttribute("eqid"); - let numElement = idSelect.substr(-1, 1); - let typeObject = document.getElementById(idSelect).value; - let selectorsObject = document.querySelectorAll(".item_dash"); - selectorsObject.forEach((selector) => { - let idSelector = selector.id; - let eqId = selector.getAttribute("eqId"); - if ( - idSelector.includes(typeObject) && - idSelector.includes(numElement) && - eqId == eqLogicId - ) { - selector.style.display = "block"; - selector.value = "none"; - selector.select = "selected"; - } - if ( - !idSelector.includes(typeObject) && - idSelector.includes(numElement) && - eqId == eqLogicId - ) { - selector.style.display = "none"; - } - }); - if (typeObject == "url") { - document.querySelector( - "#urlUser" + numElement + '[eqId="' + eqLogicId + '"]', - ).style.display = "block"; - } else { - /*let urlsUser = document.querySelectorAll('.urlUser'); - urlsUser.forEach(el => { - el.style.display = 'none'; - })*/ - document.querySelector( - "#urlUser" + numElement + '[eqId="' + eqLogicId + '"]', - ).style.display = "none"; - } -} - -function printEqLogic(_eqLogic) { - let appVersion = _eqLogic.configuration.appVersion; - var monitoringElements = document.querySelectorAll(".monitoringToDisable"); - var saveTab = document.querySelector(".saveTab"); - if (appVersion == 2) { - monitoringElements.forEach((el) => { - el.style.display = "none"; - }); - saveTab.style.display = "none"; - } else { - monitoringElements.forEach((el) => { - el.style.display = "block"; - }); - saveTab.style.display = "block"; - } - - $.ajax({ - type: "POST", - url: "plugins/mobile/core/ajax/mobile.ajax.php", - data: { - action: "getQrCode", - id: _eqLogic.id, - }, - dataType: "json", - global: false, - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { - if (data.state != "ok") { - $("#div_alert").showAlert({ message: data.result, level: "danger" }); - return; - } - let el = document.querySelector(".qrCodeImg"); - el.innerHTML = ""; - if (data.result == "internalError") { - el.innerHTML = - "{{Erreur pas d'adresse interne (voir configuration de votre Jeedom !)}}"; - } else if (data.result == "externalError") { - el.innerHTML = - "{{Erreur pas d'adresse externe (voir configuration de votre Jeedom !)}}"; - } else if (data.result == "UserError") { - el.innerHTML = "{{Erreur pas d'utilisateur selectionné}}"; - } else { - el.innerHTML = - ''; - } - }, - }); - $.ajax({ +document.querySelector("#bt_regenConfig")?.addEventListener("click", function (event) { + domUtils.ajax({ type: "POST", url: "plugins/mobile/core/ajax/mobile.ajax.php", data: { - action: "getSaveDashboard", - iq: _eqLogic.logicalId, + action: "AppV1RegenConfig", }, dataType: "json", - global: false, error: function (request, status, error) { - handleAjaxError(request, status, error); + domUtils.handleAjaxError(request, status, error) }, success: function (data) { if (data.state != "ok") { - $("#div_alert").showAlert({ message: data.result, level: "danger" }); - return; - } - let savedash = document.querySelector("#SaveDash"); - if (data.result == true) { - savedash.classList.add("badge-success"); - savedash.innerHTML = "OK"; - } else if (data.result == false) { - savedash.classList.add("badge-danger"); - savedash.innerHTML = "NOK"; + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return } + jeedomUtils.showAlert({ message: "{{Configuration mise à jour}}", level: "success"}); }, }); - $.ajax({ - type: "POST", - url: "plugins/mobile/core/ajax/mobile.ajax.php", - data: { - action: "getSaveFavDash", - iq: _eqLogic.logicalId, - }, - dataType: "json", - global: false, - error: function (request, status, error) { - handleAjaxError(request, status, error); - }, - success: function (data) { - if (data.state != "ok") { - $("#div_alert").showAlert({ message: data.result, level: "danger" }); - return; - } - let savefav = document.querySelector("#SaveFav"); - if (data.result == true) { - savefav.classList.add("badge-success"); - savefav.innerHTML = "OK"; - } else if (data.result == false) { - savefav.classList.add("badge-danger"); - savefav.innerHTML = "NOK"; - } - }, - }); -} +}); -document - .getElementById("bt_regenConfig") - .addEventListener("click", function () { - $.ajax({ +// NotificationsV2 +document.querySelector(".notification-box")?.addEventListener("click", function (event) { + var _target = null + if (_target = event.target.closest('.bt_removeNotification')) { + let notification = _target.closest('.notification-step') + let id = notification.getAttribute('data-id'); + let iq = notification.getAttribute('data-iq'); + domUtils.ajax({ type: "POST", url: "plugins/mobile/core/ajax/mobile.ajax.php", data: { - action: "regenConfig", + action: "removeNotificationV2", + id: id, + iq: iq }, dataType: "json", error: function (request, status, error) { - handleAjaxError(request, status, error); + domUtils.handleAjaxError(request, status, error) }, success: function (data) { if (data.state != "ok") { - $("#div_alert").showAlert({ message: data.result, level: "danger" }); - return; + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return } - $("#div_alert").showAlert({ - message: "{{Configuration mise à jour}}", - level: "success", - }); + notification.remove() + if (data.result == '0' && is_object(el = document.querySelector(".notification-box"))) { + el.innerHTML = '
{{Aucune notifications}}
' + } + jeedomUtils.showAlert({ message: "{{Notification supprimées.}}", level: "success"}); }, }); - }); + return + } + + if (_target = event.target.closest('.bt_refreshNotifications')) { + let iq = _target.getAttribute('data-iq') + printNotification(iq) + jeedomUtils.showAlert({ message: "{{Terminé.}}", level: "success"}); + return + } +}); // Copie pour monitoring var toCopy = document.getElementById("to-copy-monitoring"); var arnComplet = document.getElementById("arnComplet"); -var btnCopy = document.getElementById("copy-monitoring"); - -btnCopy.addEventListener("click", function () { - var fichier = arnComplet.value; - var fichierCouper = fichier.substr(44); - toCopy.value = fichierCouper; - toCopy.select(); - document.execCommand("copy"); - return false; +document.getElementById("copy-monitoring")?.addEventListener("click", function () { + if (arnComplet.jeeValue() != '') { + var fichier = arnComplet.jeeValue(); + var fichierCouper = fichier.substr(44); + toCopy.value = fichierCouper; + toCopy.select(); + document.execCommand("copy"); + return false; + } }); +///////////////// + + +function printEqLogic(_eqLogic) { + let appVersion = _eqLogic.configuration.appVersion; + if (appVersion == 2) { + document.querySelectorAll(".paramV1").unseen() + document.querySelectorAll(".paramV2").seen() + printNotification(_eqLogic.logicalId) + } else { + document.querySelectorAll(".paramV2").unseen() + document.querySelectorAll(".paramV1").seen() + let el = document.querySelector(".notification-box"); + el.innerHTML = '
Compatible AppV2 uniquement.
' + } + + // AppV1 + if (appVersion != 2) { + domUtils.ajax({ + type: "POST", + url: "plugins/mobile/core/ajax/mobile.ajax.php", + data: { + action: "getQrCode", + id: _eqLogic.id, + }, + dataType: "json", + global: false, + error: function (request, status, error) { + domUtils.handleAjaxError(request, status, error) + }, + success: function (data) { + if (data.state != "ok") { + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return + } + let el = document.querySelector(".qrCodeImg"); + el.innerHTML = ""; + if (data.result == "internalError") { + el.innerHTML = "{{Erreur pas d'adresse interne (voir configuration de votre Jeedom !)}}"; + } else if (data.result == "externalError") { + el.innerHTML = "{{Erreur pas d'adresse externe (voir configuration de votre Jeedom !)}}"; + } else if (data.result == "UserError") { + el.innerHTML = "{{Erreur pas d'utilisateur selectionné}}"; + } else { + el.innerHTML = ''; + } + }, + }); + + domUtils.ajax({ + type: "POST", + url: "plugins/mobile/core/ajax/mobile.ajax.php", + data: { + action: "AppV2GetSaveFavDash", + iq: _eqLogic.logicalId, + }, + dataType: "json", + global: false, + error: function (request, status, error) { + domUtils.handleAjaxError(request, status, error) + }, + success: function (data) { + if (data.state != "ok") { + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return + } + let saveFav = document.querySelector("#SaveFav") + if (is_object(saveFav)) { + if (data.result == true) { + saveFav.removeClass('label-warning', 'label-danger').addClass('label-success') + saveFav.innerHTML = "OK" + } else if (data.result == false) { + saveFav.removeClass('label-success', 'label-warning').addClass('label-danger') + saveFav.innerHTML = "NOK" + } + } + } + }); + + domUtils.ajax({ + type: "POST", + url: "plugins/mobile/core/ajax/mobile.ajax.php", + data: { + action: "AppV2GetSaveDashboard", + iq: _eqLogic.logicalId, + }, + dataType: "json", + global: false, + error: function (request, status, error) { + domUtils.handleAjaxError(request, status, error) + }, + success: function (data) { + if (data.state != "ok") { + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return + } + let savedash = document.querySelector("#SaveDash"); + if (is_object(savedash)) { + if (data.result == true) { + savedash.removeClass('label-warning', 'label-danger').addClass('label-success') + savedash.innerHTML = "OK"; + } else if (data.result == false) { + savedash.removeClass('label-success', 'label-warning').addClass('label-danger') + savedash.innerHTML = "NOK"; + } + } + }, + }); + + document.getElementById("copy-monitoring")?.click() + } + + /// if delete code AppV1 in mobile.php into Paramètres spécifiques -> + /// change by + let el_type = document.querySelector(".type_mobile") + let select_type = document.querySelector('.eqLogicAttr[data-l1key="configuration"][data-l2key="type_mobile"]') + let value_type = '' + if (is_object(select_type)) { + value_type = select_type.options[select_type.selectedIndex]?.text || 'INCONNU' + } + if (is_object(el_type)) { + el_type.innerHTML = value_type + if (value_type == 'INCONNU') el_type.removeClass('label-primary').addClass('label-danger') + else el_type.removeClass('label-danger').addClass('label-primary') + } + + /// if delete code AppV1 in mobile.php into Paramètres spécifiques -> + /// change by + let el_affect_user = document.querySelector(".affect_user") + let select_affect_user = document.querySelector('.eqLogicAttr[data-l1key="configuration"][data-l2key="affect_user"]') + let value_affect_user = '' + if (is_object(select_affect_user)) { + value_affect_user = select_affect_user.options[select_affect_user.selectedIndex]?.text || 'INCONNU' + } + if (is_object(el_affect_user)) { + el_affect_user.innerHTML = value_affect_user + if (value_affect_user == 'INCONNU' || value_affect_user == 'Aucun') el_affect_user.removeClass('label-primary').addClass('label-danger') + else el_affect_user.removeClass('label-danger').addClass('label-primary') + } +} -$("#table_cmd").sortable({ - axis: "y", - cursor: "move", - items: ".cmd", - placeholder: "ui-state-highlight", - tolerance: "intersect", - forcePlaceholderSize: true, -}); -/* - * Fonction pour l'ajout de commande, appellé automatiquement par plugin.template - */ function addCmdToTable(_cmd) { + if (document.getElementById('table_cmd') == null) return if (!isset(_cmd)) { - var _cmd = { configuration: {} }; + var _cmd = { configuration: {} } } if (!isset(_cmd.configuration)) { - _cmd.configuration = {}; + _cmd.configuration = {} } - - var tr = ''; - tr += ''; - tr += ''; - tr += ""; - tr += ""; - tr += '
'; - tr += - ''; - tr += - ''; - tr += - ''; - tr += "
"; - tr += ""; - tr += - '' + - jeedom.cmd.availableType() + - ""; - tr += ''; - tr += ""; - tr += ""; - tr += - ' '; - tr += - ' '; - tr += '
'; - tr += - ''; - tr += - ''; - tr += - ''; - tr += "
"; - tr += ""; - tr += ''; - tr += ""; - tr += ""; + var tr = '' + tr += '' + tr += '' + tr += "" + tr += "" + tr += '
' + var isGeoloc = init(_cmd.logicalId).includes("geoloc_") + tr += '' + tr += '' + tr += '' + tr += "
" + tr += "" + tr += '' + jeedom.cmd.availableType() + "" + tr += '' + tr += "" + tr += "" + tr += ' ' + tr += ' ' + tr += '
' + tr += '' + tr += '' + tr += '' + tr += "
" + tr += "" + tr += '' + tr += "" + tr += "" if (is_numeric(_cmd.id)) { - tr += - ' '; - tr += - ' {{Tester}}'; + tr += ' ' + tr += ' {{Tester}}' } - tr += ""; - tr += ""; - if ( - init(_cmd.logicalId) !== "notif" && - init(_cmd.logicalId) !== "notifCritical" - ) { - tr += - ''; + tr += "" + tr += "" + if (init(_cmd.logicalId) !== "notif" && init(_cmd.logicalId) !== "notifCritical" && init(_cmd.logicalId) !== "notifSilent") { + tr += '' } - tr += ""; - tr += ""; - $("#table_cmd tbody").append(tr); - $("#table_cmd tbody tr:last").setValues(_cmd, ".cmdAttr"); - if (isset(_cmd.type)) { - $("#table_cmd tbody tr:last .cmdAttr[data-l1key=type]").value( - init(_cmd.type), - ); + tr += "" + tr += "" + let newRow = document.createElement('tr') + newRow.innerHTML = tr + newRow.addClass('cmd') + newRow.setAttribute('data-cmd_id', init(_cmd.id)) + document.getElementById('table_cmd').querySelector('tbody').appendChild(newRow) + jeedom.eqLogic.buildSelectCmd({ + id: document.querySelector('.eqLogicAttr[data-l1key="id"]').jeeValue(), + filter: { type: 'info' }, + error: function(error) { + jeedomUtils.showAlert({ message: error.message, level: 'danger' }) + }, + success: function(result) { + newRow.setJeeValues(_cmd, '.cmdAttr') + jeedom.cmd.changeType(newRow, init(_cmd.subType)) + } + }) +} + +function printNotification(_iq) { + domUtils.ajax({ + type: "POST", + url: "plugins/mobile/core/ajax/mobile.ajax.php", + data: { + action: "getNotificationsV2", + iq: _iq, + }, + dataType: "json", + global: false, + error: function (request, status, error) { + domUtils.handleAjaxError(request, status, error) + }, + success: function (data) { + if (data.state != "ok") { + jeedomUtils.showAlert({ message: data.result, level: "danger" }) + return + } + + let el = document.querySelector(".notification-box"); + + try { + var objectData = JSON.parse(data.result); + } catch { + el.innerHTML = '
' + data.result + '
' + return + } + + if (typeof objectData == "object") { + let notification = '' + notification += '' + moment.locale(jeeFrontEnd.language.substring(0, 2)) + for (var i in objectData) { + // ASK + let askStatus = '' + let askChoice = '' + if (isset(objectData[i].data.choiceAsk)) { + askStatus = 'ask-success' + askChoice = objectData[i].data.choiceAsk + } else if (objectData[i].data.askVariable != 'rien') { + let notifTime = moment(objectData[i].data.date, "YYYY-MM-DD hh:mm:ss").unix() + let currentTime = moment().unix() + try { + let askParams = (isset(objectData[i].data.askParams)) ? JSON.parse(objectData[i].data.askParams) : '' + if (isset(askParams.timeout)) { + let timeout = askParams.timeout / 1000 + if ((currentTime - notifTime) > timeout) { + askStatus = 'ask-timeout' + askChoice = '{{Timeout}}' + } else { + askStatus += 'ask-in-progress' + askChoice = '{{En cours...}}' + } + } + } catch { } + } + + notification += '
' + notification += '
' + objectData[i].data.date + '
' + if (objectData[i].data.askVariable != 'rien') { + notification += '
ASK
' + } else if (objectData[i].data.critical == 'true') { + notification += '
N
' + } else if (objectData[i].data.silent == 'true') { + notification += '
NS
' + } else { + notification += '
N
' + } + notification += '
' + notification += '
' + //notification += ' {{Supprimer}}' + notification += '' + notification += '
' + objectData[i].data.title + '
' + notification += '
' + objectData[i].data.body + '
' + if (isset(objectData[i].data.image)) { + notification += '
' + } + if (askChoice != '') notification += '
' + askChoice + '
' + notification += '
' + notification += '
' + //console.log(objectData[i]) + } + el.innerHTML = notification + jeedomUtils.initTooltips(el) + } + }, + }); + +} + +// WIZARD + +var _contentContainer = document.getElementById('wizard_container'); +var currentStep = getUrlVars('step'); + +if (!currentStep) { + currentStep = localStorage.getItem('wizardStep') || document.querySelector('.navDot')?.dataset.step; +} +document.querySelector('.navDot[data-step="' + currentStep + '"]')?.classList.add('active'); +if (window.updateQuitButtonVisibility) window.updateQuitButtonVisibility(); +loadStep(currentStep); + +var slideOut = { + opacity: [1, 0], + transform: ['translateX(0)', 'translateX(-10%)'] +} +var slideIn = { + opacity: [0, 1], + transform: ['translateX(10%)', 'translateX(0)'] +} +var slideOutReverse = { + opacity: [1, 0], + transform: ['translateX(0)', 'translateX(10%)'] +} +var slideInReverse = { + opacity: [0, 1], + transform: ['translateX(-10%)', 'translateX(0)'] +} + +document.querySelectorAll('.navDot').forEach(_dot => { + _dot.addEventListener('click', function() { + let current = document.querySelector('.navDot.active') + + if (this == current || this.classList.contains('blocked')) { + return false + } + if (current.nextElementSibling?.classList.contains('blocked')) { + allowNavigation() + } + + let outAnimation = slideOut + let inAnimation = slideIn + if (Number(this.innerText) < Number(current.innerText)) { + outAnimation = slideOutReverse + inAnimation = slideInReverse + } + + _contentContainer.animate(outAnimation, { + duration: 500 + }) + setTimeout(() => { + document.querySelector('.navDot.active').classList.remove('active') + this.classList.add('active') + _contentContainer.empty() + localStorage.setItem('wizardStep', this.dataset.step); + loadStep(this.dataset.step) + _contentContainer.animate(inAnimation, { + duration: 500 + }) + if (window.updateQuitButtonVisibility) window.updateQuitButtonVisibility(); + }, 450) + }) +}) + +document.querySelectorAll('.navBtn').forEach(_navBtn => { + _navBtn.addEventListener('click', function() { + let activeNavDot = document.querySelector('.navDot.active') + if (this.classList.value.includes('bt_next')) { + activeNavDot.nextElementSibling.triggerEvent('click') + } else if (this.classList.value.includes('bt_prev')) { + activeNavDot.previousElementSibling.triggerEvent('click') + } + }) +}) + + +var quitBtn = document.getElementById('bt_quitmobileWizard'); +if (quitBtn) { + quitBtn.addEventListener('click', function() { + let confirm + confirm = "{{Voulez-vous vraiment fermer la documentation ?}}" + confirm += '

' + + bootbox.confirm(confirm, function(result) { + if (result) { + exitWizard() + } + }) + }) +} + +var readyBtn = document.getElementById('bt_jeedom_ready'); +if (readyBtn) { + readyBtn.addEventListener('click', function() { + exitWizard() + }) +} + +function loadStep(_step) { + updateNavigation(_step); + updateContent('index.php?v=d&plugin=mobile&modal=' + _step); +} + +function updateContent(_url) { + if (!_contentContainer) return; + _contentContainer.style.visibility = 'hidden'; + fetch(_url) + .then(response => response.text()) + .then(data => { + if (!_contentContainer) return; + _contentContainer.innerHTML = data; + + _contentContainer.querySelectorAll('script').forEach(_script => { + let newScript = document.createElement('script'); + if (_script.src) { + newScript.src = _script.src; + } else { + newScript.textContent = _script.textContent; + } + _contentContainer.appendChild(newScript); + _contentContainer.removeChild(newScript); + }); + + _contentContainer.style.visibility = 'visible'; + jeedomUtils.initTooltips(_contentContainer); + const stepOrder = Array.from(document.querySelectorAll('.navDot')).map(dot => dot.dataset.step); + }) + .catch(error => { + console.error('{{Erreur au chargement de la page}}:', error); + domUtils.hideLoading(); + if (_contentContainer) { + _contentContainer.style.visibility = 'visible'; + } + }); +} + + + +function updateNavigation(_step) { + let current = document.querySelector('.navDot[data-step="' + _step + '"]'); + if (!current) { + return; + } + document.querySelector('.navBtn.bt_next').dataset.step = _step + if (!current.previousElementSibling) { + document.querySelector('.navBtn.bt_prev')?.classList.add('hidden') + } else { + document.querySelector('.navBtn.bt_prev').title = current.previousElementSibling.dataset.title + document.querySelector('.navBtn.bt_prev.hidden')?.classList.remove('hidden') } - jeedom.cmd.changeType($("#table_cmd tbody tr:last"), init(_cmd.subType)); + if (!current.nextElementSibling) { + document.querySelector('.navBtn.bt_next')?.classList.add('hidden') + if (_step == 'ready') { + document.getElementById('bt_jeedom_ready')?.classList.remove('hidden') + } + } else { + document.getElementById('bt_jeedom_ready')?.classList.add('hidden') + document.querySelector('.navBtn.bt_next').title = current.nextElementSibling.dataset.title + document.querySelector('.navBtn.bt_next.hidden')?.classList.remove('hidden') + } + jeedomUtils.addOrUpdateUrl('step', _step); + localStorage.setItem('wizardStep', _step); + if (window.updateQuitButtonVisibility) window.updateQuitButtonVisibility(); +} + +function allowNavigation(_direction = 'both', _allowed = true) { + let current = document.querySelector('.navDot.active'); + if (_direction != 'next') { + let prevDot = current.previousElementSibling; + while (prevDot) { + if (!_allowed) { + prevDot.classList.add('blocked'); + } else { + prevDot.classList.remove('blocked'); + } + prevDot = prevDot.previousElementSibling; + } + } + if (_direction != 'prev') { + let nextDot = current.nextElementSibling; + while (nextDot) { + if (!_allowed) { + nextDot.classList.add('blocked'); + } else { + nextDot.classList.remove('blocked'); + } + nextDot = nextDot.nextElementSibling; + } + } +} + +function exitWizard() { + window.location.href = 'index.php?v=d&m=mobile&p=mobile'; } diff --git a/desktop/modal/info_app.mobile.php b/desktop/modal/AppV1Info.php old mode 100755 new mode 100644 similarity index 100% rename from desktop/modal/info_app.mobile.php rename to desktop/modal/AppV1Info.php diff --git a/desktop/modal/object.mobile.php b/desktop/modal/AppV1Object.mobile.php old mode 100755 new mode 100644 similarity index 100% rename from desktop/modal/object.mobile.php rename to desktop/modal/AppV1Object.mobile.php diff --git a/desktop/modal/piece.php b/desktop/modal/AppV1Piece.php old mode 100755 new mode 100644 similarity index 71% rename from desktop/modal/piece.php rename to desktop/modal/AppV1Piece.php index 5c790f9b..b739228e --- a/desktop/modal/piece.php +++ b/desktop/modal/AppV1Piece.php @@ -44,6 +44,23 @@ ?> \ No newline at end of file +//include_file('desktop', 'mobile', 'js', 'mobile'); +//include_file('core', 'plugin.template', 'js'); +?> + + \ No newline at end of file diff --git a/desktop/modal/plugin.mobile.php b/desktop/modal/AppV1Plugin.mobile.php old mode 100755 new mode 100644 similarity index 97% rename from desktop/modal/plugin.mobile.php rename to desktop/modal/AppV1Plugin.mobile.php index a0a51fcd..9f0d031b --- a/desktop/modal/plugin.mobile.php +++ b/desktop/modal/AppV1Plugin.mobile.php @@ -47,10 +47,12 @@ $div .= ''; $div .= '
'; $path = dirname(__FILE__) . '/../../core/template/images/' . $plugin->getId(); - $files = scandir($path); - foreach ($files as $imgname) { - if (!in_array($imgname, ['.', '..'])) { - $div .= ''; + if (file_exists($path)) { + $files = scandir($path); + foreach ($files as $imgname) { + if (!in_array($imgname, ['.', '..'])) { + $div .= ''; + } } } $div .= '
'; diff --git a/desktop/modal/plugin.php b/desktop/modal/AppV1Plugin.php old mode 100755 new mode 100644 similarity index 88% rename from desktop/modal/plugin.php rename to desktop/modal/AppV1Plugin.php index c4af8dcc..11e11f40 --- a/desktop/modal/plugin.php +++ b/desktop/modal/AppV1Plugin.php @@ -116,7 +116,7 @@ ?> -{{Plugins non testés transmis à l'application}} +{{Plugins non testés transmis}}
@@ -158,7 +158,7 @@ if ($plugin->getId() != 'mobile' && $plugin->getId() != 'homebridge') { if (!in_array($plugin->getId(), $plugin_compatible)) { if (config::byKey('sendToApp', $plugin->getId(), 0) != 1) { - $opacity = jeedom::getConfiguration('eqLogic:style:noactive'); + //$opacity = ''; jeedom::getConfiguration('eqLogic:style:noactive') $_echo .= '
'; $_echo .= '
'; $_echo .= ''; @@ -176,10 +176,9 @@ } ?>
- \ No newline at end of file diff --git a/desktop/modal/scenario.php b/desktop/modal/AppV1Scenario.php old mode 100755 new mode 100644 similarity index 84% rename from desktop/modal/scenario.php rename to desktop/modal/AppV1Scenario.php index 328ee114..e8d8c417 --- a/desktop/modal/scenario.php +++ b/desktop/modal/AppV1Scenario.php @@ -75,22 +75,6 @@ searchable: true, }) - /*$('#bt_saveScenarios').off('click').on('click', function () { - console.log('save all scenarios') - $('#table_scenarioSummary tbody tr').each(function(){ - var scID = $(this).attr('data-id') - var scState = $(this).find('input.ScenarioAttr').is(':checked') - console.log(scID + ' -> ' + scState) - }) - }) - - $('.bt_saveScenario').off('click').on('click', function () { - var scID = $(this).closest('tr').attr('data-id') - var scState = $(this).closest('tr').find('input.ScenarioAttr').is(':checked') - console.log(scID + ' -> ' + scState) - - })*/ - document.getElementById('table_scenarioSummary')?.addEventListener('click', function(event) { var _target = null var sendApp = 0 @@ -101,7 +85,7 @@ type: "POST", url: "plugins/mobile/core/ajax/mobile.ajax.php", data: { - action: "savescenario", + action: "AppV1Savescenario", id: idScenario, valueSend: sendApp }, diff --git a/desktop/modal/doc1.php b/desktop/modal/doc1.php new file mode 100644 index 00000000..5e070e52 --- /dev/null +++ b/desktop/modal/doc1.php @@ -0,0 +1,13 @@ + + + + +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. + diff --git a/desktop/modal/doc2.php b/desktop/modal/doc2.php new file mode 100644 index 00000000..5e070e52 --- /dev/null +++ b/desktop/modal/doc2.php @@ -0,0 +1,13 @@ + + + + +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. + diff --git a/desktop/modal/doc3.php b/desktop/modal/doc3.php new file mode 100644 index 00000000..5e070e52 --- /dev/null +++ b/desktop/modal/doc3.php @@ -0,0 +1,13 @@ + + + + +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. + diff --git a/desktop/modal/firstPage.php b/desktop/modal/firstPage.php deleted file mode 100755 index e677ebc9..00000000 --- a/desktop/modal/firstPage.php +++ /dev/null @@ -1,30 +0,0 @@ - - - - -
-
-
- -
-
-

{{Pour connecter votre téléphone : il y a 2 méthodes possible}}

-

{{Sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box. -}}

-
- - - \ No newline at end of file diff --git a/desktop/modal/fiveModal.php b/desktop/modal/fiveModal.php deleted file mode 100755 index d4f7bf8a..00000000 --- a/desktop/modal/fiveModal.php +++ /dev/null @@ -1,58 +0,0 @@ - - -
- -

{{Fonctionnement de la Géolocalisation}}

- -
-
-

{{On ajoute une zone de Géolocalisation}}

-

{{On recherche l'adresse, on nomme la Zone, et on valide}}

-
-
-

{{La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone}}

-

{{Si vous vous trouvé dans la zone à sa création, elle passera en vert après quelques secondes}}

-
-
-

{{Modifier largueur de la zone}}

-
-
-

{{Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra vous servir à programmer des actions en fonction de son état.}}

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - - - - -
- -

{{Fonctionnement de la Géolocalisation}}

- -
-
-

{{On ajoute une zone de Géolocalisation}}

-

{{On recherche l'adresse, on nomme la Zone, et on valide}}

-
-
-

{{La zone apparaitra en rouge, signifiant que l'on se trouve pas dans la Zone}}

-

{{Si vous vous trouvé dans la zone à sa création, elle passera en vert apres quelques secondes}}

-
-
-

{{Modifier largueur de la zone}}

-
-
-

{{Ajouter une zone ajoutera dans votre équipement téléphone dans le plugin Mobile une commande binaire, qui pourra nous servir à programmer des actions en fonction de son état.}}

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - - - - -
- -

{{Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle'}}

- - -
-
-

{{Pour cela, dans l'onglet Boxs, il faut selectionner une box, et s'identifier.}}

-

{{Une fois les identifiants entrés, la box passe en haut de liste.}}

-

{{Si elle répond au ping, elle a un voyant vert}}

-

{{On peut cliquer sur Synchroniser pour mettre à jour le statut des boxs}}

-
-
-

{{Pour acceder a toutes les fonctionnalités, il faut cliquer sur la box configurée; cela permettra à l'application de recuperer ses informations, et donc autoriser les affichages du menu.}}

-
-
-

{{Menu Complet}}

-
-
- -
-
- -
-
- -
-
- -
-
-
- - - -. - */ - -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} -$eqLogics = mobile::byType('mobile'); -?> - - - - - - - - - - - - - getConfiguration('type_mobile'); - $userId = $eqLogic->getConfiguration('affect_user'); - $userType = user::byId($userId); - echo ''; - if ($eqLogic->getConfiguration('type_mobile') == 'android') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'windows') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'ios') { - echo ''; - } else { - echo ''; - } - if (is_object($userType)) { - $username = $userType->getLogin(); - echo ''; - } else { - echo ''; - } - echo ''; - echo ''; - } - ?> - -
{{Équipement}}{{Type de Mobile}}{{Utilisateur}}{{Dernière activité}}{{Date création}}
' . $eqLogic->getHumanName(true) . '' . $username . '{{Utilisateur non trouvé}}' . $eqLogic->getStatus('lastCommunication') . '' . $eqLogic->getConfiguration('createtime') . '
\ No newline at end of file diff --git a/desktop/modal/menuCustom.php b/desktop/modal/menuCustom.php index 8a248ee5..db635fdb 100755 --- a/desktop/modal/menuCustom.php +++ b/desktop/modal/menuCustom.php @@ -20,7 +20,6 @@ } $eqLogics = mobile::byType('mobile'); - ?> @@ -35,8 +34,6 @@ getConfiguration('defaultIdMobile', 'none'); $userId = $eqLogic->getConfiguration('affect_user'); @@ -60,7 +57,7 @@ echo ''; foreach ($eqLogics as $mobileToChoose) { if ($mobileToChoose->getConfiguration('appVersion') == 2) { - echo ''; + echo ''; } } echo ''; @@ -86,21 +83,15 @@
- - - - - - - - - \ No newline at end of file diff --git a/desktop/modal/modal.previousMenus.php b/desktop/modal/modal.previousMenus.php deleted file mode 100644 index fba6b057..00000000 --- a/desktop/modal/modal.previousMenus.php +++ /dev/null @@ -1,240 +0,0 @@ -. -*/ - -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} - -$eqLogics = mobile::byType('mobile'); - -?> - - - - - - - - - - - - getConfiguration('defaultIdMobile', 'none'); - $userId = $eqLogic->getConfiguration('affect_user'); - $userType = user::byId($userId); - if (is_object($userType)) { - $username = $userType->getLogin(); - echo ''; - if ($eqLogic->getConfiguration('type_mobile') == 'android') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'windows') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'ios') { - echo ''; - } else { - echo ''; - } - echo ''; - if ($eqLogic->getConfiguration('appVersion') == 2) { - $previousMenus = config::byKey('previousMenus', 'mobile'); - $phoneMenus = isset($previousMenus[$eqLogic->getLogicalId()]) ? $previousMenus[$eqLogic->getLogicalId()] : null; - if($phoneMenus != null){ - echo ''; - - }else{ - echo ''; - } - } else { - echo ''; - } - } else { - echo ''; - if ($eqLogic->getConfiguration('type_mobile') == 'android') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'windows') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'ios') { - echo ''; - } else { - echo ''; - } - echo ''; - } - } - ?> - -
{{Équipement}}{{Type de Mobile}}{{Utilisateur}}{{Menu Enregistrés}}
' . $eqLogic->getHumanName(true) . '' . $username . '{{Aucun menu enregistré}}{{APPLICATION V2 NON INTALLÉE}}
' . $eqLogic->getHumanName(true) . '{{Utilisateur non trouvé}}
- - - - - - - - - - - - - \ No newline at end of file diff --git a/desktop/modal/secPage.php b/desktop/modal/secPage.php deleted file mode 100755 index c9955f5d..00000000 --- a/desktop/modal/secPage.php +++ /dev/null @@ -1,48 +0,0 @@ - - -
-
-
-

{{COMPTE MARKET}}

- -
-
-

{{BOX ID}}

- -
-
-
-
-

{{Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe.}}

-
-
-

{{Plusieurs choix sur cet écran :}}

-

{{- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION}}

-

{{- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin.}}

-
-
-
- - - - - -
- -

{{Personnalisation du Menu}}

-

{{Vous pouvez personnaliser le Menu de votre WebView via le plugin Mobile ou l'application}}

- -
-
-

{{On clique sur Menu Custom}}

-

{{Une modale s'ouvre et vous propose vos téléphones deja connectés}}

-

{{Cliquer sur Configurer Menu sur le téléphone choisi}}

-

{{Le nombre d'icônes peut aller de 1 à 4}}

-

{{En cochant Menu Default, le menu configuré sur ce téléphone devient celui par défaut sur tous vos téléphones}}

-
-
-

{{Via l'application Mobile : si vous avez configuré une box par défaut, alors le Menu Custom apparait dans le menu de l'application}}

-

{{Même principe que via le plugin Mobile}}

-
-
- -
-
- - - -
-
-

Menu Custom Mobile

- - -
-
-
- - - - - -
-

Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market

-
- - - - -
- -
- - - -. - */ -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} -?> - - - {{Pause}} - -


-

-
-
\ No newline at end of file
diff --git a/desktop/modal/wizard.php b/desktop/modal/wizard.php
deleted file mode 100755
index 9180d07b..00000000
--- a/desktop/modal/wizard.php
+++ /dev/null
@@ -1,263 +0,0 @@
-
-
-
- -
- -
-
- $b['order']; - }); - foreach ($step as $key => $value) { - if ($i == 0) - $current_step = ' js-active current'; - else - $current_step = ''; - - echo ''; - - $i++; - } - ?> -
-
-
-
- -
- -
-
- -
- -
- - - - - -= '4.4.0') { - include_file('3rdparty', 'animate/animate', 'css'); -} else { - include_file('3rdparty', 'animate/animate', 'css'); - include_file('3rdparty', 'animate/animate', 'js'); -} - -//include('plugins/mobile/3rdparty/animate/animate.css'); -//include('plugins/mobile/3rdparty/animate/animate.js'); -//include_file('plugins/mobile/3rdparty', 'animate/animate', 'js'); -?> \ No newline at end of file diff --git a/desktop/php/mobile.php b/desktop/php/mobile.php index c2d100cc..31ffb5f0 100755 --- a/desktop/php/mobile.php +++ b/desktop/php/mobile.php @@ -5,49 +5,46 @@ } sendVarToJS('eqType', 'mobile'); $eqLogics = eqLogic::byType('mobile'); -$plugins = plugin::listPlugin(true); -$plugin_compatible = mobile::$_pluginSuported; -$plugin_widget = mobile::$_pluginWidget; -//$pathImgMenu = 'plugins/mobile/core/img/imgMenuPerso.jpg'; +$eqLogicsV1 = []; +$eqLogicsV2 = []; +foreach ($eqLogics as $eqLogic) { + if ($eqLogic->getConfiguration('appVersion', '1') == '2') { + array_push($eqLogicsV2, $eqLogic); + } else { + array_push($eqLogicsV1, $eqLogic); + } +} +$isApi = config::byKey('api::mobile::mode'); +if ($isApi == 'whiteip' || $isApi == 'disable') { + message::add('mobile', 'L\'API mobile est désactivée ou en mode whitelist IP'); +} +$isCoreApi = config::byKey('api::core::mode'); +if ($isCoreApi == 'whiteip' || $isCoreApi == 'disable') { + message::add('mobile', 'L\'API core est désactivée ou en mode whitelist IP'); +} ?>
+
- {{App V2 - (VERSION BETA SEULEMENT)}} + {{App V2}}

{{Configuration}}
- ='); - if ($displayInfo) { - echo '
'; - echo '
'; - echo '{{Gestion Mobiles}}'; - echo '
'; - } else { - echo '
'; - echo '
'; - echo '{{Gestion Mobiles}}'; - echo '
'; - } - ?> +
+
+ {{Gestion Mobiles}} +

{{QR Code}}
- - - +
+
+ {{Documentation}} +
{{Mes Téléphones Mobiles}}
@@ -59,13 +56,18 @@
getConfiguration('appVersion', '1') == '2') { + if (count($eqLogicsV2) >= 1) { // AppV2 + foreach ($eqLogicsV2 as $eqLogic) { $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; echo '
'; - echo ''; + /* getImage : + core 4.4 - returns plugin image + core 4.5 - returns the custom image if exist or else the plugin image + */ + if ($eqLogic->getImage() != 'plugins/mobile/plugin_info/mobile_icon.png') $logoV2 = $eqLogic->getImage(); + else if (file_exists('plugins/mobile/plugin_info/mobileV2_icon.png')) $logoV2 = 'plugins/mobile/plugin_info/mobileV2_icon.png'; + else $logoV2 = $eqLogic->getImage(); + echo ''; echo ''; if ($eqLogic->getConfiguration('type_mobile') == 'android') { echo ''; @@ -87,10 +89,16 @@ echo ''; echo '
'; } + } else { + echo '
'; + echo '{{Pour ajouter un téléphone, il y a 2 méthodes possible :}}
{{Sur le premier écran de l\'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box.}}'; + echo '
'; } ?>
+ +
{{App V1}}
@@ -98,7 +106,7 @@
{{Ajouter}}
-
+

{{Plugins}}
@@ -116,48 +124,53 @@
{{Mes Téléphones Mobiles}} +
+ {{Attention, l'APP V1 ne sera plus mise à jour}} +
getConfiguration('appVersion', '1') != '2') { - $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; - echo '
'; - echo ''; - echo ''; - if ($eqLogic->getConfiguration('type_mobile') == 'android') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'windows') { - echo ''; - } else if ($eqLogic->getConfiguration('type_mobile') == 'ios') { - echo ''; - } else { - echo ''; + if (count($eqLogicsV1) >= 0) { // AppV1 + foreach ($eqLogicsV1 as $eqLogic) { + if ($eqLogic->getConfiguration('appVersion', '1') != '2') { + $opacity = ($eqLogic->getIsEnable()) ? '' : 'disableCard'; + echo '
'; + echo ''; + echo ''; + if ($eqLogic->getConfiguration('type_mobile') == 'android') { + echo ''; + } else if ($eqLogic->getConfiguration('type_mobile') == 'windows') { + echo ''; + } else if ($eqLogic->getConfiguration('type_mobile') == 'ios') { + echo ''; + } else { + echo ''; + } + echo ''; + echo '
'; + echo '' . $eqLogic->getHumanName(true, true) . ''; + echo ''; + echo '
'; } - echo ''; - echo '
'; - echo '' . $eqLogic->getHumanName(true, true) . ''; - echo ''; - echo '
'; } } ?>
+ + + + \ No newline at end of file diff --git a/desktop/php/modalConfigPlugin.php b/desktop/php/modalConfigPlugin.php deleted file mode 100644 index 34b0dbc0..00000000 --- a/desktop/php/modalConfigPlugin.php +++ /dev/null @@ -1,42 +0,0 @@ -. -*/ - -if (!isConnect('admin')) { - throw new Exception('{{401 - Accès non autorisé}}'); -} - - -$logicalPlugin = secureXSS(init('logicalPlugin')); -echo '
'; -if (!@include('plugins/' . $logicalPlugin . '/plugin_info/configuration.php')) throw new Exception("{{Pas de configuration sur ce plugin}}"); -//if(!@include('plugins/zigbee/plugin_info/configuration.php')) throw new Exception("Pas de configuration sur ce plugin"); -echo '
'; - - - - - -?> - - - - \ No newline at end of file diff --git a/desktop/php/panelWebApp.php b/desktop/php/panelWebApp.php deleted file mode 100755 index 8db6ca6c..00000000 --- a/desktop/php/panelWebApp.php +++ /dev/null @@ -1,451 +0,0 @@ - -
-
-
-
- - - - -
- -
-
-
Lumières
-
2/2 Allumées
-
-
-
-
-
- - - - -
- -
-
-
Prises
-
2/3 Allumées
-
-
-
-
- - - - -
- -
-
-
Portes
-
1 Fermée
-
-
-
-
- - - - -
- -
-
-
Volets
-
Tous Fermés
-
-
-
-
-
-
-
- -
-
- -
-
-
-
Lumière Salon
-
Eteinte
-
-
- -
-
-
- -
-
- -
-
-
-
Lumière Cuisine
-
Allumée à 30%
-
-
-
- -
-
- -
-
- -
- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - - - - - - \ No newline at end of file diff --git a/desktop/php/wizard.php b/desktop/php/wizard.php new file mode 100644 index 00000000..77080e47 --- /dev/null +++ b/desktop/php/wizard.php @@ -0,0 +1,78 @@ + + + + + +
+ +
+
+ +
+
+ $title) { + $finalAttr = ($step == 'finalization') ? ' data-finalization="1"' : ''; + echo ''; + echo $i; + echo ''; + $i++; + } + ?> +
+
+ + +
+
+
+ + + + \ No newline at end of file diff --git a/docs/de_DE/changelog.md b/docs/de_DE/changelog.md index b2f30013..85e8a007 100755 --- a/docs/de_DE/changelog.md +++ b/docs/de_DE/changelog.md @@ -5,6 +5,61 @@ > Zur Erinnerung: Wenn keine Informationen zum Update vorhanden sind, bedeutet dies, dass es sich nur um die Aktualisierung von Dokumentation, Übersetzung oder Text handelt +# + +- + +# 18/06/2025 + +- Ajout alerte si api mobile désactivée ou IP blanche + +# 25/04/2025 + +- Ajout pour Max 8 Icones sur le menuCustom + + +# 24/04/2025 + +- Ajout Commande Notifications Silencieuses pour Builds : IOS 491 et Android 875 + + +# 11/04/2025 + +- Ajout paramètre Envoi NFC Direct au plugin après lecture + +# xx/08/2024 + +> **App V1** +> +> Bitte beachten Sie, dass appV1 ab dieser Version nicht mehr unterstützt wird. +> Es wird immer möglich sein, auf Ihre Ausrüstung zuzugreifen, um möglicherweise Ihre Geolokalisierungs- und Benachrichtigungsbefehle zu ersetzen. + +- AppV1-Dateien löschen. +- In der Datenbank gespeicherte Reinigungsinformationen (config). + +# 20.08.2024 + +- Benachrichtigungsinformationen auf die Registerkarte „Mobil“ verschieben" + +# 08.04.2024 + +- Berücksichtigung der Aufbewahrung von Benachrichtigungen zum Löschen von Bildern + + +# 22.07.2024 + +- Berücksichtigung der Aufbewahrung von Benachrichtigungen +- Target Sdk 34 für Android + +# 28.05.2024 + +- Geolokalisierungsänderung für die nächste App-Version +- Speicherbenachrichtigungen im Plugin +- Neue APIs für die Anwendung + +# 04.05.2024 + +- Kompatibel nur mit der 4.4 Kern oder höher. # 15.12.2023 @@ -41,11 +96,11 @@ - ZUKÜNFTIGE APPV2 ALPHA INTEGRATION IN MOBILE PLUGIN - Neue Schnittstelle Future AppV2 - Modales benutzerdefiniertes Menü Zukünftige AppV2 -- Modale QrCode Future AppV2 +- Modaler QR-Code Future AppV2 # 13.12.2021 -- Offline-Modus für QrCode (Erstellung von QrCode ohne Internet.). +- Offline-Modus für den QR-Code (Erstellung des QR-Codes ohne Internet). - Kompatibilität 4.2 Jeedom-Kern # 11.10.2021 @@ -70,7 +125,7 @@ # 15.04.2020 -- Hinzufügen von Bestellungen für jedes Handy. +- Befehle für jedes Mobiltelefon hinzugefügt. # 31.03.2020 @@ -78,12 +133,12 @@ # 19.02.2020 --http korrigieren.Fehlerzeile 39, wenn das Telefon bei der ersten Verbindung nicht authentifiziert wurde. +- Http korrigieren.Fehlerzeile 39, wenn das Telefon bei der ersten Verbindung nicht authentifiziert wurde. # v1.3.0 - ASK-Benachrichtigung - Benachrichtigungsverlauf - Schieberegler mit Prozentsatz -- große Änderung im Timing +- Ändern des Timings - Entfernen von Push zum Aktualisieren diff --git a/docs/de_DE/index.md b/docs/de_DE/index.md index d2851090..39980e48 100755 --- a/docs/de_DE/index.md +++ b/docs/de_DE/index.md @@ -1,326 +1,103 @@ # Mobiles Plugin -Plugin zur Verwendung der Jeedom Mobile-Anwendung. +Le plugin Mobile permet d'utiliser l'application Mobile Jeedom. -Die mobile Jeedom-Anwendung erfordert die Installation dieses Plugins, damit die Box mit der mobilen Anwendung kommunizieren kann. +Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin. -# Konfiguration des Mobile-Plugins für Application V2 +# Configuration du plugin Mobile pour l'application V2 -Nach der Installation des Plugins müssen Sie es nur noch aktivieren : +Après avoir installé le plugin, activez-le simplement : -![mobile1](./images/mobile1.png) + # Erste Verbindung mit der V2-Anwendung -Um Ihr Telefon zu verbinden : es gibt 2 mögliche Methoden; -Auf dem ersten Bildschirm der Anwendung wird Ihnen angeboten, Ihr Marktkonto zu verbinden und so alle mit diesem Konto verknüpften Boxen zu finden oder einfach eine Box hinzuzufügen. +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. -![v2ConnectMarket](./images/v2firstConnect.jpeg) + -> **WICHTIG** -> -> Um von den Funktionalitäten der Anwendung profitieren zu können, muss sich der Kern Ihres Jeedom in 4.4 befinden.Mindestens 0 +> **WICHTIG** +> Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4.0 ou supérieure. -#### **LOGIN ÜBER MARKET-KONTO** : +### **LOGIN ÜBER MARKET-KONTO** -![v2ConnectMarket](./images/v2connectMarket.PNG) + -Sie müssen lediglich Ihre Markt-ID und Ihr Passwort eingeben. +Saisissez simplement votre identifiant et mot de passe Market pour vous connecter. -#### **VERBINDUNG ÜBER BOX-ID** : +### **Connexion via l'ID de la Box** -![v22methods](./images/v22methods.PNG) + -Mehrere Auswahlmöglichkeiten auf diesem Bildschirm : +Sur cet écran, plusieurs options s'offrent à vous : -- Sie geben die URL Ihres Jeedoms (intern oder extern) sowie die Zugangskennungen dazu ein und bestätigen mit dem LOGIN-Button +- Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton **CONNEXION**. +- Cliquez sur **QR Code** : un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter. -- Sie klicken auf QR-Code : ein neuer Bildschirm erscheint; Sie können einen QRCode aus dem Mobile-Plugin der Box, die Sie hinzufügen möchten, über die Registerkarte QRCODE des Plugins scannen. + -![v2ModalQrApp](./images/v2QRCodeConnect.PNG) +> **Registerkarte „Qr-Code“ des Mobile-Plugins** +> -> Registerkarte „Qr-Code“ des Mobile-Plugins +Une fois cette étape terminée, vous êtes enregistré dans l'application. Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu. -> > ![v2ModalPlugin](./images/v2ModalQrCode.png) +Dans le menu, un onglet **Boxs** regroupe toutes les Box associées à votre compte Market. -Nach diesem ersten Schritt sind Sie in der Anwendung registriert: Wenn Sie das Mobile-Plugin haben, haben Sie über das Menü Zugriff auf Benachrichtigungen, QrCodes, Menüanpassung .... + -Im Menü haben Sie eine Registerkarte Boxen, die alle auf diesem Marktkonto vorhandenen Boxen zusammenfasst + -![v2MenuBoxs](./images/v2MenuBoxs.PNG) +Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder. +La Box validée apparaîtra en haut de la liste. Vous pouvez répéter cette opération pour plusieurs Box. -![v2floutedBoxs](./images/v2floutedBoxs.png) +En cliquant sur le bouton **+** en bas à droite, vous accédez à différentes options : -Klicken Sie einfach auf das Kästchen, in dem das Mobile-Plugin installiert ist, und identifizieren Sie sich dann, um auf das Kästchen zuzugreifen. +- Ajouter une Box via un QR Code (depuis le plugin Mobile), +- Ajouter une Box manuellement, +- Détecter les Box Atlas et Luna sur le réseau Wi-Fi, +- Synchroniser les informations de votre compte Market. -Das Feld wird an den Anfang der Liste gestellt, nachdem es seine Authentifizierung validiert hat. -Sie können dies für mehrere Boxen tun. + -Sie können auch unten rechts auf die Schaltfläche + klicken, um auf verschiedene Optionen zuzugreifen +Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme "actuelle". -- QRCode zum Hinzufügen einer Box zur Liste über das Mobile-Plugin, -- Manuell, um eine Box manuell hinzuzufügen -- Erkennung Atlas und Luna (wenn Sie mit WLAN verbunden sind, erkennen die Boxen im Netzwerk) -- Market-Synchronisierung, um konfigurierte Market-Kontoinformationen zu aktualisieren - -![v2greenBtnAdd](./images/v2greenBtnAdd.PNG) - -Um auf Funktionen wie Benachrichtigungen, Menüpersonalisierung oder Geolokalisierung zugreifen zu können, müssen Sie zunächst mindestens ein aktuelles Feld ausgewählt haben' - -![v2ActualBoxFlouted](./images/v2ActualBoxFlouted.jpeg) + # So funktioniert Geolokalisierung -Wir fügen eine Geolocation-Zone hinzu, indem wir auf das +-Symbol klicken - -![v2AddZone](./images/v2AddZone.jpeg) - -Wir geben die gesuchte Adresse ein und bestätigen mit der Eingabetaste auf seinem Telefon. Der Cursor positioniert sich dann auf der gewünschten Adresse. -Anschließend können wir einen Namen hinzufügen und die Zone speichern. - -Dadurch wird auf Ihrem mobilen Gerät ein neuer Befehl vom Binärtyp erstellt, der den Ein- und Ausgängen der Zone entspricht, wenn die Geolokalisierung auf Ihrem Mobiltelefon aktiviert ist. - -Wir können auch den Radius der Zone ändern, um die Erkennung der Zone zu erweitern. - -![v2ModifyBigRadius](./images/v2ModifyBigRadius.jpeg) - -# FAQ - -> **Ich habe Probleme mit Benachrichtigungen** -> -> Dieser Teil wird derzeit in der Beta-Anwendung verbessert und optimiert. - -> **Ich habe Probleme bei der Anzeige meiner Webansicht** -> -> Überprüfen Sie auf Ihrem Jeedom in den Einstellungen, ob die mobile Startseite HOME ist. - -# Einrichten des Mobile V1-Plugins - -Nach der Installation des Plugins müssen Sie es nur noch aktivieren : - -![mobile1](../images/mobile1.png) - -**Konfiguration** - -Um das Plugin zu konfigurieren, müssen Sie die Telefone hinzufügen, die auf Jeedom zugreifen können. - -So fügen Sie ein Telefon hinzu : **Plugins** → **Kommunikation** → **App -Mobile** → **Hinzufügen** - -![mobile2](../images/mobile2.png) - -Hier sind die einzugebenden Parameter : - -- **Name der mobilen Ausrüstung** : Telefonname -- **Aktivieren** : Aktivieren des Zugriffs für dieses Mobiltelefon -- **Mobiler Typ** : Auswahl des Telefonbetriebssystems (iOS, Android) -- **Benutzer** : Benutzer, der diesem Zugriff zugeordnet ist - -> **Spitze** -> -> Die Wahl des Benutzers ist wichtig, da sie die Ausrüstung bestimmt, auf die er gemäß seinen Rechten zugreifen kann. - -![mobile3](../images/mobile3.png) - -Nach dem Speichern erhalten Sie einen QRCode, mit dem sich die Anwendung selbst konfigurieren kann. - -# Konfiguration der von der App empfangenen Plugins und Befehle - -Nach der Initialisierung des Mobile Plugins haben Sie die Möglichkeit, die generischen Arten von Bestellungen, Plugins und Teilen zu ändern. - -![mobile10](../images/mobile10.png) - -Durch Klicken auf ein Plugin können Sie es autorisieren oder nicht, mit der mobilen Anwendung zu chatten, und jeden der generischen Typen konfigurieren, die seinen Befehlen zugeordnet sind. - -![mobile11](../images/mobile11.png) - -Durch Klicken auf ein Teil können Sie es autorisieren oder nicht, in der mobilen Anwendung vorhanden zu sein, und jeden der generischen Typen konfigurieren, die seinen Bestellungen zugeordnet sind. - -![mobile12](../images/mobile12.png) - -# Konfiguration der mobilen App - -Sie finden die Anwendungen auf den mobilen Jalousien : - -**Android Google Play** - -![Google Play FR](../images/Google_Play_FR.png) - -**Apple App Store** - -![App Store FR](../images/App_Store_FR.png) - -## Erster Start der App - -Wenn Sie die Mobile-Anwendung zum ersten Mal starten, wird Ihnen ein Lernprogramm angeboten, das Sie bei der Konfiguration unterstützt. - -Nachdem Sie Ihre Jeedom-Mobilanwendung heruntergeladen und installiert haben, starten Sie die Anwendung auf Ihrem Smartphone. - -Sie gelangen dann zu einem Konfigurations-Tutorial, dem Sie folgen sollten. Einige Schritte wurden zuvor ausgeführt. - -Sie haben dann die Wahl zwischen einer manuellen oder automatischen Konfiguration per QRcode. Wenn Sie sich für die Konfiguration per QR-Code entscheiden, flashen Sie einfach den QR-Code, der im Mobile App-Plugin des zuvor erstellten Smartphone-Geräts vorhanden ist. In diesem Fall stellt die Anwendung automatisch die gesamte Konfiguration Ihres Jeedom wieder her und stellt automatisch eine Verbindung her. Wenn die Verbindung über WLAN mit Ihrem Zuhause verbunden ist, verwendet die Anwendung automatisch die in Ihrem Netzwerk interne Jeedom-Ethernet-Adresse. Wenn Sie mit 4G oder 3G verbunden sind, wird Ihre externe Adresse verwendet, um eine Verbindung zu Ihrem Jeedom herzustellen (z. B. über den Jeedom-DNS-Dienst, wenn Sie diesen verwenden). Wenn Sie sich für eine manuelle Konfiguration entscheiden, müssen Sie in diesem Fall die internen und externen IP-Adressen Ihres Jeedom manuell eingeben. Diese Option ist einer informierten Öffentlichkeit vorbehalten. - -Die Anwendung wird synchronisiert und Sie gelangen auf die Startseite (vorangestellt von einem Mini-Präsentationshandbuch)). - -Die mobile Jeedom-App ist jetzt betriebsbereit. - -## Favoriten - -In der Anwendung können Sie Favoriten haben (Verknüpfungen von Befehlen, Plugins, Szenarien). +Ajoutez une zone de géolocalisation en cliquant sur l'icône **+**. -Hier ist das Verfahren zum Erstellen : + -Klicken Sie auf einem der + auf dem Startbildschirm der Anwendung : +Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone. Le curseur se positionnera automatiquement sur l'adresse. Vous pouvez ensuite nommer et sauvegarder la zone. -![mobile dashboard 1](../images/mobile_dashboard_1.PNG) +Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone. -Sie gelangen auf die Auswahlseite für den Verknüpfungstyp : +Vous pouvez également ajuster le rayon de la zone pour élargir la détection. -![mobile dashboard 2](../images/mobile_dashboard_2.PNG) + -Zum Beispiel werden wir Maßnahmen ergreifen, damit wir Teile / Objekte erhalten : +Pour supprimer une zone, cliquez sur **Éditer**, puis sur l'icône Corbeille. Cela supprimera la zone de l'application ainsi que la commande associée sur la Box. -![mobile dashboard 3](../images/mobile_dashboard_3.PNG) +# Paramètres de l'application -Wählen Sie dann einfach die gewünschte Aktion als Verknüpfung aus : +Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur). Par défaut, elles sont reglées sur 5 secondes. -![mobile dashboard 4](../images/mobile_dashboard_4.PNG) + -Es ist dann möglich, die Farbe dieser zu personalisieren (im Moment werden drei Farben vorgeschlagen) : - -![mobile dashboard 5](../images/mobile_dashboard_5.PNG) - -Sowie die beiden dazugehörigen Texte : - -![mobile dashboard 6](../images/mobile_dashboard_6.PNG) -![mobile dashboard 7](../images/mobile_dashboard_7.PNG) - -Hier haben Sie jetzt eine Verknüpfung Ihrer Bestellung (in Version 1.1 Es wird erwartet, dass Ein / Aus-Befehle auf derselben Taste angezeigt werden). - -![mobile dashboard 8](../images/mobile_dashboard_8.PNG) - -# So konfigurieren Sie generische Typen richtig - -## Generische Typen im Mobile Plugin - -Besser als Worte, hier ist ein Beispiel für die generischen Credits für ein Licht mit all seinen Steuerelementen (siehe auch die Lichttabelle unten) : - -![generic type in plugin](../images/generic_type_in_plugin.jpg) - -## Anwendungsvorlagentabellen - -### Die Lichter - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![LICHT](../images/LIGHT_1.jpg) | „Lichttaste ein“
`Button Off Light` | `LIGHT_ON`
`LIGHT_OFF` | Vorhandensein von zwei Tasten "EIN" und "Aus" keine Statusrückmeldung. | -| ![LICHT](../images/LIGHT_2.jpg) | „Lichttaste ein“
`Button Off Light`
`State Light` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE` | Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus | -| ![LICHT](../images/LIGHT_2.jpg) | „Licht-Umschalttaste“
`State Light` | `LIGHT_TOGGLE`
`LIGHT_STATE` | Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus | -| ![LICHT](../images/LIGHT_3.jpg) | „Lichttaste ein“
`Button Off Light`
`State Light`
`Light Slider` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER` | Bei vorhandener Statusrückmeldung können Sie mit der linken Taste zwischen Ein und Aus wechseln und mit dem Schieberegler die Intensität steuern | -| ![LICHT](../images/LIGHT_4.jpg) | „Lichttaste ein“
`Button Off Light`
`State Light`
`Light Slider`
`Lichtfarbe (info)`
`Lichtfarbe (Aktion)`
`Lichtmodus` (optional, wird verwendet, um Lichtmodi zu haben, zum Beispiel Regenbogen auf Hue philips) | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER`
`LIGHT_COLOR`
`LIGHT_SET_COLOR`
`LIGHT_MODE` | Bei vorhandener Statusrückmeldung können Sie mit der linken Taste zwischen Ein und Aus wechseln und mit dem Schieberegler die Intensität steuern. Im Kreis ist die Farbe der Lampe vorhanden. Wenn Sie darauf klicken, können Sie die Farbe ändern und einen Modus aktivieren | - -### Die Steckdosen - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-------------------------------: | :--------------------------------------------------------------------------- | :------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------: | -| ![ENERGIE](../images/ENERGY_1.jpg) | „Steckdosenknopf ein“
`Button Off Socket` | `ENERGY_ON`
`ENERGY_OFF` | Vorhandensein von zwei Tasten "EIN" und "Aus" keine Statusrückmeldung. | -| ![ENERGIE](../images/ENERGY_2.jpg) | „Steckdosenknopf ein“
`Button Off Socket`
`State Taking` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE` | Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus | -| ![ENERGIE](../images/ENERGY_3.jpg) | „Steckdosenknopf ein“
`Button Off Socket`
`State Taking`
`Slider Socket` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE`
`ENERGY_SLIDER` | Bei vorhandener Statusrückmeldung können Sie mit der linken Taste zwischen Ein und Aus wechseln und mit dem Schieberegler die Intensität steuern | - -### Die Fensterläden - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------: | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------: | -| ![KLAPPE](../images/FLAP_1.jpg)   | „Mount-Button-Bereich“
`Down-Button-Bereich`
`Stop Button Pane`
`State pane` (optional)) | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE` (optional) | Vorhandensein von drei Tasten "Auf", "Ab", "Stopp", optionale Statusrückmeldung. | -| ![KLAPPE](../images/FLAP_2.jpg)   | „Mount-Button-Bereich“
`Down-Button-Bereich`
`Stop Button Pane`
`State pane`
`Slider Button Pane` | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`
`FLAP_SLIDER` | Vorhandensein eines Schiebereglers mit einer Auf / Ab-Taste in Umschalten (mit Statussymbol) | - -### Inondation - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------: | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------: | -| ![FLUT](../images/FLOOD.jpg)   | `Innondation`
`TEMPERATUR` (optional)
`Luftfeuchtigkeit` (optional)
`SABOTAGE` (optional) | `FLOOD`
`TEMPERATUR` (optional)
`FEUCHTIGKEIT` (optional)
`FEUCHTIGKEIT` (optional) | Ermöglicht es Ihnen, Ihren gesamten Hochwassersensor in einer einzigen Leitung zu haben. | - -### Serrure - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :---------------------------: | :--------------------------------------------------------------------- | :-------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SPERREN](../images/LOCK.jpg)   | „Staatssperre“
`Open Button Lock`
`Lock Button Close` | `LOCK_STATE`
`LOCK_OPEN`
`LOCK_CLOSE` | Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus | - -### Meerjungfrau - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------: | :----------------------------------------------------------- | :------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SIRENE](../images/SIREN.jpg)   | „Sirenenstaat“
`Siren Button On`
`Siren Button Off` | `SIREN_STATE`
`SIREN_ON`
`SIREN_OFF` | Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus | - -### Rauch - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------: | :----------------------------------- | :----------------------------------- | :--------------------------------------------------------------: | -| ![RAUCH](../images/SMOKE.jpg)   | „Rauch“
`TEMPERATUR` (optional) | `SMOKE`
`TEMPERATUR` (optional) | Ermöglicht es Ihnen, Ihren kompletten Rauchsensor in einer einzigen Leitung zu haben. | - -### Temperatur - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------------------: | :-------------------------------------- | :-------------------------------------- | :---------: | -| ![Temperatur](../images/TEMPERATURE.jpg)   | `TEMPERATUR`
`Luftfeuchtigkeit` (optional) | `TEMPERATURE`
`FEUCHTIGKEIT` (optional) | Siehe Bild. | - -### Präsenz - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-----------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------: | -| ![Präsenz](../images/PRESENCE.jpg)   | "PRÄSENZ"
`TEMPERATUR` (optional)
`Helligkeit` (optional)
`Luftfeuchtigkeit` (optional)
`UV` (optional)
`SABOTAGE` (optional) | `PRESENCE`
`TEMPERATUR` (optional)
`BRIGHTNESS` (optional)
`FEUCHTIGKEIT` (optional)
`UV` (optional)
`SABOTAGE` (optional) | Siehe Bild. | - -### Ouvrant - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :---------------------------------: | :--------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------------: | -| ![ÖFFNUNG](../images/OPENING.jpg)   | „Tür/Fenster“
`TEMPERATUR` (optional) | `OPENING / OPENING_WINDOW`
`TEMPERATUR` (optional) | Siehe Bild (d. H. Sie können zwischen Fenster und Tür wählen). | - -### Pilotdraht - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :---------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![HEIZUNG](../images/HEATING.jpg)   | „Einschalttaste für Pilotdrahtheizung“
`Taste zum Ausheizen des Pilotkabels AUS`
`Heizungs-Pilotdrahtzustand`
`Button Pilot Wire Heizung` (optional) | `HEATING_ON`
`HEATING_OFF`
`HEATING_STATE`
`HEATING_OTHER` | Mit den Schaltflächen EIN / AUS und Status können Sie die Schaltfläche ganz links in der Vorlage erstellen, und mit der Taste "Pilotdrahtheizung" können Sie Schaltflächen hinzufügen (max. 5)) | - -## DIE JOKERS - -### Allgemeine Aktion - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :-------------------------------: | :--------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![AKTION](../images/ACTION.jpg)   | „Generische Aktion“ | „GENERIC_ACTION“ | Die Schaltfläche hat die Form des Aktionstyps. Standardmäßig ist es ein Umschalter. Wenn es sich um eine Nachricht handelt, haben Sie einen Umschlag, bei einem Schieberegler haben Sie einen Schieberegler usw... | - -### Allgemeine Informationen - -| Bild | Typ Gattung | Dev Plugin Teil | Beschreibung | -| :---------------------------: | :-------------------------------- | :---------------- | :-----------------------------------------: | -| ![DIE INFO](../images/INFO.jpg)   | „Allgemeine Informationen“ | „GENERIC_INFO“ | Der Button nimmt die Form der Art der Information an. | - -# Troubleshooting - -**Ich bin auf Android-Version der App (1.0.1 oder 1,0.0) Ich kann nicht auf meine Teile oder sogar die Konfiguration der App zugreifen.** - -Sie hatten ein Popup-Fenster, das Sie vor Bedenken hinsichtlich der Eingabehilfeneinstellungen warnte. Sie müssen daher nur zu den Eingabehilfeneinstellungen Ihres Mobiltelefons gehen und die Anwendungen mit dieser Option deaktivieren. (Ein Fix wird in Kürze in der App veröffentlicht) - -**Ich habe eine Nachricht in einer der Zeilen meiner Module, die mir sagt, dass es so ist -Fehlen eines generischen Typs !** - -Wenn Sie diese Nachricht lesen, erfahren Sie, welcher generische Typ fehlt, um eine kompatible Vorlage zu erstellen. Wenden Sie es einfach an.Siehe die [doc Kapitel Generischer Typ](https://www.jeedom.com/doc/documentation/plugins/mobile/de_DE/mobile#_configuration_des_plugins_et_commandes_que_reçoit_l_app). - -**Ich habe ein Problem mit einem der Plugins namens voll integriert (Wetter, -Thermostat, Alarm, Kamera) !** - -Zögern Sie nicht, auf Ihr Modul zuzugreifen, und klicken Sie erneut auf Speichern. Dadurch werden die mit dem Modul verknüpften generischen Typen wieder aufgenommen. +# FAQ -**Informationen zur Begrüßung der App können nicht angegeben werden !** +> **Mon mobile ne possède pas d'IQ (identifiant unique)** +> Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier. Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application. Une alerte vous indiquera que la récupération de l'IQ est en cours. -Dies ist normal und wird in Version 1.1 verfügbar sein. +> **Ich habe Probleme mit Benachrichtigungen** +> Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application. -**Ich habe die Anwendung, die viel Speicher in meinem beansprucht -Telefon !** +> **Ich habe Probleme bei der Anzeige meiner Webansicht** +> Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur **ACCUEIL**. -In Version 1.0 ist ein Fehler aufgetreten.0 und 1,0.1 im Kamerateil. Das Problem wird mit 1.0 nicht wieder auftreten.2 Um den Cache zu löschen, ohne die App zu teuer zu machen, gehen Sie einfach zur Konfiguration Ihrer mobilen App und klicken Sie auf "Cache löschen"". +> **** +> : . : ". . . . -**Ich habe Bedenken hinsichtlich der ersten Synchronisierung in der App oder von SQL im mobilen Plugin !** -Sie müssen generische Typen eingeben und das Plugin zum Senden von Generika autorisieren. Sehen Sie sich das Dokument etwas höher an. diff --git a/docs/en_US/changelog.md b/docs/en_US/changelog.md index c538cd8a..ca737ba4 100755 --- a/docs/en_US/changelog.md +++ b/docs/en_US/changelog.md @@ -5,6 +5,61 @@ > As a reminder if there is no information on the update, it means that it only concerns the updating of documentation, translation or text +# + +- + +# 18/06/2025 + +- Ajout alerte si api mobile désactivée ou IP blanche + +# 25/04/2025 + +- Ajout pour Max 8 Icones sur le menuCustom + + +# 24/04/2025 + +- Ajout Commande Notifications Silencieuses pour Builds : IOS 491 et Android 875 + + +# 11/04/2025 + +- Ajout paramètre Envoi NFC Direct au plugin après lecture + +# xx/08/2024 + +> **App V1** +> +> Please note, from this version, appV1 is no longer supported. +> It will still be possible to access your equipment, to possibly replace your geolocation and notification controls. + +- Deleting files related to AppV1. +- Cleaning the information stored in the database (config). + +# 20/08/2024 + +- Moved notification info to the “Mobile” tab" + +# 04/08/2024 + +- Taking into account retention of notifications for deletion of images + + +# 07/22/2024 + +- Taking into account retention of notifications +- Target SDK 34 for Android + +# 05/28/2024 + +- Geolocation modification for next App version +- Storage Notifications in the plugin +- New APIs for the application + +# 04/05/2024 + +- Compatible only with the 4.4 core or higher. # 15/12/2023 @@ -41,11 +96,11 @@ - FUTURE APPV2 ALPHA INTEGRATION IN MOBILE PLUGIN - New Interface Future AppV2 - Modal Custom Menu Future AppV2 -- Modal QrCode Future AppV2 +- Modal QR Code Future AppV2 # 12/13/2021 -- Offline mode for QrCode (creation of QrCode without internet.). +- Offline mode for QR Code (creation of QR Code without internet)). - Compatibility 4.2 Jeedom Core # 10/11/2021 @@ -70,7 +125,7 @@ # 04/15/2020 -- Commands added for each mobile. +- Additions of the Commands of each mobile. # 31/03/2020 @@ -78,12 +133,12 @@ # 02/19/2020 --fix http.error line 39 if phone not authenticated at first connection. +- Fix http.error line 39 if phone not authenticated on first connection. # v1.3.0 - ASK notification - Notification history - Slider with percentage -- big change in timing -- removal of push to refresh +- Changing the synchronization +- Removal of push to refresh diff --git a/docs/en_US/index.md b/docs/en_US/index.md index 685bd8df..6f77190d 100755 --- a/docs/en_US/index.md +++ b/docs/en_US/index.md @@ -1,326 +1,103 @@ # Mobile Plugin -Plugin for using the Jeedom Mobile application. +Le plugin Mobile permet d'utiliser l'application Mobile Jeedom. -The Jeedom mobile application requires the installation of this plugin so that the box can communicate with the Mobile application. +Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin. -# Configuration of the Mobile plugin for Application V2 +# Configuration du plugin Mobile pour l'application V2 -After installing the plugin, you just need to activate it : +Après avoir installé le plugin, activez-le simplement : -![mobile1](./images/mobile1.png) + # First connection to the V2 application -To connect your phone : there are 2 possible methods; -on the first screen of the application, you are offered to connect your market account, and thus find all the boxes associated with this account, or simply add a box. +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. -![v2ConnectMarket](./images/v2firstConnect.jpeg) + -> **IMPORTANT** -> -> To benefit from the application's functionalities, the core of your Jeedom must be in 4.4.0 minimum +> **IMPORTANT** +> Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4.0 ou supérieure. -#### **LOGIN VIA MARKET ACCOUNT** : +### **LOGIN VIA MARKET ACCOUNT** -![v2ConnectMarket](./images/v2connectMarket.PNG) + -All you have to do is enter your Market ID and password. +Saisissez simplement votre identifiant et mot de passe Market pour vous connecter. -#### **CONNECTION VIA BOX ID** : +### **Connexion via l'ID de la Box** -![v22methods](./images/v22methods.PNG) + -Several choices on this screen : +Sur cet écran, plusieurs options s'offrent à vous : -- You enter the url of your Jeedom (internal or external), as well as the access identifiers to it and you confirm with the LOGIN button +- Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton **CONNEXION**. +- Cliquez sur **QR Code** : un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter. -- You click on QR Code : a new screen appears; you can scan a QRCode from the Mobile plugin of the box you want to add, via the QRCODE tab of the plugin. + -![v2ModalQrApp](./images/v2QRCodeConnect.PNG) +> **Qr Code tab of the Mobile plugin** +> -> Qr Code tab of the Mobile plugin +Une fois cette étape terminée, vous êtes enregistré dans l'application. Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu. -> > ![v2ModalPlugin](./images/v2ModalQrCode.png) +Dans le menu, un onglet **Boxs** regroupe toutes les Box associées à votre compte Market. -Once this first step has been completed, you are registered in the application: if you have the Mobile plugin, you will have access via the menu to Notifications, QrCodes, Menu customization .... + -In the menu, you will have a Boxs tab, which groups together all the boxes present on this market account + -![v2MenuBoxs](./images/v2MenuBoxs.PNG) +Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder. +La Box validée apparaîtra en haut de la liste. Vous pouvez répéter cette opération pour plusieurs Box. -![v2floutedBoxs](./images/v2floutedBoxs.png) +En cliquant sur le bouton **+** en bas à droite, vous accédez à différentes options : -Simply click on the box where the Mobile plugin is installed, then identify yourself to access the box. +- Ajouter une Box via un QR Code (depuis le plugin Mobile), +- Ajouter une Box manuellement, +- Détecter les Box Atlas et Luna sur le réseau Wi-Fi, +- Synchroniser les informations de votre compte Market. -The box will go to the top of the list, having validated its authentication. -You can do this for several boxes. + -You can also click on the + button at the bottom right to access different options; +Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme "actuelle". -- QrCode to add a box to the list via the Mobile plugin, -- Manual to manually add a box -- Detection Atlas and Luna (if you are on Wifi, will detect the boxes on the network) -- Market sync to update configured Market account information - -![v2greenBtnAdd](./images/v2greenBtnAdd.PNG) - -To access features such as Notifications, Menu Personalization or Geolocation, you must first have selected at least one current box' - -![v2ActualBoxFlouted](./images/v2ActualBoxFlouted.jpeg) + # How Geolocation works -We add a Geolocation zone by clicking on the + icon - -![v2AddZone](./images/v2AddZone.jpeg) - -We type the address we are looking for, we validate with Enter on his phone; the cursor will then position itself on the desired address. -We can then add a name and save the zone. - -This will create a new command on your mobile equipment, of binary type, which will correspond to the entries and exits of the zone if geolocation is activated on your mobile phone. - -We can also change the radius of the zone, to extend the detection of the zone. - -![v2ModifyBigRadius](./images/v2ModifyBigRadius.jpeg) - -# FAQ - -> **I have problems with notifications** -> -> This part is currently being improved and optimized on the beta application. - -> **I have problems displaying my webview** -> -> On your Jeedom, in the Preferences, check that the mobile home page is HOME. - -# Setting up the Mobile V1 plugin - -After installing the plugin, you just need to activate it : - -![mobile1](../images/mobile1.png) - -**Setup** - -To configure the plugin, you must add the phones that will be able to access Jeedom. - -To Add a phone : **Plugins** → **Communication** → **App -Mobile** → **Add** - -![mobile2](../images/mobile2.png) - -Here are the parameters to enter : - -- **Name of mobile equipment** : Phone name -- **Activate** : Enabling access for this mobile -- **Mobile Type** : Phone OS selection (iOS, Android) -- **User** : User associated with this access - -> **Tip** -> -> The choice of the user is important because it determines the equipment to which he will have access according to his rights. - -![mobile3](../images/mobile3.png) - -After saving, you will get a QRCode allowing the application to configure itself. - -# Configuration of plugins and commands received by the app - -After the initialization of the Mobile Plugin you have the possibility to modify the generic types of orders, plugins and parts. - -![mobile10](../images/mobile10.png) - -By clicking on a plugin, you can authorize it or not to chat with the mobile application, and configure each of the generic types associated with its commands. - -![mobile11](../images/mobile11.png) - -By clicking on a part, you can authorize it or not to be present in the mobile application, and configure each of the generic types associated with its orders. - -![mobile12](../images/mobile12.png) - -# Mobile app configuration - -You will find the applications on the mobile blinds : - -**Android Google Play** - -![Google Play FR](../images/Google_Play_FR.png) - -**Apple App Store** - -![App Store FR](../images/App_Store_FR.png) - -## First launch of the app - -When you launch the Mobile application for the first time, you will be offered a tutorial to help you configure it. - -After downloading and installing your Jeedom mobile application, launch the application on your smartphone. - -You then arrive in a configuration tutorial which we advise you to follow. Some steps have been done previously. - -You will then have the choice between a manual or automatic configuration by QRcode. If you choose to configure by QRcode, just flash the QRcode present on the Mobile App plugin in the smartphone equipment created previously. In this case, the application will automatically recover all the configuration of your Jeedom and connect automatically. When it is connected to your home via Wifi, the application will automatically use the Jeedom ethernet address internal to your network. When you are connected in 4G or 3G, it will use your external address to connect to your Jeedom (for example via the Jeedom DNS service if you use it). If you choose manual configuration, in this case you will need to manually enter the internal and external IP addresses of your Jeedom. This option is reserved for an informed public. - -The application will synchronize and you will arrive on its home page (preceded by a mini presentation guide). - -Jeedom mobile app is now ready to work. - -## Favorites - -On the application you can have Favorites (shortcuts of commands, plugins, scenarios). +Ajoutez une zone de géolocalisation en cliquant sur l'icône **+**. -Here is the procedure for creating them : + -Click on one of the + on the home screen of the application : +Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone. Le curseur se positionnera automatiquement sur l'adresse. Vous pouvez ensuite nommer et sauvegarder la zone. -![mobile dashboard 1](../images/mobile_dashboard_1.PNG) +Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone. -You will arrive on the shortcut type selection page : +Vous pouvez également ajuster le rayon de la zone pour élargir la détection. -![mobile dashboard 2](../images/mobile_dashboard_2.PNG) + -For example, we are going to take Action, so it offers us Coins / Objects : +Pour supprimer une zone, cliquez sur **Éditer**, puis sur l'icône Corbeille. Cela supprimera la zone de l'application ainsi que la commande associée sur la Box. -![mobile dashboard 3](../images/mobile_dashboard_3.PNG) +# Paramètres de l'application -Then simply select the action you want as a shortcut : +Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur). Par défaut, elles sont reglées sur 5 secondes. -![mobile dashboard 4](../images/mobile_dashboard_4.PNG) + -It is then possible to personalize the color of this one (for the moment three colors are proposed) : - -![mobile dashboard 5](../images/mobile_dashboard_5.PNG) - -As well as the two associated texts : - -![mobile dashboard 6](../images/mobile_dashboard_6.PNG) -![mobile dashboard 7](../images/mobile_dashboard_7.PNG) - -Here, you have now a shortcut of your order (in version 1.1 On / Off commands are expected to appear on the same key). - -![mobile dashboard 8](../images/mobile_dashboard_8.PNG) - -# How to properly configure generic types - -## Generic Types in the Mobile plugin - -Better than words, here is an example of the generic credits for a light with all its controls (see also the Light table below) : - -![generic type in plugin](../images/generic_type_in_plugin.jpg) - -## Application template tables - -### The lights - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![LIGHT](../images/LIGHT_1.jpg) | `Light Button On`
`Button Off Light` | `LIGHT_ON`
`LIGHT_OFF` | presence of two buttons "ON" and "Off" no status feedback. | -| ![LIGHT](../images/LIGHT_2.jpg) | `Light Button On`
`Button Off Light`
`State Light` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE` | Status feedback present, the left button toggles between on and off | -| ![LIGHT](../images/LIGHT_2.jpg) | `Light Toggle Button`
`State Light` | `LIGHT_TOGGLE`
`LIGHT_STATE` | Status feedback present, the left button toggles between on and off | -| ![LIGHT](../images/LIGHT_3.jpg) | `Light Button On`
`Button Off Light`
`State Light`
`Light Slider` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER` | Status feedback present, the left button allows to switch between On and Off and the slider allows to control the intensity | -| ![LIGHT](../images/LIGHT_4.jpg) | `Light Button On`
`Button Off Light`
`State Light`
`Light Slider`
`Light Color (info)`
`Light Color (action)`
`Light Mode` (optional, it is used to have light modes, for example rainbow on Hue philips) | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER`
`LIGHT_COLOR`
`LIGHT_SET_COLOR`
`LIGHT_MODE` | Status feedback present, the left button allows to switch between On and Off and the slider allows to control the intensity. In the circle the color of the lamp is present and when you click it you can change the color and activate a mode | - -### The plugs - -| Picture | Type generic | Dev plugin part | Description | -| :-------------------------------: | :--------------------------------------------------------------------------- | :------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------: | -| ![ENERGY](../images/ENERGY_1.jpg) | `Socket Button On`
`Button Off socket` | `ENERGY_ON`
`ENERGY_OFF` | presence of two buttons "ON" and "Off" no status feedback. | -| ![ENERGY](../images/ENERGY_2.jpg) | `Socket Button On`
`Button Off socket`
`State Taking` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE` | Status feedback present, the left button toggles between on and off | -| ![ENERGY](../images/ENERGY_3.jpg) | `Socket Button On`
`Button Off socket`
`State Taking`
`Slider socket` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE`
`ENERGY_SLIDER` | Status feedback present, the left button allows to switch between On and Off and the slider allows to control the intensity | - -### Shutters - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------: | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------: | -| ![FLAP](../images/FLAP_1.jpg)   | `Mount Button Pane`
`Down button pane`
`Stop Button Pane`
`State pane` (optional) | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE` (optional) | Presence of three buttons "Up", "Down", "Stop", optional status feedback. | -| ![FLAP](../images/FLAP_2.jpg)   | `Mount Button Pane`
`Down button pane`
`Stop Button Pane`
`State pane`
`Slider Button Pane` | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`
`FLAP_SLIDER` | Presence of a slider, with an Up / Down button in Toggle (with status icon) | - -### Inondation - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------: | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------: | -| ![FLOOD](../images/FLOOD.jpg)   | `Innondation`
`TEMPERATURE` (optional)
`Humidity` (optional)
`SABOTAGE` (optional) | `FLOOD`
`TEMPERATURE` (optional)
`HUMIDITY` (optional)
`HUMIDITY` (optional) | Allows you to have your complete flood sensor on a single line. | - -### Serrure - -| Picture | Type generic | Dev plugin part | Description | -| :---------------------------: | :--------------------------------------------------------------------- | :-------------------------------------------- | :---------------------------------------------------------------------------: | -| ![LOCK](../images/LOCK.jpg)   | `State Lock`
`Open Button Lock`
`Lock Button Close` | `LOCK_STATE`
`LOCK_OPEN`
`LOCK_CLOSE` | Status feedback present, the left button toggles between on and off | - -### Mermaid - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------: | :----------------------------------------------------------- | :------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SIREN](../images/SIREN.jpg)   | `Siren State`
`Siren Button On`
`Siren Button Off` | `SIREN_STATE`
`SIREN_ON`
`SIREN_OFF` | Status feedback present, the left button toggles between on and off | - -### Smoke - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------: | :----------------------------------- | :----------------------------------- | :--------------------------------------------------------------: | -| ![SMOKE](../images/SMOKE.jpg)   | `Smoke`
`TEMPERATURE` (optional) | `SMOKE`
`TEMPERATURE` (optional) | Allows you to have your complete smoke sensor on a single line. | - -### Temperature - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------------------: | :-------------------------------------- | :-------------------------------------- | :---------: | -| ![Temperature](../images/TEMPERATURE.jpg)   | `TEMPERATURE`
`Humidity` (optional) | `TEMPERATURE`
`HUMIDITY` (optional) | See picture. | - -### Presence - -| Picture | Type generic | Dev plugin part | Description | -| :-----------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------: | -| ![Presence](../images/PRESENCE.jpg)   | `PRESENCE`
`TEMPERATURE` (optional)
`Brightness` (optional)
`Humidity` (optional)
`UV` (optional)
`SABOTAGE` (optional) | `PRESENCE`
`TEMPERATURE` (optional)
`BRIGHTNESS` (optional)
`HUMIDITY` (optional)
`UV` (optional)
`SABOTAGE` (optional) | See picture. | - -### Ouvrant - -| Picture | Type generic | Dev plugin part | Description | -| :---------------------------------: | :--------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------------: | -| ![OPENING](../images/OPENING.jpg)   | `Door/Window`
`TEMPERATURE` (optional) | `OPENING / OPENING_WINDOW`
`TEMPERATURE` (optional) | See Image (i.e. you can choose between window and door). | - -### Pilot wire - -| Picture | Type generic | Dev plugin part | Description | -| :---------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![HEATING](../images/HEATING.jpg)   | `Pilot wire heating ON button`
`Heating pilot wire OFF button`
`Heating pilot wire State`
`Button pilot wire heating` (optional) | `HEATING_ON`
`HEATING_OFF`
`HEATING_STATE`
`HEATING_OTHER` | The ON / OFF and Status buttons allow you to create the button on the far left of the template and the `button pilot wire heating` are there to add buttons (5 max) | - -## THE JOKERS - -### Generic Action - -| Picture | Type generic | Dev plugin part | Description | -| :-------------------------------: | :--------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![ACTION](../images/ACTION.jpg)   | `Generic Action` | `GENERIC_ACTION` | The button takes the form of the action type. By default it's a toggle, if it's a message then you have an envelope, if slider you have a slider etc... | - -### Generic Info - -| Picture | Type generic | Dev plugin part | Description | -| :---------------------------: | :-------------------------------- | :---------------- | :-----------------------------------------: | -| ![INFO](../images/INFO.jpg)   | `Generic Information` | `GENERIC_INFO` | The button takes the form of the type of information. | - -# Troubleshooting - -**I am on Android version of the app (1.0.1 or 1.0.0) I cannot access my parts or even the configuration of the app.** - -You had a popup warning you of a concern about the accessibility settings, so you just have to go to the accessibility settings of your mobile and uncheck the applications using this option. (A fix will be brought soon on the app) - -**I have a message in one of the lines of my modules telling me that it -missing a Generic Type !** - -By reading this message, it tells you what generic type is missing to create a compatible template. Just apply it.Refer to the [doc chapter Generic Type](https://www.jeedom.com/doc/documentation/plugins/mobile/en_US/mobile#_configuration_des_plugins_et_commandes_que_reçoit_l_app). - -**I have a problem with one of the plugins called fully integrated (weather, -thermostat, alarm, camera) !** - -Do not hesitate to access your module and click on save again, this will re-include the generic types associated with the module. +# FAQ -**Unable to put an info on the welcome of the app !** +> **Mon mobile ne possède pas d'IQ (identifiant unique)** +> Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier. Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application. Une alerte vous indiquera que la récupération de l'IQ est en cours. -This is normal, it will be available on version 1.1. +> **I have problems with notifications** +> Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application. -**I have the application which takes up a lot of memory in my -Phone !** +> **I have problems displaying my webview** +> Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur **ACCUEIL**. -There was a bug on versions 1.0.0 and 1.0.1 on the Camera part. The problem will not happen again with 1.0.2, to delete the cache without overpricing the app, simply go to the configuration of your Mobile App and click on "delete the cache". +> **** +> : . : ". . . . -**I have a concern of first synchronization on the app or of sql on the mobile plugin !** -You have to put generic types and authorize the plugin to send generics see the doc a little higher. diff --git a/docs/es_ES/changelog.md b/docs/es_ES/changelog.md index be5c7333..79820d6f 100755 --- a/docs/es_ES/changelog.md +++ b/docs/es_ES/changelog.md @@ -5,6 +5,61 @@ > Como recordatorio si no hay información sobre la actualización, significa que solo se refiere a la actualización de documentación, traducción o texto +# + +- + +# 18/06/2025 + +- Ajout alerte si api mobile désactivée ou IP blanche + +# 25/04/2025 + +- Ajout pour Max 8 Icones sur le menuCustom + + +# 24/04/2025 + +- Ajout Commande Notifications Silencieuses pour Builds : IOS 491 et Android 875 + + +# 11/04/2025 + +- Ajout paramètre Envoi NFC Direct au plugin après lecture + +# xx/08/2024 + +> **Aplicación V1** +> +> Tenga en cuenta que a partir de esta versión, la aplicación V1 ya no es compatible. +> Siempre será posible acceder a su equipo, para posiblemente reemplazar sus comandos de geolocalización y notificación. + +- Eliminar archivos AppV1. +- Información de limpieza almacenada en la base de datos (config). + +# 20/08/2024 + +- Mover la información de notificación a la pestaña "Móvil"" + +# 08/04/2024 + +- Teniendo en cuenta la retención de notificaciones por eliminación de imágenes + + +# 22/07/2024 + +- Teniendo en cuenta la retención de notificaciones +- Objetivo SDK 34 para Android + +# 28/05/2024 + +- Modificación de geolocalización para la próxima versión de la aplicación +- Notificaciones de almacenamiento en el complemento +- Nuevas API para la aplicación + +# 05/04/2024 + +- Compatible solo con los 4.4 núcleos o superior. # 15/12/2023 @@ -41,11 +96,11 @@ - FUTURA INTEGRACIÓN DE APPV2 ALPHA EN PLUGIN MÓVIL - Nueva interfaz Future AppV2 - Menú personalizado modal Future AppV2 -- Modal QrCode Future AppV2 +- Aplicación futura de código QR modal V2 # 13/12/2021 -- Modo sin conexión para QrCode (creación de QrCode sin Internet.). +- Modo offline para el Código QR (creación del Código QR sin internet). - Compatibilidad 4.2 Jeedom Core # 11/10/2021 @@ -70,7 +125,7 @@ # 15/04/2020 -- Adición de órdenes para cada móvil. +- Comandos agregados para cada móvil. # 31/03/2020 @@ -78,12 +133,12 @@ # 19/02/2020 --arreglar http.línea de error 39 si el teléfono no está autenticado en la primera conexión. +- Arreglar http.Línea de error 39 si el teléfono no está autenticado en la primera conexión. # v1.3.0 - Pedir notificación - Historial de notificaciones - Control deslizante con porcentaje -- gran cambio en el tiempo -- eliminación de empuje para actualizar +- Cambiando el tiempo +- Eliminación de empuje para actualizar diff --git a/docs/es_ES/index.md b/docs/es_ES/index.md index 897ffbf3..3147932e 100755 --- a/docs/es_ES/index.md +++ b/docs/es_ES/index.md @@ -1,326 +1,103 @@ # Complemento móvil -Complemento para usar la aplicación Jeedom Mobile. +Le plugin Mobile permet d'utiliser l'application Mobile Jeedom. -La aplicación móvil Jeedom requiere la instalación de este complemento para que la caja pueda comunicarse con la aplicación móvil. +Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin. -# Configuración del complemento móvil para la aplicación V2 +# Configuration du plugin Mobile pour l'application V2 -Después de instalar el complemento, solo necesita activarlo : +Après avoir installé le plugin, activez-le simplement : -![mobile1](./images/mobile1.png) + # Primera conexión a la aplicación V2 -Para conectar tu teléfono : hay 2 métodos posibles; -en la primera pantalla de la aplicación, se le ofrece conectar su cuenta de mercado y así encontrar todas las casillas asociadas a esta cuenta, o simplemente agregar una casilla. +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. -![v2ConnectMarket](./images/v2firstConnect.jpeg) + -> **IMPORTANTE** -> -> Para beneficiarse de las funcionalidades de la aplicación, el núcleo de su Jeedom debe estar en 4.4.0 mínimo +> **IMPORTANTE** +> Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4.0 ou supérieure. -#### **INICIAR SESIÓN A TRAVÉS DE LA CUENTA DE MERCADO** : +### **INICIAR SESIÓN A TRAVÉS DE LA CUENTA DE MERCADO** -![v2ConnectMarket](./images/v2connectMarket.PNG) + -Todo lo que tiene que hacer es ingresar su Market ID y contraseña. +Saisissez simplement votre identifiant et mot de passe Market pour vous connecter. -#### **CONEXIÓN MEDIANTE BOX ID** : +### **Connexion via l'ID de la Box** -![v22methods](./images/v22methods.PNG) + -Varias opciones en esta pantalla : +Sur cet écran, plusieurs options s'offrent à vous : -- Ingresas la url de tu Jeedom (interna o externa), así como los identificadores de acceso a la misma y confirmas con el botón LOGIN +- Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton **CONNEXION**. +- Cliquez sur **QR Code** : un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter. -- Haces clic en el código QR : aparece una nueva pantalla; puede escanear un QRCode desde el complemento móvil del cuadro que desea agregar, a través de la pestaña QRCODE del complemento. + -![v2ModalQrApp](./images/v2QRCodeConnect.PNG) +> **Pestaña Código QR del complemento móvil** +> -> Pestaña Código QR del complemento móvil +Une fois cette étape terminée, vous êtes enregistré dans l'application. Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu. -> > ![Complemento v2Modal](./images/v2ModalQrCode.png) +Dans le menu, un onglet **Boxs** regroupe toutes les Box associées à votre compte Market. -Una vez realizado este primer paso, ya estás registrado en la aplicación: si tiene el complemento móvil, tendrá acceso a través del menú a Notificaciones, QrCodes, Personalización del menú .... + -En el menú, tendrá una pestaña Cajas, que agrupa todas las cajas presentes en esta cuenta de mercado + -![v2MenuBoxs](./images/v2MenuBoxs.PNG) +Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder. +La Box validée apparaîtra en haut de la liste. Vous pouvez répéter cette opération pour plusieurs Box. -![v2floutedBoxs](./images/v2floutedBoxs.png) +En cliquant sur le bouton **+** en bas à droite, vous accédez à différentes options : -Simplemente haga clic en el cuadro donde está instalado el complemento móvil, luego identifíquese para acceder al cuadro. +- Ajouter une Box via un QR Code (depuis le plugin Mobile), +- Ajouter une Box manuellement, +- Détecter les Box Atlas et Luna sur le réseau Wi-Fi, +- Synchroniser les informations de votre compte Market. -La casilla irá al principio de la lista, habiendo validado su autenticación. -Puedes hacer esto para varias cajas. + -También puede hacer clic en el botón + en la parte inferior derecha para acceder a diferentes opciones; +Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme "actuelle". -- QrCode para agregar un cuadro a la lista a través del complemento móvil, -- Manual para agregar una caja manualmente -- Detección Atlas y Luna (si estás en Wifi, detectará las cajas en la red) -- Sincronización de Market para actualizar la información de la cuenta de Market configurada - -![v2greenBtnAdd](./images/v2greenBtnAdd.PNG) - -Para acceder a funciones como Notificaciones, Personalización de Menú o Geolocalización, primero debes haber seleccionado al menos una casilla actual' - -![v2ActualBoxFlouted](./images/v2ActualBoxFlouted.jpeg) + # Cómo funciona la geolocalización -Añadimos una zona de Geolocalización pulsando en el icono + - -![v2AddZone](./images/v2AddZone.jpeg) - -Escribimos la dirección que buscamos, validamos con Enter en su teléfono; el cursor se posicionará entonces en la dirección deseada. -Luego podemos agregar un nombre y guardar la zona. - -Esto creará un nuevo comando en tu equipo móvil, de tipo binario, que corresponderá a las entradas y salidas de la zona si la geolocalización está activada en tu teléfono móvil. - -También podemos cambiar el radio de la zona, para ampliar la detección de la zona. - -![v2ModifyBigRadius](./images/v2ModifyBigRadius.jpeg) - -# FAQ - -> **Tengo problemas con las notificaciones** -> -> Esta parte se está mejorando y optimizando actualmente en la aplicación beta. - -> **Tengo problemas para mostrar mi vista web** -> -> En tu Jeedom, en Preferencias, comprueba que la página de inicio móvil sea INICIO. - -# Configurar el complemento Mobile V1 - -Después de instalar el complemento, solo necesita activarlo : - -![mobile1](../images/mobile1.png) - -**Configuración** - -Para configurar el complemento, debe agregar los teléfonos que podrán acceder a Jeedom. - -Para agregar un teléfono : **Plugins** → **Comunicación** → **App -Mobile** → **Añadir** - -![mobile2](../images/mobile2.png) - -Aquí están los parámetros para ingresar : - -- **Nombre del equipo móvil** : Nombre del teléfono -- **Activar** : Habilitar el acceso para este móvil -- **Tipo de móvil** : Selección del sistema operativo del teléfono (iOS, Android) -- **Usuario** : Usuario asociado con este acceso - -> **Punta** -> -> La elección del usuario es importante porque determina el equipo al que tendrá acceso de acuerdo con sus derechos. - -![mobile3](../images/mobile3.png) - -Después de guardar, obtendrá un QRCode que permite que la aplicación se configure. - -# Configuración de complementos y comandos recibidos por la aplicación - -Después de la inicialización del complemento móvil, tiene la posibilidad de modificar los tipos genéricos de pedidos, complementos y piezas. - -![mobile10](../images/mobile10.png) - -Al hacer clic en un complemento, puede autorizarlo o no a chatear con la aplicación móvil y configurar cada uno de los tipos genéricos asociados con sus comandos. - -![mobile11](../images/mobile11.png) - -Al hacer clic en una parte, puede autorizarla o no para que esté presente en la aplicación móvil y configurar cada uno de los tipos genéricos asociados con sus pedidos. - -![mobile12](../images/mobile12.png) - -# Configuración de la aplicación móvil - -Encontrará las aplicaciones en las persianas móviles : - -**Android Google Play** - -![Google Play FR](../images/Google_Play_FR.png) - -**Apple App Store** - -![App Store FR](../images/App_Store_FR.png) - -## Primer lanzamiento de la aplicación - -Cuando inicie la aplicación móvil por primera vez, se le ofrecerá un tutorial para ayudarlo a configurarla. - -Después de descargar e instalar su aplicación móvil Jeedom, inicie la aplicación en su teléfono inteligente. - -Luego llega a un tutorial de configuración que le recomendamos que siga. Algunos pasos se han realizado previamente. - -Luego podrá elegir entre una configuración manual o automática por QRcode. Si opta por la configuración de QRcode, simplemente muestre el QRcode presente en el complemento de la aplicación móvil en el equipo del teléfono inteligente creado previamente. En este caso, la aplicación recuperará automáticamente toda la configuración de su Jeedom y se conectará automáticamente. Cuando está conectado a su hogar a través de Wifi, la aplicación usará automáticamente la dirección Ethernet de Jeedom interna de su red. Cuando esté conectado en 4G o 3G, usará su dirección externa para conectarse a su Jeedom (por ejemplo, a través del servicio DNS de Jeedom si lo usa)). Si elige la configuración manual, en este caso deberá ingresar manualmente las direcciones IP internas y externas de su Jeedom. Esta opción está reservada para un público informado. - -La aplicación se sincronizará y usted llegará a su página de inicio (precedida por una mini guía de presentación). - -La aplicación móvil Jeedom ahora está lista para funcionar. - -## Favoritos - -En la aplicación puede tener Favoritos (accesos directos de comandos, complementos, escenarios). +Ajoutez une zone de géolocalisation en cliquant sur l'icône **+**. -Aquí está el procedimiento para crearlos : + -Haga clic en uno de los + en la pantalla de inicio de la aplicación : +Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone. Le curseur se positionnera automatiquement sur l'adresse. Vous pouvez ensuite nommer et sauvegarder la zone. -![mobile dashboard 1](../images/mobile_dashboard_1.PNG) +Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone. -Llegará a la página de selección de tipo de acceso directo : +Vous pouvez également ajuster le rayon de la zone pour élargir la détection. -![mobile dashboard 2](../images/mobile_dashboard_2.PNG) + -Por ejemplo, vamos a tomar medidas, por lo que nos ofrece monedas / objetos : +Pour supprimer une zone, cliquez sur **Éditer**, puis sur l'icône Corbeille. Cela supprimera la zone de l'application ainsi que la commande associée sur la Box. -![mobile dashboard 3](../images/mobile_dashboard_3.PNG) +# Paramètres de l'application -Luego, simplemente seleccione la acción que desea como acceso directo : +Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur). Par défaut, elles sont reglées sur 5 secondes. -![mobile dashboard 4](../images/mobile_dashboard_4.PNG) + -Entonces es posible personalizar el color de este (por el momento se proponen tres colores) : - -![mobile dashboard 5](../images/mobile_dashboard_5.PNG) - -Así como los dos textos asociados : - -![mobile dashboard 6](../images/mobile_dashboard_6.PNG) -![mobile dashboard 7](../images/mobile_dashboard_7.PNG) - -Aquí, ahora tiene un acceso directo de su pedido (en la versión 1.1 Se espera que los comandos de encendido / apagado aparezcan en la misma tecla). - -![mobile dashboard 8](../images/mobile_dashboard_8.PNG) - -# Cómo configurar correctamente los tipos genéricos - -## Tipos genéricos en el complemento móvil - -Mejor que las palabras, aquí hay un ejemplo de los créditos genéricos para una luz con todos sus controles (vea también la tabla de Luz a continuación)) : - -![generic type in plugin](../images/generic_type_in_plugin.jpg) - -## Tablas de plantillas de aplicación - -### Las luces - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![LUZ](../images/LIGHT_1.jpg) | `Botón de luz encendido`
`Botón apagado luz` | `LIGHT_ON`
`LIGHT_OFF` | presencia de dos botones "ON" y "Off" sin retroalimentación de estado. | -| ![LUZ](../images/LIGHT_2.jpg) | `Botón de luz encendido`
`Botón apagado luz`
`State Light` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE` | Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado | -| ![LUZ](../images/LIGHT_2.jpg) | `Botón de alternancia de luz`
`State Light` | `LIGHT_TOGGLE`
`LIGHT_STATE` | Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado | -| ![LUZ](../images/LIGHT_3.jpg) | `Botón de luz encendido`
`Botón apagado luz`
`State Light`
`Light Slider` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER` | Estado de retroalimentación presente, el botón izquierdo permite cambiar entre Encendido y Apagado y el control deslizante permite controlar la intensidad | -| ![LUZ](../images/LIGHT_4.jpg) | `Botón de luz encendido`
`Botón apagado luz`
`State Light`
`Light Slider`
`Color claro (información)`
`Color claro (acción)`
`Modo de luz` (opcional, se utiliza para tener modos de luz, por ejemplo, arco iris en Hue philips) | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER`
`LIGHT_COLOR`
`LIGHT_SET_COLOR`
`LIGHT_MODE` | Estado de retroalimentación presente, el botón izquierdo permite cambiar entre Encendido y Apagado y el control deslizante permite controlar la intensidad. En el círculo, el color de la lámpara está presente y, al hacer clic en él, puede cambiar el color y activar un modo | - -### Los enchufes - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-------------------------------: | :--------------------------------------------------------------------------- | :------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------: | -| ![ENERGÍA](../images/ENERGY_1.jpg) | `Botón de enchufe activado`
`Toma de botón apagado` | `ENERGY_ON`
`ENERGY_OFF` | presencia de dos botones "ON" y "Off" sin retroalimentación de estado. | -| ![ENERGÍA](../images/ENERGY_2.jpg) | `Botón de enchufe activado`
`Toma de botón apagado`
`Toma de estado` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE` | Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado | -| ![ENERGÍA](../images/ENERGY_3.jpg) | `Botón de enchufe activado`
`Toma de botón apagado`
`Toma de estado`
`Toma deslizante` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE`
`ENERGY_SLIDER` | Estado de retroalimentación presente, el botón izquierdo permite cambiar entre Encendido y Apagado y el control deslizante permite controlar la intensidad | - -### Los boletos - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------: | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------: | -| ![SOLAPA](../images/FLAP_1.jpg)   | `Panel de botones de montaje`
`Panel de botones hacia abajo`
`Panel de botones de parada`
`Panel de estado` (opcional) | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE` (opcional) | Presencia de tres botones "Arriba", "Abajo", "Detener", retroalimentación de estado opcional. | -| ![SOLAPA](../images/FLAP_2.jpg)   | `Panel de botones de montaje`
`Panel de botones hacia abajo`
`Panel de botones de parada`
`Panel de estado`
`Panel del botón deslizante` | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`
`FLAP_SLIDER` | Presencia de un control deslizante, con un botón Arriba / Abajo en Toggle (con icono de estado) | - -### Inondation - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------: | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------: | -| ![INUNDACIÓN](../images/FLOOD.jpg)   | `Innondation`
`TEMPERATURA` (opcional)
`Humedad` (opcional)
`SABOTAGE` (opcional) | `FLOOD`
`TEMPERATURA` (opcional)
`HUMEDAD` (opcional)
`HUMEDAD` (opcional) | Le permite tener su sensor de inundación completo en una sola línea. | - -### Serrure - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :---------------------------: | :--------------------------------------------------------------------- | :-------------------------------------------- | :---------------------------------------------------------------------------: | -| ![CERRAR](../images/LOCK.jpg)   | `Bloqueo de estado`
`Bloqueo de botón abierto`
`Cerrar el botón de bloqueo` | `LOCK_STATE`
`LOCK_OPEN`
`LOCK_CLOSE` | Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado | - -### Sirena - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------: | :----------------------------------------------------------- | :------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SIRENA](../images/SIREN.jpg)   | "Estado de sirena"
`Siren Button On`
`Siren Button Off` | `SIREN_STATE`
`SIREN_ON`
`SIREN_OFF` | Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado | - -### Humo - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------: | :----------------------------------- | :----------------------------------- | :--------------------------------------------------------------: | -| ![FUMAR](../images/SMOKE.jpg)   | `humo`
`TEMPERATURA` (opcional) | `SMOKE`
`TEMPERATURA` (opcional) | Le permite tener su sensor de humo completo en una sola línea. | - -### Temperatura - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------------------: | :-------------------------------------- | :-------------------------------------- | :---------: | -| ![Temperatura](../images/TEMPERATURE.jpg)   | `TEMPERATURA`
`Humedad` (opcional) | `TEMPERATURE`
`HUMEDAD` (opcional) | Ver foto. | - -### Presencia - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-----------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------: | -| ![Presencia](../images/PRESENCE.jpg)   | `PRESENCIA`
`TEMPERATURA` (opcional)
`Brillo` (opcional)
`Humedad` (opcional)
`UV` (opcional)
`SABOTAGE` (opcional) | `PRESENCE`
`TEMPERATURA` (opcional)
`BRILLO` (opcional)
`HUMEDAD` (opcional)
`UV` (opcional)
`SABOTAGE` (opcional) | Ver foto. | - -### Ouvrant - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :---------------------------------: | :--------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------------: | -| ![APERTURA](../images/OPENING.jpg)   | `Puerta/Ventana`
`TEMPERATURA` (opcional) | `OPENING / OPENING_WINDOW`
`TEMPERATURA` (opcional) | Ver imagen (es decir, puede elegir entre ventana y puerta). | - -### Cable piloto - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :---------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![CALEFACCIÓN](../images/HEATING.jpg)   | `Botón de encendido del calentamiento del cable piloto`
`Botón de apagado del cable piloto de calentamiento`
`Calentar el estado del cable piloto`
`Botón de calentamiento del cable piloto` (opcional) | `HEATING_ON`
`HEATING_OFF`
`HEATING_STATE`
`HEATING_OTHER` | Los botones ON / OFF y Status le permiten crear el botón en el extremo izquierdo de la plantilla y el `botón de calentamiento del cable piloto 'está ahí para agregar botones (5 máx) | - -## Los bromistas - -### Acción genérica - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :-------------------------------: | :--------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![ACCIÓN](../images/ACTION.jpg)   | `Acción genérica` | `ACCIÓN_GENERICA` | El botón toma la forma del tipo de acción. De forma predeterminada es un interruptor, si es un mensaje entonces tienes un sobre, si es un control deslizante tienes un control deslizante, etc... | - -### Información genérica - -| Imagen | Tipo genérico | Parte del complemento de desarrollo | Descripción | -| :---------------------------: | :-------------------------------- | :---------------- | :-----------------------------------------: | -| ![INFORMACIÓN](../images/INFO.jpg)   | `Información genérica` | `INFO_GENERICA` | El botón toma la forma del tipo de información. | - -# Troubleshooting - -**Estoy en la versión de Android de la aplicación (1.0.1 o 1.0.0) No puedo acceder a mis partes o incluso a la configuración de la aplicación.** - -Recibió una ventana emergente que le advirtió que le preocupa la configuración de accesibilidad, por lo que solo tiene que ir a la configuración de accesibilidad de su dispositivo móvil y desmarcar las aplicaciones con esta opción. (Pronto se traerá una solución en la aplicación) - -**Tengo un mensaje en una de las líneas de mis módulos que me dice que -falta un tipo genérico !** - -Al leer este mensaje, le indica qué tipo genérico falta para crear una plantilla compatible. Solo aplícalo.Consulte el [doc capítulo Tipo genérico](https://www.jeedom.com/doc/documentation/plugins/mobile/es_ES/mobile#_configuration_des_plugins_et_commandes_que_reçoit_l_app). - -**Tengo un problema con uno de los complementos llamado totalmente integrado (clima, -termostato, alarma, cámara) !** - -No dude en acceder a su módulo y haga clic en Guardar nuevamente, esto volverá a incluir los tipos genéricos asociados con el módulo. +# FAQ -**No se puede poner una información sobre la bienvenida de la aplicación !** +> **Mon mobile ne possède pas d'IQ (identifiant unique)** +> Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier. Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application. Une alerte vous indiquera que la récupération de l'IQ est en cours. -Esto es normal, estará disponible en la versión 1.1. +> **Tengo problemas con las notificaciones** +> Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application. -**Tengo la aplicación que ocupa mucha memoria en mi -Teléfono !** +> **Tengo problemas para mostrar mi vista web** +> Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur **ACCUEIL**. -Hubo un error en las versiones 1.0.0 y 1.0.1 en la parte de la cámara. El problema no volverá a suceder con 1.0.2, para eliminar el caché sin sobrevalorar la aplicación, simplemente vaya a la configuración de su aplicación móvil y haga clic en "eliminar el caché". +> **** +> : . : ". . . . -**Me preocupa la primera sincronización en la aplicación o sql en el complemento móvil !** -Tienes que poner tipos genéricos y autorizar el complemento para enviar genéricos ver el documento un poco más alto. diff --git a/docs/fr_FR/changelog.md b/docs/fr_FR/changelog.md index db1c4f82..f16f9a7a 100755 --- a/docs/fr_FR/changelog.md +++ b/docs/fr_FR/changelog.md @@ -4,18 +4,83 @@ > > Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte -# 05/04/2023 -Compatible uniquement avec la 4.4 du core ou supérieur. +# 17/05/2026 + +- Réintégration de l'Application V1 (cohabitation V1/V2) +- Exclusion du répertoire "data" des sauvegardes + +### Notifications + +- Nouvel onglet de visualisation des notifications sur la page d'un équipement mobile. + + +### Géofencing + +- Correction : un même événement ENTER/EXIT n'est plus traité plusieurs fois en cas d'envoi dupliqué par l'app +- Correction : les événements géofence trop anciens (> 30 min) sont ignorés pour éviter de déclencher des scénarios hors contexte + + +# 11/05/2026 + + ### Géofencing + - Correction : un même événement ENTER/EXIT n'est plus traité plusieurs fois en cas d'envoi dupliqué par + l'app + - Correction : les événements géofence trop anciens (> 30 min) sont ignorés pour éviter de déclencher des + scénarios hors contexte + +# 08/07/2025 + +- Mise à jour de la doc sur droits utilisateurs partagés + +# 18/06/2025 + +- Ajout alerte si api mobile désactivée ou IP blanche + +# 25/04/2025 + +- Ajout pour Max 8 Icones sur le menuCustom + +# 24/04/2025 + +- Ajout Commande Notifications Silencieuses pour Builds : IOS 491 et Android 875 + +# 11/04/2025 + +- Ajout paramètre Envoi NFC Direct au plugin après lecture + +# 20/08/2024 + +- Déplacement des infos notifications dans l'onglet "Mobile" + +# 04/08/2024 + +- Prise en compte rétention des notifications pour suppression des images + + +# 22/07/2024 + +- Prise en compte rétention des notifications +- Target Sdk 34 pour Android + +# 28/05/2024 + +- Modification Géolocalisation pour prochaine version App +- Stockage Notifications dans le plugin +- Nouvelles Api pour l'application + +# 05/04/2024 + +- Compatible uniquement avec la 4.4 du Core ou supérieur. # 15/12/2023 -- Attention : Refactorisation importante du code : le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré. +- Attention : Refactorisation importante du code : le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré. - Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout # 22/10/2023 -- Fix mise à jour geolocalisation de l'app v2 +- Fix mise à jour géolocalisation de l'app v2 # 12/10/2023 @@ -24,7 +89,7 @@ Compatible uniquement avec la 4.4 du core ou supérieur. # 09/06/2023 - Fix Notifications -- Ajout Affichage Equipements par Tableau +- Ajout Affichage Équipements par Tableau # 19/05/2023 @@ -42,11 +107,11 @@ Compatible uniquement avec la 4.4 du core ou supérieur. - FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE - Nouvelle Interface Future AppV2 - Modale Custom Menu Future AppV2 -- Modale QrCode Future AppV2 +- Modale QR Code Future AppV2 # 13/12/2021 -- Mode offline pour le QrCode (creation du QrCode sans internet.). +- Mode offline pour le QR Code (création du QR Code sans internet). - Compatibilité 4.2 Jeedom Core # 11/10/2021 @@ -62,16 +127,16 @@ Compatible uniquement avec la 4.4 du core ou supérieur. - Nouveau moteur de Notification pour Android. - Ajout des images (Cameras, Rapports etc...) pour Android. - Prise en charge de la version 1.4.1 de l'app Android. -- Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1 +- Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1 # 17/02/2021 - Ajout de l'id de groupe pour les notifications Android. -- Icones présentes pour les pièces dans la presentation. +- Icones présentes pour les pièces dans la présentation. # 15/04/2020 -- Ajouts des Commandes de chaques mobile. +- Ajouts des Commandes de chaque mobile. # 31/03/2020 @@ -79,12 +144,12 @@ Compatible uniquement avec la 4.4 du core ou supérieur. # 19/02/2020 --fix http.error ligne 39 si téléphone non authentifié a la premiere connexion. +- Fix http.error ligne 39 si téléphone non authentifier à la première connexion. # v1.3.0 - Notification ASK - Historique des notifications - Slider avec pourcentage -- grosse modification de la synchronisation -- suppression du push to refresh +- Modification de la synchronisation +- Suppression du push to refresh diff --git a/docs/fr_FR/index.md b/docs/fr_FR/index.md index 3bfb5b0a..1bd5ac5d 100755 --- a/docs/fr_FR/index.md +++ b/docs/fr_FR/index.md @@ -1,326 +1,103 @@ # Plugin Mobile -Plugin permettant d’utiliser l’application Mobile Jeedom. +Le plugin Mobile permet d’utiliser l’application Mobile Jeedom. -L’application mobile Jeedom nécessite l’installation de ce plugin afin que la box puisse dialoguer avec l’application Mobile. +Pour que l’application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d’installer ce plugin. -# Configuration du plugin Mobile pour Application V2 +# Configuration du plugin Mobile pour l'application V2 -Après installation du plugin, il vous suffit de l’activer : +Après avoir installé le plugin, activez-le simplement : -![mobile1](./images/mobile1.png) + -# Premiere connexion à l'application V2 +# Première connexion à l'application V2 -Pour connecter votre téléphone : il y a 2 méthodes possible; -sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box. +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. -![v2ConnectMarket](./images/v2firstConnect.jpeg) + -> **IMPORTANT** -> -> Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4.0 minimum +> **IMPORTANT** +> Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4.0 ou supérieure. -#### **CONNEXION VIA LE COMPTE MARKET** : +### **Connexion via le compte Market** -![v2ConnectMarket](./images/v2connectMarket.PNG) + -Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe. +Saisissez simplement votre identifiant et mot de passe Market pour vous connecter. -#### **CONNEXION VIA BOX ID** : +### **Connexion via l'ID de la Box** -![v22methods](./images/v22methods.PNG) + -Plusieurs choix sur cet écran : +Sur cet écran, plusieurs options s'offrent à vous : -- Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION +- Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton **CONNEXION**. +- Cliquez sur **QR Code** : un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter. -- Vous cliquez sur QR Code : un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin. + -![v2ModalQrApp](./images/v2QRCodeConnect.PNG) +> **Onglet QR Code du plugin Mobile** +> -> Onglet Qr Code du plugin Mobile +Une fois cette étape terminée, vous êtes enregistré dans l'application. Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu. -> > ![v2ModalPlugin](./images/v2ModalQrCode.png) +Dans le menu, un onglet **Boxs** regroupe toutes les Box associées à votre compte Market. -Une fois cette premiere étape passée, vous êtes enregistré dans l'application: si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu .... + -Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market + -![v2MenuBoxs](./images/v2MenuBoxs.PNG) +Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder. +La Box validée apparaîtra en haut de la liste. Vous pouvez répéter cette opération pour plusieurs Box. -![v2floutedBoxs](./images/v2floutedBoxs.png) +En cliquant sur le bouton **+** en bas à droite, vous accédez à différentes options : -Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box. +- Ajouter une Box via un QR Code (depuis le plugin Mobile), +- Ajouter une Box manuellement, +- Détecter les Box Atlas et Luna sur le réseau Wi-Fi, +- Synchroniser les informations de votre compte Market. -La box passera en haut de la liste, ayant validée son authentification. -Vous pouvez faire ainsi pour plusieurs boxs. + -Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options; +Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme "actuelle". -- QrCode pour ajouter une box à la liste via le plugin Mobile, -- Manuel pour ajouter manuellement une box -- Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau) -- Synchronisation Market pour actualiser les informations du compte Market configuré + -![v2greenBtnAdd](./images/v2greenBtnAdd.PNG) +# Fonctionnement de la géolocalisation -Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle' +Ajoutez une zone de géolocalisation en cliquant sur l'icône **+**. -![v2ActualBoxFlouted](./images/v2ActualBoxFlouted.jpeg) + -# Fonctionnement de la Géolocalisation +Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone. Le curseur se positionnera automatiquement sur l'adresse. Vous pouvez ensuite nommer et sauvegarder la zone. -Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone + +Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone. -![v2AddZone](./images/v2AddZone.jpeg) +Vous pouvez également ajuster le rayon de la zone pour élargir la détection. -Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée. -Nous pouvons ensuite ajouter un nom et sauvegarder la zone. + -Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile. +Pour supprimer une zone, cliquez sur **Éditer**, puis sur l'icône Corbeille. Cela supprimera la zone de l'application ainsi que la commande associée sur la Box. -Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone. +# Paramètres de l'application -![v2ModifyBigRadius](./images/v2ModifyBigRadius.jpeg) +Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur). Par défaut, elles sont réglées sur 5 secondes. -# FAQ - -> **J'ai des soucis avec les notifications** -> -> Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta. - -> **J'ai des soucis d'affichage de ma webview** -> -> Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL. - -# Configuration du plugin Mobile V1 - -Après installation du plugin, il vous suffit de l’activer : - -![mobile1](../images/mobile1.png) - -**Configuration** - -Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom. - -Pour Ajouter un téléphone : **Plugins** → **Communication** → **App -Mobile** → **Ajouter** - -![mobile2](../images/mobile2.png) - -Voici les paramètres à renseigner : - -- **Nom de l’équipement mobile** : Nom du téléphone -- **Activer** : Activation de l’accès pour ce mobile -- **Type de Mobile** : Sélection de l’OS du téléphone (iOS, Android) -- **Utilisateur** : Utilisateur associé à cet accès - -> **Tip** -> -> Le choix de l’utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits. - -![mobile3](../images/mobile3.png) - -Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l’application de se configurer toute seule. - -# Configuration des plugins et commandes que reçoit l’app - -Après l’initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces. - -![mobile10](../images/mobile10.png) - -En cliquant sur un plugin, vous pouvez l’autoriser ou non à dialoguer avec l’application mobile, et configurer chacun des types génériques associés à ses commandes. - -![mobile11](../images/mobile11.png) - -En cliquant sur une pièce, vous pouvez l’autoriser ou non à être présente dans l’application mobile, et configurer chacun des types génériques associés à ses commandes. - -![mobile12](../images/mobile12.png) - -# Configuration de l’application Mobile - -Vous trouverez les applications sur les stores mobiles : - -**Android Google Play** - -![Google Play FR](../images/Google_Play_FR.png) - -**Apple App Store** - -![App Store FR](../images/App_Store_FR.png) - -## Premier lancement de l’app - -Au 1er lancement de l’application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci. - -Après avoir téléchargé et installé votre application mobile Jeedom, lancez l’application sur votre smartphone. - -Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre. Certaines étapes ont étés faites précédemment. - -Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode. Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l’équipement smartphone créé précédemment. Dans ce cas, l’application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement. Lorsqu’il sera connecté chez vous en Wifi, l’application utilisera automatiquement l’adresse Jeedom ethernet interne à votre réseau. Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l’utilisez). Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom. Cette option est réservée à un public averti. - -L’application va se synchroniser et vous arrivez sur sa page d’accueil (précédée par un mini guide de présentation). - -L’application mobile Jeedom est maintenant prête à fonctionner. - -## Les Favoris - -Sur l’application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios). - -Voici donc la marche à suivre pour en créer : - -Cliquez sur un des + sur l’écran d’accueil de l’application : - -![mobile dashboard 1](../images/mobile_dashboard_1.PNG) - -Vous arriverez sur la page de sélection du type de raccourci : - -![mobile dashboard 2](../images/mobile_dashboard_2.PNG) - -Par exemple, nous allons prendre Action, il nous propose donc des Pièces/Objets : - -![mobile dashboard 3](../images/mobile_dashboard_3.PNG) - -Il vous suffit alors de sélectionner l’action que vous souhaitez en raccourci : - -![mobile dashboard 4](../images/mobile_dashboard_4.PNG) + -Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées) : - -![mobile dashboard 5](../images/mobile_dashboard_5.PNG) - -Ainsi que les deux textes associés : - -![mobile dashboard 6](../images/mobile_dashboard_6.PNG) -![mobile dashboard 7](../images/mobile_dashboard_7.PNG) - -Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1.1 il est prévu que les commandes On/Off apparaissent sur la même touche). - -![mobile dashboard 8](../images/mobile_dashboard_8.PNG) - -# Comment bien configurer ses types génériques - -## Les Génériques Types dans le plugin Mobile - -Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas) : - -![generic type in plugin](../images/generic_type_in_plugin.jpg) - -## Tableaux des templates de l’application - -### Les Lumières - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![LIGHT](../images/LIGHT_1.jpg) | `Lumière Bouton On`
`Lumière Bouton Off` | `LIGHT_ON`
`LIGHT_OFF` | présence de deux boutons "ON" et "Off" pas de retour d'état. | -| ![LIGHT](../images/LIGHT_2.jpg) | `Lumière Bouton On`
`Lumière Bouton Off`
`Lumière Etat` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off | -| ![LIGHT](../images/LIGHT_2.jpg) | `Lumière Bouton Toggle`
`Lumière Etat` | `LIGHT_TOGGLE`
`LIGHT_STATE` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off | -| ![LIGHT](../images/LIGHT_3.jpg) | `Lumière Bouton On`
`Lumière Bouton Off`
`Lumière Etat`
`Lumière Slider` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité | -| ![LIGHT](../images/LIGHT_4.jpg) | `Lumière Bouton On`
`Lumière Bouton Off`
`Lumière Etat`
`Lumière Slider`
`Lumière Couleur (info)`
`Lumière Couleur (action)`
`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue) | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER`
`LIGHT_COLOR`
`LIGHT_SET_COLOR`
`LIGHT_MODE` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité. Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode | - -### Les Prises - -| Image | type générique | Partie Dev plugin | Description | -| :-------------------------------: | :--------------------------------------------------------------------------- | :------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------: | -| ![ENERGY](../images/ENERGY_1.jpg) | `Prise Bouton On`
`Prise Bouton Off` | `ENERGY_ON`
`ENERGY_OFF` | présence de deux boutons "ON" et "Off" pas de retour d'état. | -| ![ENERGY](../images/ENERGY_2.jpg) | `Prise Bouton On`
`Prise Bouton Off`
`Prise Etat` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off | -| ![ENERGY](../images/ENERGY_3.jpg) | `Prise Bouton On`
`Prise Bouton Off`
`Prise Etat`
`Prise Slider` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE`
`ENERGY_SLIDER` | Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité | - -### Les Volets - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------: | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------: | -| ![FLAP](../images/FLAP_1.jpg)   | `Volet Bouton Monter`
`Volet Bouton Descendre`
`Volet Bouton Stop`
`Volet Etat`(optionnel) | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`(optionnel) | Présence de trois boutons "Monter", "Descendre", "Stop", retour d'état optionnel. | -| ![FLAP](../images/FLAP_2.jpg)   | `Volet Bouton Monter`
`Volet Bouton Descendre`
`Volet Bouton Stop`
`Volet Etat`
`Volet Bouton Slider` | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`
`FLAP_SLIDER` | Présence d'un slider, avec un bouton Monter/Descendre en Toggle (avec icône d'état) | - -### Inondation - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------: | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------: | -| ![FLOOD](../images/FLOOD.jpg)   | `Innondation`
`Température`(optionnel)
`Humidité`(optionnel)
`Sabotage`(optionnel) | `FLOOD`
`TEMPERATURE`(optionnel)
`HUMIDITY`(optionnel)
`HUMIDITY`(optionnel) | Permet d'avoir son capteur d'inondation complet sur une seule ligne. | - -### Serrure - -| Image | type générique | Partie Dev plugin | Description | -| :---------------------------: | :--------------------------------------------------------------------- | :-------------------------------------------- | :---------------------------------------------------------------------------: | -| ![LOCK](../images/LOCK.jpg)   | `Serrure Etat`
`Serrure Bouton Ouvrir`
`Serrure Bouton Fermer` | `LOCK_STATE`
`LOCK_OPEN`
`LOCK_CLOSE` | Retour d'état présent, le bouton de gauche permet de switcher entre on et off | - -### Sirène - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------: | :----------------------------------------------------------- | :------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SIREN](../images/SIREN.jpg)   | `Sirène Etat`
`Sirène Bouton On`
`Sirène Bouton Off` | `SIREN_STATE`
`SIREN_ON`
`SIREN_OFF` | Retour d'état présent, le bouton de gauche permet de switcher entre on et off | - -### Fumée - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------: | :----------------------------------- | :----------------------------------- | :--------------------------------------------------------------: | -| ![SMOKE](../images/SMOKE.jpg)   | `Fumée`
`Température`(optionnel) | `SMOKE`
`TEMPERATURE`(optionnel) | Permet d'avoir son capteur de fumée complet sur une seule ligne. | - -### Température - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------------------: | :-------------------------------------- | :-------------------------------------- | :---------: | -| ![TEMPERATURE](../images/TEMPERATURE.jpg)   | `Température`
`Humidité`(optionnel) | `TEMPERATURE`
`HUMIDITY`(optionnel) | Voir Image. | - -### Présence - -| Image | type générique | Partie Dev plugin | Description | -| :-----------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------: | -| ![PRESENCE](../images/PRESENCE.jpg)   | `Présence`
`Température`(optionnel)
`Luminosité`(optionnel)
`Humidité`(optionnel)
`UV`(optionnel)
`Sabotage`(optionnel) | `PRESENCE`
`TEMPERATURE`(optionnel)
`BRIGHTNESS`(optionnel)
`HUMIDITY`(optionnel)
`UV`(optionnel)
`SABOTAGE`(optionnel) | Voir image. | - -### Ouvrant - -| Image | type générique | Partie Dev plugin | Description | -| :---------------------------------: | :--------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------------: | -| ![OPENING](../images/OPENING.jpg)   | `Porte / Fenêtre`
`Température`(optionnel) | `OPENING / OPENING_WINDOW`
`TEMPERATURE`(optionnel) | Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte). | - -### Fil pilote - -| Image | type générique | Partie Dev plugin | Description | -| :---------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![HEATING](../images/HEATING.jpg)   | `Chauffage fil pilote Bouton ON`
`Chauffage fil pilote bouton OFF`
`Chauffage fil pilote Etat`
`Chauffage fil pilote bouton`(optionnel) | `HEATING_ON`
`HEATING_OFF`
`HEATING_STATE`
`HEATING_OTHER` | Les boutons ON/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max) | - -## LES JOKERS - -### Générique Action - -| Image | type générique | Partie Dev plugin | Description | -| :-------------------------------: | :--------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![ACTION](../images/ACTION.jpg)   | `Action Générique`           | `GENERIC_ACTION` | Le bouton prend la forme du type de l'action. Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc... | - -### Générique Info - -| Image | type générique | Partie Dev plugin | Description | -| :---------------------------: | :-------------------------------- | :---------------- | :-----------------------------------------: | -| ![INFO](../images/INFO.jpg)   | `Information Générique`           | `GENERIC_INFO` | Le bouton prend la forme du type de l'info. | - -# Troubleshooting - -**Je suis sur Android version de l’app (1.0.1 ou 1.0.0) je n’arrive pas à accéder à mes pièces ni même à la configuration de l’app.** - -Vous avez eu un popup vous avertissant d’un souci sur les paramètres d’accessibilité, il vous suffit donc de vous rendre dans les paramètres d’accessibilité de votre mobile et de décocher les applications utilisant cette option. (Un correctif sera apporté prochainement sur l’app) - -**J’ai un message dans une des lignes de mes modules me disant qu’il -manque un Type Générique !** - -En lisant ce message, il vous dit quel type générique manque pour créer un template compatible. Il suffit juste de l’appliquer.Reportez-vous à la [doc chapitre Type Générique](https://www.jeedom.com/doc/documentation/plugins/mobile/fr_FR/mobile#_configuration_des_plugins_et_commandes_que_reçoit_l_app). - -**J’ai un souci sur un des plugins dit complètement intégré (météo, -thermostat, alarme, caméra) !** - -N’hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module. +# FAQ -**Impossible de mettre une info sur l’accueil de l’app !** +> **Mon mobile ne possède pas d'IQ (identifiant unique)** +> Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier. Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application. Une alerte vous indiquera que la récupération de l'IQ est en cours. -Cela est normal, ça sera disponible sur la version 1.1. +> **J'ai des soucis avec les notifications** +> Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application. -**J’ai l’application qui prend enormement de memoire dans mon -telephone !** +> **J'ai des soucis d'affichage de ma webview** +> Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur **ACCUEIL**. -Il y avait un bug sur les versions 1.0.0 et 1.0.1 sur la partie Camera. Le souci ne ce reproduira plus avec la 1.0.2, pour supprimer le cache sans surprimer l’app, il suffit d’aller dans la configuration de votre App Mobile et de cliquer sur "supprimer le cache". +> **Je souhaite partager mes droits mobile sans communiquer mon compte Market** +> Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application : vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc. Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone : il lui suffit d'aller dans Préférences > Réglages et de cliquer sur "Demander des droits à un autre mobile". Un code à 6 chiffres sera alors généré. Il devra le saisir sur le mobile possédant le compte Market, au même endroit. Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction. L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé -**J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile !** -Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut. diff --git a/docs/i18n/de_DE.json b/docs/i18n/de_DE.json index efe9f2b2..24fa303a 100755 --- a/docs/i18n/de_DE.json +++ b/docs/i18n/de_DE.json @@ -2,17 +2,47 @@ "changelog.md": { "Changelog App Mobile": "Changelog Mobile App", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Zur Erinnerung: Wenn keine Informationen zum Update vorhanden sind, bedeutet dies, dass es sich nur um die Aktualisierung von Dokumentation, Übersetzung oder Text handelt", + "08\/07\/2025": "", + "Mise à jour de la doc sur droits utilisateurs partagés": "", + "18\/06\/2025": "18\/06\/2025", + "Ajout alerte si api mobile désactivée ou IP blanche": "Ajout alerte si api mobile désactivée ou IP blanche", + "25\/04\/2025": "25\/04\/2025", + "Ajout pour Max 8 Icones sur le menuCustom": "Ajout pour Max 8 Icones sur le menuCustom", + "24\/04\/2025": "24\/04\/2025", + "Ajout Commande Notifications Silencieuses pour Builds": "Ajout Commande Notifications Silencieuses pour Builds", + "IOS 491 et Android 875": "IOS 491 et Android 875", + "11\/04\/2025": "11\/04\/2025", + "Ajout paramètre Envoi NFC Direct au plugin après lecture": "Ajout paramètre Envoi NFC Direct au plugin après lecture", + "App V1": "App V1", + "Attention, à partir de cette version, l'appV1 n'est plus prise en charge": "Bitte beachten Sie, dass appV1 ab dieser Version nicht mehr unterstützt wird", + "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification": "Es wird immer möglich sein, auf Ihre Ausrüstung zuzugreifen, um möglicherweise Ihre Geolokalisierungs- und Benachrichtigungsbefehle zu ersetzen", + "Suppression des fichiers concernant l'AppV1": "AppV1-Dateien löschen", + "Nettoyage des infos stockées en BDD (config": "In der Datenbank gespeicherte Reinigungsinformationen (config", + "20\/08\/2024": "20.08.2024", + "Déplacement des infos notifications dans l'onglet \"Mobile": "Benachrichtigungsinformationen auf die Registerkarte „Mobil“ verschieben", + "04\/08\/2024": "08.04.2024", + "Prise en compte rétention des notifications pour suppression des images": "Berücksichtigung der Aufbewahrung von Benachrichtigungen zum Löschen von Bildern", + "22\/07\/2024": "22.07.2024", + "Prise en compte rétention des notifications": "Berücksichtigung der Aufbewahrung von Benachrichtigungen", + "Target Sdk 34 pour Android": "Target Sdk 34 für Android", + "28\/05\/2024": "28.05.2024", + "Modification Géolocalisation pour prochaine version App": "Geolokalisierungsänderung für die nächste App-Version", + "Stockage Notifications dans le plugin": "Speicherbenachrichtigungen im Plugin", + "Nouvelles Api pour l'application": "Neue APIs für die Anwendung", + "05\/04\/2024": "04.05.2024", + "Compatible uniquement avec la 4": "Kompatibel nur mit der 4", + "4 du Core ou supérieur": "4 Kern oder höher", "15\/12\/2023": "15.12.2023", "Refactorisation importante du code": "Erhebliche Code-Umgestaltung", - "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré": "Das zuvor auf der AppV2 gespeicherte benutzerdefinierte Menü kann möglicherweise nicht mehr gespeichert werden", + "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré": "Das zuvor auf der AppV2 gespeicherte benutzerdefinierte Menü kann möglicherweise nicht mehr gespeichert werden", "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout": "Eine Funktion zum Speichern von Menüs im Plugin wird hinzugefügt", "22\/10\/2023": "22.10.2023", - "Fix mise à jour geolocalisation de l'app v2": "Geolokalisierungsaktualisierung der v2-App behoben", + "Fix mise à jour géolocalisation de l'app v2": "Geolokalisierungsaktualisierung der v2-App behoben", "12\/10\/2023": "10.12.2023", "Mise à jour pour prendre en compte la nouvelle Application mobile": "Aktualisiert, um die neue mobile Anwendung zu berücksichtigen", "09\/06\/2023": "09.06.2023", "Fix Notifications": "Benachrichtigungen korrigieren", - "Ajout Affichage Equipements par Tableau": "Hinzufügung einer Geräteanzeige nach Tisch", + "Ajout Affichage Équipements par Tableau": "Hinzufügung einer Geräteanzeige nach Tisch", "19\/05\/2023": "19.05.2023", "PR by PhpVarious": "PR von PHPVarious", "Fix bugs mineurs": "Beheben Sie kleinere Fehler", @@ -24,9 +54,9 @@ "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE": "ZUKÜNFTIGE APPV2 ALPHA INTEGRATION IN MOBILE PLUGIN", "Nouvelle Interface Future AppV2": "Neue Schnittstelle Future AppV2", "Modale Custom Menu Future AppV2": "Modales benutzerdefiniertes Menü Zukünftige AppV2", - "Modale QrCode Future AppV2": "Modale QrCode Future AppV2", + "Modale QR Code Future AppV2": "Modaler QR-Code Future AppV2", "13\/12\/2021": "13.12.2021", - "Mode offline pour le QrCode (creation du QrCode sans internet": "Offline-Modus für QrCode (Erstellung von QrCode ohne Internet", + "Mode offline pour le QR Code (création du QR Code sans internet": "Offline-Modus für den QR-Code (Erstellung des QR-Codes ohne Internet", "Compatibilité 4": "Kompatibilität 4", "2 Jeedom Core": "2 Jeedom-Kern", "11\/10\/2021": "11.10.2021", @@ -38,23 +68,23 @@ "Ajout des images (Cameras, Rapports etc...) pour Android": "Hinzufügen von Bildern (Kameras, Berichte usw.) für Android", "Prise en charge de la version 1.4": "Unterstützung für Version 1.4", "1 de l'app Android": "1 aus der Android App", - "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Unterstützung für Emoticons und Zeilenumbrüche mit der neuen Android 1.4.1-Version", + "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Unterstützung für Emoticons und Zeilenumbrüche mit der neuen Android 1.4.1-Version", "17\/02\/2021": "17.02.2021", "Ajout de l'id de groupe pour les notifications Android": "Gruppen-ID für Android-Benachrichtigungen hinzugefügt", - "Icones présentes pour les pièces dans la presentation": "Symbole für die Teile in der Präsentation", + "Icones présentes pour les pièces dans la présentation": "Symbole für die Teile in der Präsentation", "15\/04\/2020": "15.04.2020", - "Ajouts des Commandes de chaques mobile": "Hinzufügen von Bestellungen für jedes Handy", + "Ajouts des Commandes de chaque mobile": "Befehle für jedes Mobiltelefon hinzugefügt", "31\/03\/2020": "31.03.2020", "Correction d'un bug sur l'envoi de notification sur certain Jeedom": "Korrektur eines Fehlers beim Senden einer Benachrichtigung über bestimmte Jeedom", "19\/02\/2020": "19.02.2020", - "fix http": "http korrigieren", - "error ligne 39 si téléphone non authentifié a la premiere connexion": "Fehlerzeile 39, wenn das Telefon bei der ersten Verbindung nicht authentifiziert wurde", + "Fix http": "Http korrigieren", + "error ligne 39 si téléphone non authentifier à la première connexion": "Fehlerzeile 39, wenn das Telefon bei der ersten Verbindung nicht authentifiziert wurde", "v1.3.0": "v1.3.0", "Notification ASK": "ASK-Benachrichtigung", "Historique des notifications": "Benachrichtigungsverlauf", "Slider avec pourcentage": "Schieberegler mit Prozentsatz", - "grosse modification de la synchronisation": "große Änderung im Timing", - "suppression du push to refresh": "Entfernen von Push zum Aktualisieren", + "Modification de la synchronisation": "Ändern des Timings", + "Suppression du push to refresh": "Entfernen von Push zum Aktualisieren", " IMPORTANT.": " Wichtig.", " IMPORTANT?": " Wichtig?", "IMPORTANT ": "Wichtig ", @@ -62,6 +92,13 @@ "[IMPORTANT]": "[Wichtig]", "*IMPORTANT*": "*Wichtig*", " IMPORTANT*": " Wichtig*", + " xx\/08\/2024.": " xx.08.2024.", + " xx\/08\/2024?": " xx.08.2024?", + "xx\/08\/2024 ": "xx.08.2024 ", + " xx\/08\/2024]": " xx.08.2024]", + "[xx\/08\/2024]": "[xx.08.2024]", + "*xx\/08\/2024*": "*xx.08.2024*", + " xx\/08\/2024*": " xx.08.2024*", " Attention.": " Aufmerksamkeit.", " Attention?": " Aufmerksamkeit?", "Attention ": "Aufmerksamkeit ", @@ -71,275 +108,70 @@ " Attention*": " Aufmerksamkeit*" }, "index.md": { - " ": " ", - "`Information Générique`          ": "„Allgemeine Informationen“", - "`GENERIC_INFO`": "„GENERIC_INFO“", - "Le bouton prend la forme du type de l'info": "Der Button nimmt die Form der Art der Information an", - "type générique": "Typ Gattung", - "Partie Dev plugin": "Dev Plugin Teil", - "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc": "Standardmäßig ist es ein Umschalter. Wenn es sich um eine Nachricht handelt, haben Sie einen Umschlag, bei einem Schieberegler haben Sie einen Schieberegler usw", - "`Action Générique`          ": "„Generische Aktion“", - "`GENERIC_ACTION`": "„GENERIC_ACTION“", - "Le bouton prend la forme du type de l'action": "Die Schaltfläche hat die Form des Aktionstyps", - "`HEATING_OTHER`": "`HEATING_OTHER`", - "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max": "Mit den Schaltflächen EIN \/ AUS und Status können Sie die Schaltfläche ganz links in der Vorlage erstellen, und mit der Taste \"Pilotdrahtheizung\" können Sie Schaltflächen hinzufügen (max. 5)", - "`Chauffage fil pilote bouton`(optionnel": "`Button Pilot Wire Heizung` (optional", - "`HEATING_ON`": "`HEATING_ON`", - "`Chauffage fil pilote Bouton ON`": "„Einschalttaste für Pilotdrahtheizung“", - "`TEMPERATURE`(optionnel": "`TEMPERATUR` (optional", - "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte": "Siehe Bild (d. H. Sie können zwischen Fenster und Tür wählen", - "`Température`(optionnel": "`TEMPERATUR` (optional", - "`OPENING \/ OPENING_WINDOW`": "`OPENING \/ OPENING_WINDOW`", - "`Porte \/ Fenêtre`": "„Tür\/Fenster“", - "`SABOTAGE`(optionnel": "`SABOTAGE` (optional", - "Voir image": "Siehe Bild", - "`Sabotage`(optionnel": "`SABOTAGE` (optional", - "`Présence`": "\"PRÄSENZ\"", - "`HUMIDITY`(optionnel": "`FEUCHTIGKEIT` (optional", - "Voir Image": "Siehe Bild", - "`Humidité`(optionnel": "`Luftfeuchtigkeit` (optional", - "`Température`": "`TEMPERATUR`", - "Permet d'avoir son capteur de fumée complet sur une seule ligne": "Ermöglicht es Ihnen, Ihren kompletten Rauchsensor in einer einzigen Leitung zu haben", - "`Fumée`": "„Rauch“", - "`SIREN_OFF`": "`SIREN_OFF`", - "Retour d'état présent, le bouton de gauche permet de switcher entre on et off": "Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus", - "`Sirène Bouton Off`": "`Siren Button Off`", - "`SIREN_STATE`": "`SIREN_STATE`", - "`Sirène Etat`": "„Sirenenstaat“", - "`LOCK_CLOSE`": "`LOCK_CLOSE`", - "`Serrure Bouton Fermer`": "`Lock Button Close`", - "`LOCK_STATE`": "`LOCK_STATE`", - "`Serrure Etat`": "„Staatssperre“", - "Permet d'avoir son capteur d'inondation complet sur une seule ligne": "Ermöglicht es Ihnen, Ihren gesamten Hochwassersensor in einer einzigen Leitung zu haben", - "`FLAP_SLIDER`": "`FLAP_SLIDER`", - "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état": "Vorhandensein eines Schiebereglers mit einer Auf \/ Ab-Taste in Umschalten (mit Statussymbol", - "`Volet Bouton Slider`": "`Slider Button Pane`", - "`FLAP_UP`": "`FLAP_UP`", - "`Volet Bouton Monter`": "„Mount-Button-Bereich“", - "`FLAP_STATE`(optionnel": "`FLAP_STATE` (optional", - "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel": "Vorhandensein von drei Tasten \"Auf\", \"Ab\", \"Stopp\", optionale Statusrückmeldung", - "`Volet Etat`(optionnel": "`State pane` (optional)", - "`ENERGY_SLIDER`": "`ENERGY_SLIDER`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité": "Bei vorhandener Statusrückmeldung können Sie mit der linken Taste zwischen Ein und Aus wechseln und mit dem Schieberegler die Intensität steuern", - "`Prise Slider`": "`Slider Socket`", - "`ENERGY_ON`": "`ENERGY_ON`", - "`Prise Bouton On`": "„Steckdosenknopf ein“", - "`ENERGY_STATE`": "`ENERGY_STATE`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off": "Bei vorhandener Statusrückmeldung wechselt die linke Taste zwischen Ein und Aus", - "`Prise Etat`": "`State Taking`", - "`ENERGY_OFF`": "`ENERGY_OFF`", - "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état": "Vorhandensein von zwei Tasten \"EIN\" und \"Aus\" keine Statusrückmeldung", - "`Prise Bouton Off`": "`Button Off Socket`", - "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode": "Im Kreis ist die Farbe der Lampe vorhanden. Wenn Sie darauf klicken, können Sie die Farbe ändern und einen Modus aktivieren", - "`LIGHT_MODE`": "`LIGHT_MODE`", - "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue": "`Lichtmodus` (optional, wird verwendet, um Lichtmodi zu haben, zum Beispiel Regenbogen auf Hue philips", - "`LIGHT_ON`": "`LIGHT_ON`", - "`Lumière Bouton On`": "„Lichttaste ein“", - "`LIGHT_SLIDER`": "`LIGHT_SLIDER`", - "`Lumière Slider`": "`Light Slider`", - "`LIGHT_STATE`": "`LIGHT_STATE`", - "`Lumière Etat`": "`State Light`", - "`LIGHT_TOGGLE`": "`LIGHT_TOGGLE`", - "`Lumière Bouton Toggle`": "„Licht-Umschalttaste“", - "`LIGHT_OFF`": "`LIGHT_OFF`", - "`Lumière Bouton Off`": "`Button Off Light`", "Plugin Mobile": "Mobiles Plugin", - "Plugin permettant d'utiliser l'application Mobile Jeedom": "Plugin zur Verwendung der Jeedom Mobile-Anwendung", - "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile": "Die mobile Jeedom-Anwendung erfordert die Installation dieses Plugins, damit die Box mit der mobilen Anwendung kommunizieren kann", - "Configuration du plugin Mobile pour Application V2": "Konfiguration des Mobile-Plugins für Application V2", - "Après installation du plugin, il vous suffit de l'activer": "Nach der Installation des Plugins müssen Sie es nur noch aktivieren", - "Premiere connexion à l'application V2": "Erste Verbindung mit der V2-Anwendung", - "Pour connecter votre téléphone": "Um Ihr Telefon zu verbinden", - "il y a 2 méthodes possible;": "es gibt 2 mögliche Methoden;", - "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box": "Auf dem ersten Bildschirm der Anwendung wird Ihnen angeboten, Ihr Marktkonto zu verbinden und so alle mit diesem Konto verknüpften Boxen zu finden oder einfach eine Box hinzuzufügen", - "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4": "Um von den Funktionalitäten der Anwendung profitieren zu können, muss sich der Kern Ihres Jeedom in 4.4 befinden", - "0 minimum": "Mindestens 0", - "CONNEXION VIA LE COMPTE MARKET": "LOGIN ÜBER MARKET-KONTO", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe": "Sie müssen lediglich Ihre Markt-ID und Ihr Passwort eingeben", - "CONNEXION VIA BOX ID": "VERBINDUNG ÜBER BOX-ID", - "Plusieurs choix sur cet écran": "Mehrere Auswahlmöglichkeiten auf diesem Bildschirm", - "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "Sie geben die URL Ihres Jeedoms (intern oder extern) sowie die Zugangskennungen dazu ein und bestätigen mit dem LOGIN-Button", - "Vous cliquez sur QR Code": "Sie klicken auf QR-Code", - "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin": "ein neuer Bildschirm erscheint; Sie können einen QRCode aus dem Mobile-Plugin der Box, die Sie hinzufügen möchten, über die Registerkarte QRCODE des Plugins scannen", - "Onglet Qr Code du plugin Mobile": "Registerkarte „Qr-Code“ des Mobile-Plugins", - "v2ModalPlugin": "v2ModalPlugin", - "Une fois cette premiere étape passée, vous êtes enregistré dans l'application": "Nach diesem ersten Schritt sind Sie in der Anwendung registriert", - "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu": "Wenn Sie das Mobile-Plugin haben, haben Sie über das Menü Zugriff auf Benachrichtigungen, QrCodes, Menüanpassung", - "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market": "Im Menü haben Sie eine Registerkarte Boxen, die alle auf diesem Marktkonto vorhandenen Boxen zusammenfasst", - "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box": "Klicken Sie einfach auf das Kästchen, in dem das Mobile-Plugin installiert ist, und identifizieren Sie sich dann, um auf das Kästchen zuzugreifen", - "La box passera en haut de la liste, ayant validée son authentification": "Das Feld wird an den Anfang der Liste gestellt, nachdem es seine Authentifizierung validiert hat", - "Vous pouvez faire ainsi pour plusieurs boxs": "Sie können dies für mehrere Boxen tun", - "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;": "Sie können auch unten rechts auf die Schaltfläche + klicken, um auf verschiedene Optionen zuzugreifen", - "QrCode pour ajouter une box à la liste via le plugin Mobile": "QRCode zum Hinzufügen einer Box zur Liste über das Mobile-Plugin", - "Manuel pour ajouter manuellement une box": "Manuell, um eine Box manuell hinzuzufügen", - "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau": "Erkennung Atlas und Luna (wenn Sie mit WLAN verbunden sind, erkennen die Boxen im Netzwerk", - "Synchronisation Market pour actualiser les informations du compte Market configuré": "Market-Synchronisierung, um konfigurierte Market-Kontoinformationen zu aktualisieren", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Um auf Funktionen wie Benachrichtigungen, Menüpersonalisierung oder Geolokalisierung zugreifen zu können, müssen Sie zunächst mindestens ein aktuelles Feld ausgewählt haben", - "Fonctionnement de la Géolocalisation": "So funktioniert Geolokalisierung", - "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +": "Wir fügen eine Geolocation-Zone hinzu, indem wir auf das +-Symbol klicken", - "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée": "Wir geben die gesuchte Adresse ein und bestätigen mit der Eingabetaste auf seinem Telefon. Der Cursor positioniert sich dann auf der gewünschten Adresse", - "Nous pouvons ensuite ajouter un nom et sauvegarder la zone": "Anschließend können wir einen Namen hinzufügen und die Zone speichern", - "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile": "Dadurch wird auf Ihrem mobilen Gerät ein neuer Befehl vom Binärtyp erstellt, der den Ein- und Ausgängen der Zone entspricht, wenn die Geolokalisierung auf Ihrem Mobiltelefon aktiviert ist", - "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone": "Wir können auch den Radius der Zone ändern, um die Erkennung der Zone zu erweitern", + "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom": "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom", + "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin": "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin", + "Configuration du plugin Mobile pour l'application V2": "Configuration du plugin Mobile pour l'application V2", + "Après avoir installé le plugin, activez-le simplement": "Après avoir installé le plugin, activez-le simplement", + "Première connexion à l'application V2": "Erste Verbindung mit der V2-Anwendung", + "Pour connecter votre téléphone, deux méthodes sont disponibles": "Pour connecter votre téléphone, deux méthodes sont disponibles", + "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement": "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement", + "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4": "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4", + "0 ou supérieure": "0 ou supérieure", + "Connexion via le compte Market": "LOGIN ÜBER MARKET-KONTO", + "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter": "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter", + "Connexion via l'ID de la Box": "Connexion via l'ID de la Box", + "Sur cet écran, plusieurs options s'offrent à vous": "Sur cet écran, plusieurs options s'offrent à vous", + "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton": "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton", + "QR Code": "QR Code", + "Cliquez sur": "Cliquez sur", + "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter": "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter", + "Onglet QR Code du plugin Mobile": "Registerkarte „Qr-Code“ des Mobile-Plugins", + "Une fois cette étape terminée, vous êtes enregistré dans l'application": "Une fois cette étape terminée, vous êtes enregistré dans l'application", + "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu": "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu", + "Dans le menu, un onglet": "Dans le menu, un onglet", + "regroupe toutes les Box associées à votre compte Market": "regroupe toutes les Box associées à votre compte Market", + "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder": "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder", + "La Box validée apparaîtra en haut de la liste": "La Box validée apparaîtra en haut de la liste", + "Vous pouvez répéter cette opération pour plusieurs Box": "Vous pouvez répéter cette opération pour plusieurs Box", + "+": "+", + "En cliquant sur le bouton": "En cliquant sur le bouton", + "en bas à droite, vous accédez à différentes options": "en bas à droite, vous accédez à différentes options", + "Ajouter une Box via un QR Code (depuis le plugin Mobile": "Ajouter une Box via un QR Code (depuis le plugin Mobile", + "Ajouter une Box manuellement": "Ajouter une Box manuellement", + "Détecter les Box Atlas et Luna sur le réseau Wi-Fi": "Détecter les Box Atlas et Luna sur le réseau Wi-Fi", + "Synchroniser les informations de votre compte Market": "Synchroniser les informations de votre compte Market", + "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle": "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle", + "Fonctionnement de la géolocalisation": "So funktioniert Geolokalisierung", + "Ajoutez une zone de géolocalisation en cliquant sur l'icône": "Ajoutez une zone de géolocalisation en cliquant sur l'icône", + "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone": "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone", + "Le curseur se positionnera automatiquement sur l'adresse": "Le curseur se positionnera automatiquement sur l'adresse", + "Vous pouvez ensuite nommer et sauvegarder la zone": "Vous pouvez ensuite nommer et sauvegarder la zone", + "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone": "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone", + "Vous pouvez également ajuster le rayon de la zone pour élargir la détection": "Vous pouvez également ajuster le rayon de la zone pour élargir la détection", + "Pour supprimer une zone, cliquez sur": "Pour supprimer une zone, cliquez sur", + "puis sur l'icône Corbeille": "puis sur l'icône Corbeille", + "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box": "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box", + "Paramètres de l'application": "Paramètres de l'application", + "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur": "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur", + "Par défaut, elles sont réglées sur 5 secondes": "Par défaut, elles sont reglées sur 5 secondes", + "Mon mobile ne possède pas d'IQ (identifiant unique": "Mon mobile ne possède pas d'IQ (identifiant unique", + "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier": "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier", + "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application": "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application", + "Une alerte vous indiquera que la récupération de l'IQ est en cours": "Une alerte vous indiquera que la récupération de l'IQ est en cours", "J'ai des soucis avec les notifications": "Ich habe Probleme mit Benachrichtigungen", - "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta": "Dieser Teil wird derzeit in der Beta-Anwendung verbessert und optimiert", + "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application": "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application", "J'ai des soucis d'affichage de ma webview": "Ich habe Probleme bei der Anzeige meiner Webansicht", - "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL": "Überprüfen Sie auf Ihrem Jeedom in den Einstellungen, ob die mobile Startseite HOME ist", - "Configuration du plugin Mobile V1": "Einrichten des Mobile V1-Plugins", - "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom": "Um das Plugin zu konfigurieren, müssen Sie die Telefone hinzufügen, die auf Jeedom zugreifen können", - "Pour Ajouter un téléphone": "So fügen Sie ein Telefon hinzu", - "→": "→", - "Voici les paramètres à renseigner": "Hier sind die einzugebenden Parameter", - "Nom de l'équipement mobile": "Name der mobilen Ausrüstung", - "Nom du téléphone": "Telefonname", - "Activation de l'accès pour ce mobile": "Aktivieren des Zugriffs für dieses Mobiltelefon", - "Type de Mobile": "Mobiler Typ", - "Sélection de l'OS du téléphone (iOS, Android": "Auswahl des Telefonbetriebssystems (iOS, Android", - "Utilisateur associé à cet accès": "Benutzer, der diesem Zugriff zugeordnet ist", - "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits": "Die Wahl des Benutzers ist wichtig, da sie die Ausrüstung bestimmt, auf die er gemäß seinen Rechten zugreifen kann", - "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule": "Nach dem Speichern erhalten Sie einen QRCode, mit dem sich die Anwendung selbst konfigurieren kann", - "Configuration des plugins et commandes que reçoit l'app": "Konfiguration der von der App empfangenen Plugins und Befehle", - "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces": "Nach der Initialisierung des Mobile Plugins haben Sie die Möglichkeit, die generischen Arten von Bestellungen, Plugins und Teilen zu ändern", - "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Durch Klicken auf ein Plugin können Sie es autorisieren oder nicht, mit der mobilen Anwendung zu chatten, und jeden der generischen Typen konfigurieren, die seinen Befehlen zugeordnet sind", - "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Durch Klicken auf ein Teil können Sie es autorisieren oder nicht, in der mobilen Anwendung vorhanden zu sein, und jeden der generischen Typen konfigurieren, die seinen Bestellungen zugeordnet sind", - "Configuration de l'application Mobile": "Konfiguration der mobilen App", - "Vous trouverez les applications sur les stores mobiles": "Sie finden die Anwendungen auf den mobilen Jalousien", - "Android Google Play": "Android Google Play", - "Apple App Store": "Apple App Store", - "Premier lancement de l'app": "Erster Start der App", - "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci": "Wenn Sie die Mobile-Anwendung zum ersten Mal starten, wird Ihnen ein Lernprogramm angeboten, das Sie bei der Konfiguration unterstützt", - "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone": "Nachdem Sie Ihre Jeedom-Mobilanwendung heruntergeladen und installiert haben, starten Sie die Anwendung auf Ihrem Smartphone", - "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre": "Sie gelangen dann zu einem Konfigurations-Tutorial, dem Sie folgen sollten", - "Certaines étapes ont étés faites précédemment": "Einige Schritte wurden zuvor ausgeführt", - "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode": "Sie haben dann die Wahl zwischen einer manuellen oder automatischen Konfiguration per QRcode", - "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment": "Wenn Sie sich für die Konfiguration per QR-Code entscheiden, flashen Sie einfach den QR-Code, der im Mobile App-Plugin des zuvor erstellten Smartphone-Geräts vorhanden ist", - "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement": "In diesem Fall stellt die Anwendung automatisch die gesamte Konfiguration Ihres Jeedom wieder her und stellt automatisch eine Verbindung her", - "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau": "Wenn die Verbindung über WLAN mit Ihrem Zuhause verbunden ist, verwendet die Anwendung automatisch die in Ihrem Netzwerk interne Jeedom-Ethernet-Adresse", - "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez": "Wenn Sie mit 4G oder 3G verbunden sind, wird Ihre externe Adresse verwendet, um eine Verbindung zu Ihrem Jeedom herzustellen (z. B. über den Jeedom-DNS-Dienst, wenn Sie diesen verwenden", - "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom": "Wenn Sie sich für eine manuelle Konfiguration entscheiden, müssen Sie in diesem Fall die internen und externen IP-Adressen Ihres Jeedom manuell eingeben", - "Cette option est réservée à un public averti": "Diese Option ist einer informierten Öffentlichkeit vorbehalten", - "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation": "Die Anwendung wird synchronisiert und Sie gelangen auf die Startseite (vorangestellt von einem Mini-Präsentationshandbuch)", - "L'application mobile Jeedom est maintenant prête à fonctionner": "Die mobile Jeedom-App ist jetzt betriebsbereit", - "Les Favoris": "Favoriten", - "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios": "In der Anwendung können Sie Favoriten haben (Verknüpfungen von Befehlen, Plugins, Szenarien", - "Voici donc la marche à suivre pour en créer": "Hier ist das Verfahren zum Erstellen", - "Cliquez sur un des + sur l'écran d'accueil de l'application": "Klicken Sie auf einem der + auf dem Startbildschirm der Anwendung", - "Vous arriverez sur la page de sélection du type de raccourci": "Sie gelangen auf die Auswahlseite für den Verknüpfungstyp", - "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets": "Zum Beispiel werden wir Maßnahmen ergreifen, damit wir Teile \/ Objekte erhalten", - "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci": "Wählen Sie dann einfach die gewünschte Aktion als Verknüpfung aus", - "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées": "Es ist dann möglich, die Farbe dieser zu personalisieren (im Moment werden drei Farben vorgeschlagen", - "Ainsi que les deux textes associés": "Sowie die beiden dazugehörigen Texte", - "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1": "Hier haben Sie jetzt eine Verknüpfung Ihrer Bestellung (in Version 1", - "1 il est prévu que les commandes On\/Off apparaissent sur la même touche": "1 Es wird erwartet, dass Ein \/ Aus-Befehle auf derselben Taste angezeigt werden", - "Comment bien configurer ses types génériques": "So konfigurieren Sie generische Typen richtig", - "Les Génériques Types dans le plugin Mobile": "Generische Typen im Mobile Plugin", - "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas": "Besser als Worte, hier ist ein Beispiel für die generischen Credits für ein Licht mit all seinen Steuerelementen (siehe auch die Lichttabelle unten", - "Tableaux des templates de l'application": "Anwendungsvorlagentabellen", - "Les Lumières": "Die Lichter", - "`Lumière Couleur (info)`": "`Lichtfarbe (info)`", - "`Lumière Couleur (action)`": "`Lichtfarbe (Aktion)`", - "`LIGHT_COLOR`": "`LIGHT_COLOR`", - "`LIGHT_SET_COLOR`": "`LIGHT_SET_COLOR`", - "Les Prises": "Die Steckdosen", - "Les Volets": "Die Fensterläden", - "`Volet Bouton Descendre`": "`Down-Button-Bereich`", - "`Volet Bouton Stop`": "`Stop Button Pane`", - "`FLAP_DOWN`": "`FLAP_DOWN`", - "`FLAP_STOP`": "`FLAP_STOP`", - "`Volet Etat`": "`State pane`", - "`FLAP_STATE`": "`FLAP_STATE`", - "`Serrure Bouton Ouvrir`": "`Open Button Lock`", - "`LOCK_OPEN`": "`LOCK_OPEN`", - "Sirène": "Meerjungfrau", - "`Sirène Bouton On`": "`Siren Button On`", - "`SIREN_ON`": "`SIREN_ON`", - "Fumée": "Rauch", - "Température": "Temperatur", - "Présence": "Präsenz", - "`Luminosité`(optionnel": "`Helligkeit` (optional", - "`UV`(optionnel": "`UV` (optional", - "`BRIGHTNESS`(optionnel": "`BRIGHTNESS` (optional", - "Fil pilote": "Pilotdraht", - "`Chauffage fil pilote bouton OFF`": "`Taste zum Ausheizen des Pilotkabels AUS`", - "`Chauffage fil pilote Etat`": "`Heizungs-Pilotdrahtzustand`", - "`HEATING_OFF`": "`HEATING_OFF`", - "`HEATING_STATE`": "`HEATING_STATE`", - "LES JOKERS": "DIE JOKERS", - "Générique Action": "Allgemeine Aktion", - "Générique Info": "Allgemeine Informationen", - "Je suis sur Android version de l'app (1.0": "Ich bin auf Android-Version der App (1.0", - "1 ou 1.0": "1 oder 1,0", - "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app": "0) Ich kann nicht auf meine Teile oder sogar die Konfiguration der App zugreifen", - "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option": "Sie hatten ein Popup-Fenster, das Sie vor Bedenken hinsichtlich der Eingabehilfeneinstellungen warnte. Sie müssen daher nur zu den Eingabehilfeneinstellungen Ihres Mobiltelefons gehen und die Anwendungen mit dieser Option deaktivieren", - "Un correctif sera apporté prochainement sur l'app": "Ein Fix wird in Kürze in der App veröffentlicht", - "J'ai un message dans une des lignes de mes modules me disant qu'il": "Ich habe eine Nachricht in einer der Zeilen meiner Module, die mir sagt, dass es so ist", - "manque un Type Générique": "Fehlen eines generischen Typs", - "doc chapitre Type Générique": "doc Kapitel Generischer Typ", - "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible": "Wenn Sie diese Nachricht lesen, erfahren Sie, welcher generische Typ fehlt, um eine kompatible Vorlage zu erstellen", - "Il suffit juste de l'appliquer": "Wenden Sie es einfach an", - "Reportez-vous à la": "Siehe die", - "J'ai un souci sur un des plugins dit complètement intégré (météo": "Ich habe ein Problem mit einem der Plugins namens voll integriert (Wetter", - "thermostat, alarme, caméra": "Thermostat, Alarm, Kamera", - "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module": "Zögern Sie nicht, auf Ihr Modul zuzugreifen, und klicken Sie erneut auf Speichern. Dadurch werden die mit dem Modul verknüpften generischen Typen wieder aufgenommen", - "Impossible de mettre une info sur l'accueil de l'app": "Informationen zur Begrüßung der App können nicht angegeben werden", - "Cela est normal, ça sera disponible sur la version 1.1": "Dies ist normal und wird in Version 1.1 verfügbar sein", - "J'ai l'application qui prend enormement de memoire dans mon": "Ich habe die Anwendung, die viel Speicher in meinem beansprucht", - "Il y avait un bug sur les versions 1.0": "In Version 1.0 ist ein Fehler aufgetreten", - "0 et 1.0": "0 und 1,0", - "1 sur la partie Camera": "1 im Kamerateil", - "Le souci ne ce reproduira plus avec la 1.0": "Das Problem wird mit 1.0 nicht wieder auftreten", - "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache": "2 Um den Cache zu löschen, ohne die App zu teuer zu machen, gehen Sie einfach zur Konfiguration Ihrer mobilen App und klicken Sie auf \"Cache löschen\"", - "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile": "Ich habe Bedenken hinsichtlich der ersten Synchronisierung in der App oder von SQL im mobilen Plugin", - "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut": "Sie müssen generische Typen eingeben und das Plugin zum Senden von Generika autorisieren. Sehen Sie sich das Dokument etwas höher an", - " Image.": " Bild.", - " Image?": " Bild?", - "Image ": "Bild ", - " Image]": " Bild]", - "[Image]": "[Bild]", - "*Image*": "*Bild*", - " Image*": " Bild*", - " Description.": " Beschreibung.", - " Description?": " Beschreibung?", - "Description ": "Beschreibung ", - " Description]": " Beschreibung]", - "[Description]": "[Beschreibung]", - "*Description*": "*Beschreibung*", - " Description*": " Beschreibung*", - " `PRESENCE`.": " \"PRÄSENZ\".", - " `PRESENCE`?": " \"PRÄSENZ\"?", - "`PRESENCE` ": "\"PRÄSENZ\" ", - " `PRESENCE`]": " \"PRÄSENZ\"]", - "[`PRESENCE`]": "[\"PRÄSENZ\"]", - "*`PRESENCE`*": "*\"PRÄSENZ\"*", - " `PRESENCE`*": " \"PRÄSENZ\"*", - " `TEMPERATURE`.": " `TEMPERATUR`.", - " `TEMPERATURE`?": " `TEMPERATUR`?", - "`TEMPERATURE` ": "`TEMPERATUR` ", - " `TEMPERATURE`]": " `TEMPERATUR`]", - "[`TEMPERATURE`]": "[`TEMPERATUR`]", - "*`TEMPERATURE`*": "*`TEMPERATUR`*", - " `TEMPERATURE`*": " `TEMPERATUR`*", - " `SMOKE`.": " `SMOKE`.", - " `SMOKE`?": " `SMOKE`?", - "`SMOKE` ": "`SMOKE` ", - " `SMOKE`]": " `SMOKE`]", - "[`SMOKE`]": "[`SMOKE`]", - "*`SMOKE`*": "*`SMOKE`*", - " `SMOKE`*": " `SMOKE`*", - " `FLOOD`.": " `FLOOD`.", - " `FLOOD`?": " `FLOOD`?", - "`FLOOD` ": "`FLOOD` ", - " `FLOOD`]": " `FLOOD`]", - "[`FLOOD`]": "[`FLOOD`]", - "*`FLOOD`*": "*`FLOOD`*", - " `FLOOD`*": " `FLOOD`*", - " `Innondation`.": " „Überschwemmung“..", - " `Innondation`?": " „Überschwemmung“.?", - "`Innondation` ": "„Überschwemmung“. ", - " `Innondation`]": " „Überschwemmung“.]", - "[`Innondation`]": "[„Überschwemmung“.]", - "*`Innondation`*": "*„Überschwemmung“.*", - " `Innondation`*": " „Überschwemmung“.*", + "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur": "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur", + "Je souhaite partager mes droits mobile sans communiquer mon compte Market": "", + "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application": "", + "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc": "", + "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone": "", + "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile": "", + "Un code à 6 chiffres sera alors généré": "", + "Il devra le saisir sur le mobile possédant le compte Market, au même endroit": "", + "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction": "", + "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé": "", " IMPORTANT.": " WICHTIG.", " IMPORTANT?": " WICHTIG?", "IMPORTANT ": "WICHTIG ", @@ -347,6 +179,27 @@ "[IMPORTANT]": "[WICHTIG]", "*IMPORTANT*": "*WICHTIG*", " IMPORTANT*": " WICHTIG*", + " CONNEXION.": " CONNEXION.", + " CONNEXION?": " CONNEXION?", + "CONNEXION ": "CONNEXION ", + " CONNEXION]": " CONNEXION]", + "[CONNEXION]": "[CONNEXION]", + "*CONNEXION*": "*CONNEXION*", + " CONNEXION*": " CONNEXION*", + " Boxs.": " Boxs.", + " Boxs?": " Boxs?", + "Boxs ": "Boxs ", + " Boxs]": " Boxs]", + "[Boxs]": "[Boxs]", + "*Boxs*": "*Boxs*", + " Boxs*": " Boxs*", + " Éditer.": " Éditer.", + " Éditer?": " Éditer?", + "Éditer ": "Éditer ", + " Éditer]": " Éditer]", + "[Éditer]": "[Éditer]", + "*Éditer*": "*Éditer*", + " Éditer*": " Éditer*", " FAQ.": " FAQs.", " FAQ?": " FAQs?", "FAQ ": "FAQs ", @@ -354,194 +207,12 @@ "[FAQ]": "[FAQs]", "*FAQ*": "*FAQs*", " FAQ*": " FAQs*", - " Configuration.": " Konfiguration.", - " Configuration?": " Konfiguration?", - "Configuration ": "Konfiguration ", - " Configuration]": " Konfiguration]", - "[Configuration]": "[Konfiguration]", - "*Configuration*": "*Konfiguration*", - " Configuration*": " Konfiguration*", - " Plugins.": " Plugins.", - " Plugins?": " Plugins?", - "Plugins ": "Plugins ", - " Plugins]": " Plugins]", - "[Plugins]": "[Plugins]", - "*Plugins*": "*Plugins*", - " Plugins*": " Plugins*", - " Communication.": " Kommunikation.", - " Communication?": " Kommunikation?", - "Communication ": "Kommunikation ", - " Communication]": " Kommunikation]", - "[Communication]": "[Kommunikation]", - "*Communication*": "*Kommunikation*", - " Communication*": " Kommunikation*", - " App.": " App.", - " App?": " App?", - "App ": "App ", - " App]": " App]", - "[App]": "[App]", - "*App*": "*App*", - " App*": " App*", - " Mobile.": " Handy.", - " Mobile?": " Handy?", - "Mobile ": "Handy ", - " Mobile]": " Handy]", - "[Mobile]": "[Handy]", - "*Mobile*": "*Handy*", - " Mobile*": " Handy*", - " Ajouter.": " Hinzufügen.", - " Ajouter?": " Hinzufügen?", - "Ajouter ": "Hinzufügen ", - " Ajouter]": " Hinzufügen]", - "[Ajouter]": "[Hinzufügen]", - "*Ajouter*": "*Hinzufügen*", - " Ajouter*": " Hinzufügen*", - " Activer.": " Aktivieren.", - " Activer?": " Aktivieren?", - "Activer ": "Aktivieren ", - " Activer]": " Aktivieren]", - "[Activer]": "[Aktivieren]", - "*Activer*": "*Aktivieren*", - " Activer*": " Aktivieren*", - " Utilisateur.": " Benutzer.", - " Utilisateur?": " Benutzer?", - "Utilisateur ": "Benutzer ", - " Utilisateur]": " Benutzer]", - "[Utilisateur]": "[Benutzer]", - "*Utilisateur*": "*Benutzer*", - " Utilisateur*": " Benutzer*", - " Tip.": " Spitze.", - " Tip?": " Spitze?", - "Tip ": "Spitze ", - " Tip]": " Spitze]", - "[Tip]": "[Spitze]", - "*Tip*": "*Spitze*", - " Tip*": " Spitze*", - " LIGHT.": " LICHT.", - " LIGHT?": " LICHT?", - "LIGHT ": "LICHT ", - " LIGHT]": " LICHT]", - "[LIGHT]": "[LICHT]", - "*LIGHT*": "*LICHT*", - " LIGHT*": " LICHT*", - " ENERGY.": " ENERGIE.", - " ENERGY?": " ENERGIE?", - "ENERGY ": "ENERGIE ", - " ENERGY]": " ENERGIE]", - "[ENERGY]": "[ENERGIE]", - "*ENERGY*": "*ENERGIE*", - " ENERGY*": " ENERGIE*", - " FLAP.": " KLAPPE.", - " FLAP?": " KLAPPE?", - "FLAP ": "KLAPPE ", - " FLAP]": " KLAPPE]", - "[FLAP]": "[KLAPPE]", - "*FLAP*": "*KLAPPE*", - " FLAP*": " KLAPPE*", - " Inondation.": " Hochwasser.", - " Inondation?": " Hochwasser?", - "Inondation ": "Hochwasser ", - " Inondation]": " Hochwasser]", - "[Inondation]": "[Hochwasser]", - "*Inondation*": "*Hochwasser*", - " Inondation*": " Hochwasser*", - " FLOOD.": " FLUT.", - " FLOOD?": " FLUT?", - "FLOOD ": "FLUT ", - " FLOOD]": " FLUT]", - "[FLOOD]": "[FLUT]", - "*FLOOD*": "*FLUT*", - " FLOOD*": " FLUT*", - " Serrure.": " Sperren.", - " Serrure?": " Sperren?", - "Serrure ": "Sperren ", - " Serrure]": " Sperren]", - "[Serrure]": "[Sperren]", - "*Serrure*": "*Sperren*", - " Serrure*": " Sperren*", - " LOCK.": " SPERREN.", - " LOCK?": " SPERREN?", - "LOCK ": "SPERREN ", - " LOCK]": " SPERREN]", - "[LOCK]": "[SPERREN]", - "*LOCK*": "*SPERREN*", - " LOCK*": " SPERREN*", - " SIREN.": " SIRENE.", - " SIREN?": " SIRENE?", - "SIREN ": "SIRENE ", - " SIREN]": " SIRENE]", - "[SIREN]": "[SIRENE]", - "*SIREN*": "*SIRENE*", - " SIREN*": " SIRENE*", - " SMOKE.": " RAUCH.", - " SMOKE?": " RAUCH?", - "SMOKE ": "RAUCH ", - " SMOKE]": " RAUCH]", - "[SMOKE]": "[RAUCH]", - "*SMOKE*": "*RAUCH*", - " SMOKE*": " RAUCH*", - " TEMPERATURE.": " Temperatur.", - " TEMPERATURE?": " Temperatur?", - "TEMPERATURE ": "Temperatur ", - " TEMPERATURE]": " Temperatur]", - "[TEMPERATURE]": "[Temperatur]", - "*TEMPERATURE*": "*Temperatur*", - " TEMPERATURE*": " Temperatur*", - " PRESENCE.": " Präsenz.", - " PRESENCE?": " Präsenz?", - "PRESENCE ": "Präsenz ", - " PRESENCE]": " Präsenz]", - "[PRESENCE]": "[Präsenz]", - "*PRESENCE*": "*Präsenz*", - " PRESENCE*": " Präsenz*", - " Ouvrant.": " Öffnen.", - " Ouvrant?": " Öffnen?", - "Ouvrant ": "Öffnen ", - " Ouvrant]": " Öffnen]", - "[Ouvrant]": "[Öffnen]", - "*Ouvrant*": "*Öffnen*", - " Ouvrant*": " Öffnen*", - " OPENING.": " ÖFFNUNG.", - " OPENING?": " ÖFFNUNG?", - "OPENING ": "ÖFFNUNG ", - " OPENING]": " ÖFFNUNG]", - "[OPENING]": "[ÖFFNUNG]", - "*OPENING*": "*ÖFFNUNG*", - " OPENING*": " ÖFFNUNG*", - " HEATING.": " HEIZUNG.", - " HEATING?": " HEIZUNG?", - "HEATING ": "HEIZUNG ", - " HEATING]": " HEIZUNG]", - "[HEATING]": "[HEIZUNG]", - "*HEATING*": "*HEIZUNG*", - " HEATING*": " HEIZUNG*", - " ACTION.": " AKTION.", - " ACTION?": " AKTION?", - "ACTION ": "AKTION ", - " ACTION]": " AKTION]", - "[ACTION]": "[AKTION]", - "*ACTION*": "*AKTION*", - " ACTION*": " AKTION*", - " INFO.": " DIE INFO.", - " INFO?": " DIE INFO?", - "INFO ": "DIE INFO ", - " INFO]": " DIE INFO]", - "[INFO]": "[DIE INFO]", - "*INFO*": "*DIE INFO*", - " INFO*": " DIE INFO*", - " Troubleshooting.": " Fehlerbehebung.", - " Troubleshooting?": " Fehlerbehebung?", - "Troubleshooting ": "Fehlerbehebung ", - " Troubleshooting]": " Fehlerbehebung]", - "[Troubleshooting]": "[Fehlerbehebung]", - "*Troubleshooting*": "*Fehlerbehebung*", - " Troubleshooting*": " Fehlerbehebung*", - " telephone.": " Telefon.", - " telephone?": " Telefon?", - "telephone ": "Telefon ", - " telephone]": " Telefon]", - "[telephone]": "[Telefon]", - "*telephone*": "*Telefon*", - " telephone*": " Telefon*" + " ACCUEIL.": " ACCUEIL.", + " ACCUEIL?": " ACCUEIL?", + "ACCUEIL ": "ACCUEIL ", + " ACCUEIL]": " ACCUEIL]", + "[ACCUEIL]": "[ACCUEIL]", + "*ACCUEIL*": "*ACCUEIL*", + " ACCUEIL*": " ACCUEIL*" } } \ No newline at end of file diff --git a/docs/i18n/en_US.json b/docs/i18n/en_US.json index 57be3dbf..b6fbf614 100755 --- a/docs/i18n/en_US.json +++ b/docs/i18n/en_US.json @@ -2,17 +2,47 @@ "changelog.md": { "Changelog App Mobile": "Changelog Mobile App", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "As a reminder if there is no information on the update, it means that it only concerns the updating of documentation, translation or text", + "08\/07\/2025": "", + "Mise à jour de la doc sur droits utilisateurs partagés": "", + "18\/06\/2025": "18\/06\/2025", + "Ajout alerte si api mobile désactivée ou IP blanche": "Ajout alerte si api mobile désactivée ou IP blanche", + "25\/04\/2025": "25\/04\/2025", + "Ajout pour Max 8 Icones sur le menuCustom": "Ajout pour Max 8 Icones sur le menuCustom", + "24\/04\/2025": "24\/04\/2025", + "Ajout Commande Notifications Silencieuses pour Builds": "Ajout Commande Notifications Silencieuses pour Builds", + "IOS 491 et Android 875": "IOS 491 et Android 875", + "11\/04\/2025": "11\/04\/2025", + "Ajout paramètre Envoi NFC Direct au plugin après lecture": "Ajout paramètre Envoi NFC Direct au plugin après lecture", + "App V1": "App V1", + "Attention, à partir de cette version, l'appV1 n'est plus prise en charge": "Please note, from this version, appV1 is no longer supported", + "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification": "It will still be possible to access your equipment, to possibly replace your geolocation and notification controls", + "Suppression des fichiers concernant l'AppV1": "Deleting files related to AppV1", + "Nettoyage des infos stockées en BDD (config": "Cleaning the information stored in the database (config", + "20\/08\/2024": "20\/08\/2024", + "Déplacement des infos notifications dans l'onglet \"Mobile": "Moved notification info to the “Mobile” tab", + "04\/08\/2024": "04\/08\/2024", + "Prise en compte rétention des notifications pour suppression des images": "Taking into account retention of notifications for deletion of images", + "22\/07\/2024": "07\/22\/2024", + "Prise en compte rétention des notifications": "Taking into account retention of notifications", + "Target Sdk 34 pour Android": "Target SDK 34 for Android", + "28\/05\/2024": "05\/28\/2024", + "Modification Géolocalisation pour prochaine version App": "Geolocation modification for next App version", + "Stockage Notifications dans le plugin": "Storage Notifications in the plugin", + "Nouvelles Api pour l'application": "New APIs for the application", + "05\/04\/2024": "04\/05\/2024", + "Compatible uniquement avec la 4": "Compatible only with the 4", + "4 du Core ou supérieur": "4 core or higher", "15\/12\/2023": "15\/12\/2023", "Refactorisation importante du code": "Significant code refactoring", - "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré": "the Custom menu previously saved on the appV2 may no longer be saved", + "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré": "the Custom menu previously saved on the appV2 may no longer be saved", "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout": "A function to save menus in the plugin is being added", "22\/10\/2023": "10\/22\/2023", - "Fix mise à jour geolocalisation de l'app v2": "Fix geolocation update of the v2 app", + "Fix mise à jour géolocalisation de l'app v2": "Fix geolocation update of the v2 app", "12\/10\/2023": "12\/10\/2023", "Mise à jour pour prendre en compte la nouvelle Application mobile": "Updated to take into account the new Mobile Application", "09\/06\/2023": "06\/09\/2023", "Fix Notifications": "Fix Notifications", - "Ajout Affichage Equipements par Tableau": "Addition of Equipment Display by Table", + "Ajout Affichage Équipements par Tableau": "Addition of Equipment Display by Table", "19\/05\/2023": "05\/19\/2023", "PR by PhpVarious": "PR by PhpVarious", "Fix bugs mineurs": "Fix minor bugs", @@ -24,9 +54,9 @@ "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE": "FUTURE APPV2 ALPHA INTEGRATION IN MOBILE PLUGIN", "Nouvelle Interface Future AppV2": "New Interface Future AppV2", "Modale Custom Menu Future AppV2": "Modal Custom Menu Future AppV2", - "Modale QrCode Future AppV2": "Modal QrCode Future AppV2", + "Modale QR Code Future AppV2": "Modal QR Code Future AppV2", "13\/12\/2021": "12\/13\/2021", - "Mode offline pour le QrCode (creation du QrCode sans internet": "Offline mode for QrCode (creation of QrCode without internet", + "Mode offline pour le QR Code (création du QR Code sans internet": "Offline mode for QR Code (creation of QR Code without internet)", "Compatibilité 4": "Compatibility 4", "2 Jeedom Core": "2 Jeedom Core", "11\/10\/2021": "10\/11\/2021", @@ -38,23 +68,23 @@ "Ajout des images (Cameras, Rapports etc...) pour Android": "Adding images (Cameras, Reports etc ...) for Android", "Prise en charge de la version 1.4": "Support for version 1.4", "1 de l'app Android": "1 from the Android app", - "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Support for emoticons and line breaks with the new Android 1.4.1 version", + "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Support for emoticons and line breaks with the new Android 1.4.1 version", "17\/02\/2021": "02\/17\/2021", "Ajout de l'id de groupe pour les notifications Android": "Added group id for Android notifications", - "Icones présentes pour les pièces dans la presentation": "Icons present for the parts in the presentation", + "Icones présentes pour les pièces dans la présentation": "Icons present for the parts in the presentation", "15\/04\/2020": "04\/15\/2020", - "Ajouts des Commandes de chaques mobile": "Commands added for each mobile", + "Ajouts des Commandes de chaque mobile": "Additions of the Commands of each mobile", "31\/03\/2020": "31\/03\/2020", "Correction d'un bug sur l'envoi de notification sur certain Jeedom": "Fix a bug on Notification send on some Jeedom", "19\/02\/2020": "02\/19\/2020", - "fix http": "fix http", - "error ligne 39 si téléphone non authentifié a la premiere connexion": "error line 39 if phone not authenticated at first connection", + "Fix http": "Fix http", + "error ligne 39 si téléphone non authentifier à la première connexion": "error line 39 if phone not authenticated on first connection", "v1.3.0": "v1.3.0", "Notification ASK": "ASK notification", "Historique des notifications": "Notification history", "Slider avec pourcentage": "Slider with percentage", - "grosse modification de la synchronisation": "big change in timing", - "suppression du push to refresh": "removal of push to refresh", + "Modification de la synchronisation": "Changing the synchronization", + "Suppression du push to refresh": "Removal of push to refresh", " IMPORTANT.": " Important.", " IMPORTANT?": " Important?", "IMPORTANT ": "Important ", @@ -62,6 +92,13 @@ "[IMPORTANT]": "[Important]", "*IMPORTANT*": "*Important*", " IMPORTANT*": " Important*", + " xx\/08\/2024.": " xx\/08\/2024.", + " xx\/08\/2024?": " xx\/08\/2024?", + "xx\/08\/2024 ": "xx\/08\/2024 ", + " xx\/08\/2024]": " xx\/08\/2024]", + "[xx\/08\/2024]": "[xx\/08\/2024]", + "*xx\/08\/2024*": "*xx\/08\/2024*", + " xx\/08\/2024*": " xx\/08\/2024*", " Attention.": " Attention.", " Attention?": " Attention?", "Attention ": "Attention ", @@ -71,275 +108,70 @@ " Attention*": " Attention*" }, "index.md": { - " ": " ", - "`Information Générique`          ": "`Generic Information`", - "`GENERIC_INFO`": "`GENERIC_INFO`", - "Le bouton prend la forme du type de l'info": "The button takes the form of the type of information", - "type générique": "Type generic", - "Partie Dev plugin": "Dev plugin part", - "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc": "By default it's a toggle, if it's a message then you have an envelope, if slider you have a slider etc", - "`Action Générique`          ": "`Generic Action`", - "`GENERIC_ACTION`": "`GENERIC_ACTION`", - "Le bouton prend la forme du type de l'action": "The button takes the form of the action type", - "`HEATING_OTHER`": "`HEATING_OTHER`", - "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max": "The ON \/ OFF and Status buttons allow you to create the button on the far left of the template and the `button pilot wire heating` are there to add buttons (5 max", - "`Chauffage fil pilote bouton`(optionnel": "`Button pilot wire heating` (optional", - "`HEATING_ON`": "`HEATING_ON`", - "`Chauffage fil pilote Bouton ON`": "`Pilot wire heating ON button`", - "`TEMPERATURE`(optionnel": "`TEMPERATURE` (optional", - "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte": "See Image (i.e. you can choose between window and door", - "`Température`(optionnel": "`TEMPERATURE` (optional", - "`OPENING \/ OPENING_WINDOW`": "`OPENING \/ OPENING_WINDOW`", - "`Porte \/ Fenêtre`": "`Door\/Window`", - "`SABOTAGE`(optionnel": "`SABOTAGE` (optional", - "Voir image": "See picture", - "`Sabotage`(optionnel": "`SABOTAGE` (optional", - "`Présence`": "`PRESENCE`", - "`HUMIDITY`(optionnel": "`HUMIDITY` (optional", - "Voir Image": "See picture", - "`Humidité`(optionnel": "`Humidity` (optional", - "`Température`": "`TEMPERATURE`", - "Permet d'avoir son capteur de fumée complet sur une seule ligne": "Allows you to have your complete smoke sensor on a single line", - "`Fumée`": "`Smoke`", - "`SIREN_OFF`": "`SIREN_OFF`", - "Retour d'état présent, le bouton de gauche permet de switcher entre on et off": "Status feedback present, the left button toggles between on and off", - "`Sirène Bouton Off`": "`Siren Button Off`", - "`SIREN_STATE`": "`SIREN_STATE`", - "`Sirène Etat`": "`Siren State`", - "`LOCK_CLOSE`": "`LOCK_CLOSE`", - "`Serrure Bouton Fermer`": "`Lock Button Close`", - "`LOCK_STATE`": "`LOCK_STATE`", - "`Serrure Etat`": "`State Lock`", - "Permet d'avoir son capteur d'inondation complet sur une seule ligne": "Allows you to have your complete flood sensor on a single line", - "`FLAP_SLIDER`": "`FLAP_SLIDER`", - "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état": "Presence of a slider, with an Up \/ Down button in Toggle (with status icon", - "`Volet Bouton Slider`": "`Slider Button Pane`", - "`FLAP_UP`": "`FLAP_UP`", - "`Volet Bouton Monter`": "`Mount Button Pane`", - "`FLAP_STATE`(optionnel": "`FLAP_STATE` (optional", - "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel": "Presence of three buttons \"Up\", \"Down\", \"Stop\", optional status feedback", - "`Volet Etat`(optionnel": "`State pane` (optional", - "`ENERGY_SLIDER`": "`ENERGY_SLIDER`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité": "Status feedback present, the left button allows to switch between On and Off and the slider allows to control the intensity", - "`Prise Slider`": "`Slider socket`", - "`ENERGY_ON`": "`ENERGY_ON`", - "`Prise Bouton On`": "`Socket Button On`", - "`ENERGY_STATE`": "`ENERGY_STATE`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off": "Status feedback present, the left button toggles between on and off", - "`Prise Etat`": "`State Taking`", - "`ENERGY_OFF`": "`ENERGY_OFF`", - "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état": "presence of two buttons \"ON\" and \"Off\" no status feedback", - "`Prise Bouton Off`": "`Button Off socket`", - "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode": "In the circle the color of the lamp is present and when you click it you can change the color and activate a mode", - "`LIGHT_MODE`": "`LIGHT_MODE`", - "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue": "`Light Mode` (optional, it is used to have light modes, for example rainbow on Hue philips", - "`LIGHT_ON`": "`LIGHT_ON`", - "`Lumière Bouton On`": "`Light Button On`", - "`LIGHT_SLIDER`": "`LIGHT_SLIDER`", - "`Lumière Slider`": "`Light Slider`", - "`LIGHT_STATE`": "`LIGHT_STATE`", - "`Lumière Etat`": "`State Light`", - "`LIGHT_TOGGLE`": "`LIGHT_TOGGLE`", - "`Lumière Bouton Toggle`": "`Light Toggle Button`", - "`LIGHT_OFF`": "`LIGHT_OFF`", - "`Lumière Bouton Off`": "`Button Off Light`", "Plugin Mobile": "Mobile Plugin", - "Plugin permettant d'utiliser l'application Mobile Jeedom": "Plugin for using the Jeedom Mobile application", - "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile": "The Jeedom mobile application requires the installation of this plugin so that the box can communicate with the Mobile application", - "Configuration du plugin Mobile pour Application V2": "Configuration of the Mobile plugin for Application V2", - "Après installation du plugin, il vous suffit de l'activer": "After installing the plugin, you just need to activate it", - "Premiere connexion à l'application V2": "First connection to the V2 application", - "Pour connecter votre téléphone": "To connect your phone", - "il y a 2 méthodes possible;": "there are 2 possible methods;", - "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box": "on the first screen of the application, you are offered to connect your market account, and thus find all the boxes associated with this account, or simply add a box", - "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4": "To benefit from the application's functionalities, the core of your Jeedom must be in 4.4", - "0 minimum": "0 minimum", - "CONNEXION VIA LE COMPTE MARKET": "LOGIN VIA MARKET ACCOUNT", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe": "All you have to do is enter your Market ID and password", - "CONNEXION VIA BOX ID": "CONNECTION VIA BOX ID", - "Plusieurs choix sur cet écran": "Several choices on this screen", - "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "You enter the url of your Jeedom (internal or external), as well as the access identifiers to it and you confirm with the LOGIN button", - "Vous cliquez sur QR Code": "You click on QR Code", - "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin": "a new screen appears; you can scan a QRCode from the Mobile plugin of the box you want to add, via the QRCODE tab of the plugin", - "Onglet Qr Code du plugin Mobile": "Qr Code tab of the Mobile plugin", - "v2ModalPlugin": "v2ModalPlugin", - "Une fois cette premiere étape passée, vous êtes enregistré dans l'application": "Once this first step has been completed, you are registered in the application", - "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu": "if you have the Mobile plugin, you will have access via the menu to Notifications, QrCodes, Menu customization", - "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market": "In the menu, you will have a Boxs tab, which groups together all the boxes present on this market account", - "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box": "Simply click on the box where the Mobile plugin is installed, then identify yourself to access the box", - "La box passera en haut de la liste, ayant validée son authentification": "The box will go to the top of the list, having validated its authentication", - "Vous pouvez faire ainsi pour plusieurs boxs": "You can do this for several boxes", - "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;": "You can also click on the + button at the bottom right to access different options;", - "QrCode pour ajouter une box à la liste via le plugin Mobile": "QrCode to add a box to the list via the Mobile plugin", - "Manuel pour ajouter manuellement une box": "Manual to manually add a box", - "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau": "Detection Atlas and Luna (if you are on Wifi, will detect the boxes on the network", - "Synchronisation Market pour actualiser les informations du compte Market configuré": "Market sync to update configured Market account information", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "To access features such as Notifications, Menu Personalization or Geolocation, you must first have selected at least one current box", - "Fonctionnement de la Géolocalisation": "How Geolocation works", - "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +": "We add a Geolocation zone by clicking on the + icon", - "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée": "We type the address we are looking for, we validate with Enter on his phone; the cursor will then position itself on the desired address", - "Nous pouvons ensuite ajouter un nom et sauvegarder la zone": "We can then add a name and save the zone", - "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile": "This will create a new command on your mobile equipment, of binary type, which will correspond to the entries and exits of the zone if geolocation is activated on your mobile phone", - "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone": "We can also change the radius of the zone, to extend the detection of the zone", + "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom": "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom", + "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin": "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin", + "Configuration du plugin Mobile pour l'application V2": "Configuration du plugin Mobile pour l'application V2", + "Après avoir installé le plugin, activez-le simplement": "Après avoir installé le plugin, activez-le simplement", + "Première connexion à l'application V2": "First connection to the V2 application", + "Pour connecter votre téléphone, deux méthodes sont disponibles": "Pour connecter votre téléphone, deux méthodes sont disponibles", + "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement": "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement", + "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4": "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4", + "0 ou supérieure": "0 ou supérieure", + "Connexion via le compte Market": "LOGIN VIA MARKET ACCOUNT", + "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter": "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter", + "Connexion via l'ID de la Box": "Connexion via l'ID de la Box", + "Sur cet écran, plusieurs options s'offrent à vous": "Sur cet écran, plusieurs options s'offrent à vous", + "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton": "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton", + "QR Code": "QR Code", + "Cliquez sur": "Cliquez sur", + "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter": "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter", + "Onglet QR Code du plugin Mobile": "Qr Code tab of the Mobile plugin", + "Une fois cette étape terminée, vous êtes enregistré dans l'application": "Une fois cette étape terminée, vous êtes enregistré dans l'application", + "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu": "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu", + "Dans le menu, un onglet": "Dans le menu, un onglet", + "regroupe toutes les Box associées à votre compte Market": "regroupe toutes les Box associées à votre compte Market", + "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder": "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder", + "La Box validée apparaîtra en haut de la liste": "La Box validée apparaîtra en haut de la liste", + "Vous pouvez répéter cette opération pour plusieurs Box": "Vous pouvez répéter cette opération pour plusieurs Box", + "+": "+", + "En cliquant sur le bouton": "En cliquant sur le bouton", + "en bas à droite, vous accédez à différentes options": "en bas à droite, vous accédez à différentes options", + "Ajouter une Box via un QR Code (depuis le plugin Mobile": "Ajouter une Box via un QR Code (depuis le plugin Mobile", + "Ajouter une Box manuellement": "Ajouter une Box manuellement", + "Détecter les Box Atlas et Luna sur le réseau Wi-Fi": "Détecter les Box Atlas et Luna sur le réseau Wi-Fi", + "Synchroniser les informations de votre compte Market": "Synchroniser les informations de votre compte Market", + "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle": "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle", + "Fonctionnement de la géolocalisation": "How Geolocation works", + "Ajoutez une zone de géolocalisation en cliquant sur l'icône": "Ajoutez une zone de géolocalisation en cliquant sur l'icône", + "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone": "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone", + "Le curseur se positionnera automatiquement sur l'adresse": "Le curseur se positionnera automatiquement sur l'adresse", + "Vous pouvez ensuite nommer et sauvegarder la zone": "Vous pouvez ensuite nommer et sauvegarder la zone", + "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone": "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone", + "Vous pouvez également ajuster le rayon de la zone pour élargir la détection": "Vous pouvez également ajuster le rayon de la zone pour élargir la détection", + "Pour supprimer une zone, cliquez sur": "Pour supprimer une zone, cliquez sur", + "puis sur l'icône Corbeille": "puis sur l'icône Corbeille", + "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box": "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box", + "Paramètres de l'application": "Paramètres de l'application", + "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur": "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur", + "Par défaut, elles sont réglées sur 5 secondes": "Par défaut, elles sont reglées sur 5 secondes", + "Mon mobile ne possède pas d'IQ (identifiant unique": "Mon mobile ne possède pas d'IQ (identifiant unique", + "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier": "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier", + "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application": "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application", + "Une alerte vous indiquera que la récupération de l'IQ est en cours": "Une alerte vous indiquera que la récupération de l'IQ est en cours", "J'ai des soucis avec les notifications": "I have problems with notifications", - "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta": "This part is currently being improved and optimized on the beta application", + "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application": "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application", "J'ai des soucis d'affichage de ma webview": "I have problems displaying my webview", - "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL": "On your Jeedom, in the Preferences, check that the mobile home page is HOME", - "Configuration du plugin Mobile V1": "Setting up the Mobile V1 plugin", - "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom": "To configure the plugin, you must add the phones that will be able to access Jeedom", - "Pour Ajouter un téléphone": "To Add a phone", - "→": "→", - "Voici les paramètres à renseigner": "Here are the parameters to enter", - "Nom de l'équipement mobile": "Name of mobile equipment", - "Nom du téléphone": "Phone name", - "Activation de l'accès pour ce mobile": "Enabling access for this mobile", - "Type de Mobile": "Mobile Type", - "Sélection de l'OS du téléphone (iOS, Android": "Phone OS selection (iOS, Android", - "Utilisateur associé à cet accès": "User associated with this access", - "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits": "The choice of the user is important because it determines the equipment to which he will have access according to his rights", - "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule": "After saving, you will get a QRCode allowing the application to configure itself", - "Configuration des plugins et commandes que reçoit l'app": "Configuration of plugins and commands received by the app", - "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces": "After the initialization of the Mobile Plugin you have the possibility to modify the generic types of orders, plugins and parts", - "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes": "By clicking on a plugin, you can authorize it or not to chat with the mobile application, and configure each of the generic types associated with its commands", - "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes": "By clicking on a part, you can authorize it or not to be present in the mobile application, and configure each of the generic types associated with its orders", - "Configuration de l'application Mobile": "Mobile app configuration", - "Vous trouverez les applications sur les stores mobiles": "You will find the applications on the mobile blinds", - "Android Google Play": "Android Google Play", - "Apple App Store": "Apple App Store", - "Premier lancement de l'app": "First launch of the app", - "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci": "When you launch the Mobile application for the first time, you will be offered a tutorial to help you configure it", - "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone": "After downloading and installing your Jeedom mobile application, launch the application on your smartphone", - "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre": "You then arrive in a configuration tutorial which we advise you to follow", - "Certaines étapes ont étés faites précédemment": "Some steps have been done previously", - "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode": "You will then have the choice between a manual or automatic configuration by QRcode", - "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment": "If you choose to configure by QRcode, just flash the QRcode present on the Mobile App plugin in the smartphone equipment created previously", - "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement": "In this case, the application will automatically recover all the configuration of your Jeedom and connect automatically", - "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau": "When it is connected to your home via Wifi, the application will automatically use the Jeedom ethernet address internal to your network", - "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez": "When you are connected in 4G or 3G, it will use your external address to connect to your Jeedom (for example via the Jeedom DNS service if you use it", - "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom": "If you choose manual configuration, in this case you will need to manually enter the internal and external IP addresses of your Jeedom", - "Cette option est réservée à un public averti": "This option is reserved for an informed public", - "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation": "The application will synchronize and you will arrive on its home page (preceded by a mini presentation guide", - "L'application mobile Jeedom est maintenant prête à fonctionner": "Jeedom mobile app is now ready to work", - "Les Favoris": "Favorites", - "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios": "On the application you can have Favorites (shortcuts of commands, plugins, scenarios", - "Voici donc la marche à suivre pour en créer": "Here is the procedure for creating them", - "Cliquez sur un des + sur l'écran d'accueil de l'application": "Click on one of the + on the home screen of the application", - "Vous arriverez sur la page de sélection du type de raccourci": "You will arrive on the shortcut type selection page", - "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets": "For example, we are going to take Action, so it offers us Coins \/ Objects", - "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci": "Then simply select the action you want as a shortcut", - "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées": "It is then possible to personalize the color of this one (for the moment three colors are proposed", - "Ainsi que les deux textes associés": "As well as the two associated texts", - "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1": "Here, you have now a shortcut of your order (in version 1", - "1 il est prévu que les commandes On\/Off apparaissent sur la même touche": "1 On \/ Off commands are expected to appear on the same key", - "Comment bien configurer ses types génériques": "How to properly configure generic types", - "Les Génériques Types dans le plugin Mobile": "Generic Types in the Mobile plugin", - "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas": "Better than words, here is an example of the generic credits for a light with all its controls (see also the Light table below", - "Tableaux des templates de l'application": "Application template tables", - "Les Lumières": "The lights", - "`Lumière Couleur (info)`": "`Light Color (info)`", - "`Lumière Couleur (action)`": "`Light Color (action)`", - "`LIGHT_COLOR`": "`LIGHT_COLOR`", - "`LIGHT_SET_COLOR`": "`LIGHT_SET_COLOR`", - "Les Prises": "The plugs", - "Les Volets": "Shutters", - "`Volet Bouton Descendre`": "`Down button pane`", - "`Volet Bouton Stop`": "`Stop Button Pane`", - "`FLAP_DOWN`": "`FLAP_DOWN`", - "`FLAP_STOP`": "`FLAP_STOP`", - "`Volet Etat`": "`State pane`", - "`FLAP_STATE`": "`FLAP_STATE`", - "`Serrure Bouton Ouvrir`": "`Open Button Lock`", - "`LOCK_OPEN`": "`LOCK_OPEN`", - "Sirène": "Mermaid", - "`Sirène Bouton On`": "`Siren Button On`", - "`SIREN_ON`": "`SIREN_ON`", - "Fumée": "Smoke", - "Température": "Temperature", - "Présence": "Presence", - "`Luminosité`(optionnel": "`Brightness` (optional", - "`UV`(optionnel": "`UV` (optional", - "`BRIGHTNESS`(optionnel": "`BRIGHTNESS` (optional", - "Fil pilote": "Pilot wire", - "`Chauffage fil pilote bouton OFF`": "`Heating pilot wire OFF button`", - "`Chauffage fil pilote Etat`": "`Heating pilot wire State`", - "`HEATING_OFF`": "`HEATING_OFF`", - "`HEATING_STATE`": "`HEATING_STATE`", - "LES JOKERS": "THE JOKERS", - "Générique Action": "Generic Action", - "Générique Info": "Generic Info", - "Je suis sur Android version de l'app (1.0": "I am on Android version of the app (1.0", - "1 ou 1.0": "1 or 1.0", - "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app": "0) I cannot access my parts or even the configuration of the app", - "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option": "You had a popup warning you of a concern about the accessibility settings, so you just have to go to the accessibility settings of your mobile and uncheck the applications using this option", - "Un correctif sera apporté prochainement sur l'app": "A fix will be brought soon on the app", - "J'ai un message dans une des lignes de mes modules me disant qu'il": "I have a message in one of the lines of my modules telling me that it", - "manque un Type Générique": "missing a Generic Type", - "doc chapitre Type Générique": "doc chapter Generic Type", - "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible": "By reading this message, it tells you what generic type is missing to create a compatible template", - "Il suffit juste de l'appliquer": "Just apply it", - "Reportez-vous à la": "Refer to the", - "J'ai un souci sur un des plugins dit complètement intégré (météo": "I have a problem with one of the plugins called fully integrated (weather", - "thermostat, alarme, caméra": "thermostat, alarm, camera", - "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module": "Do not hesitate to access your module and click on save again, this will re-include the generic types associated with the module", - "Impossible de mettre une info sur l'accueil de l'app": "Unable to put an info on the welcome of the app", - "Cela est normal, ça sera disponible sur la version 1.1": "This is normal, it will be available on version 1.1", - "J'ai l'application qui prend enormement de memoire dans mon": "I have the application which takes up a lot of memory in my", - "Il y avait un bug sur les versions 1.0": "There was a bug on versions 1.0", - "0 et 1.0": "0 and 1.0", - "1 sur la partie Camera": "1 on the Camera part", - "Le souci ne ce reproduira plus avec la 1.0": "The problem will not happen again with 1.0", - "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache": "2, to delete the cache without overpricing the app, simply go to the configuration of your Mobile App and click on \"delete the cache", - "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile": "I have a concern of first synchronization on the app or of sql on the mobile plugin", - "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut": "You have to put generic types and authorize the plugin to send generics see the doc a little higher", - " Image.": " Picture.", - " Image?": " Picture?", - "Image ": "Picture ", - " Image]": " Picture]", - "[Image]": "[Picture]", - "*Image*": "*Picture*", - " Image*": " Picture*", - " Description.": " Description.", - " Description?": " Description?", - "Description ": "Description ", - " Description]": " Description]", - "[Description]": "[Description]", - "*Description*": "*Description*", - " Description*": " Description*", - " `PRESENCE`.": " `PRESENCE`.", - " `PRESENCE`?": " `PRESENCE`?", - "`PRESENCE` ": "`PRESENCE` ", - " `PRESENCE`]": " `PRESENCE`]", - "[`PRESENCE`]": "[`PRESENCE`]", - "*`PRESENCE`*": "*`PRESENCE`*", - " `PRESENCE`*": " `PRESENCE`*", - " `TEMPERATURE`.": " `TEMPERATURE`.", - " `TEMPERATURE`?": " `TEMPERATURE`?", - "`TEMPERATURE` ": "`TEMPERATURE` ", - " `TEMPERATURE`]": " `TEMPERATURE`]", - "[`TEMPERATURE`]": "[`TEMPERATURE`]", - "*`TEMPERATURE`*": "*`TEMPERATURE`*", - " `TEMPERATURE`*": " `TEMPERATURE`*", - " `SMOKE`.": " `SMOKE`.", - " `SMOKE`?": " `SMOKE`?", - "`SMOKE` ": "`SMOKE` ", - " `SMOKE`]": " `SMOKE`]", - "[`SMOKE`]": "[`SMOKE`]", - "*`SMOKE`*": "*`SMOKE`*", - " `SMOKE`*": " `SMOKE`*", - " `FLOOD`.": " `FLOOD`.", - " `FLOOD`?": " `FLOOD`?", - "`FLOOD` ": "`FLOOD` ", - " `FLOOD`]": " `FLOOD`]", - "[`FLOOD`]": "[`FLOOD`]", - "*`FLOOD`*": "*`FLOOD`*", - " `FLOOD`*": " `FLOOD`*", - " `Innondation`.": " `Flood`.", - " `Innondation`?": " `Flood`?", - "`Innondation` ": "`Flood` ", - " `Innondation`]": " `Flood`]", - "[`Innondation`]": "[`Flood`]", - "*`Innondation`*": "*`Flood`*", - " `Innondation`*": " `Flood`*", + "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur": "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur", + "Je souhaite partager mes droits mobile sans communiquer mon compte Market": "", + "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application": "", + "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc": "", + "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone": "", + "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile": "", + "Un code à 6 chiffres sera alors généré": "", + "Il devra le saisir sur le mobile possédant le compte Market, au même endroit": "", + "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction": "", + "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé": "", " IMPORTANT.": " IMPORTANT.", " IMPORTANT?": " IMPORTANT?", "IMPORTANT ": "IMPORTANT ", @@ -347,6 +179,27 @@ "[IMPORTANT]": "[IMPORTANT]", "*IMPORTANT*": "*IMPORTANT*", " IMPORTANT*": " IMPORTANT*", + " CONNEXION.": " CONNEXION.", + " CONNEXION?": " CONNEXION?", + "CONNEXION ": "CONNEXION ", + " CONNEXION]": " CONNEXION]", + "[CONNEXION]": "[CONNEXION]", + "*CONNEXION*": "*CONNEXION*", + " CONNEXION*": " CONNEXION*", + " Boxs.": " Boxs.", + " Boxs?": " Boxs?", + "Boxs ": "Boxs ", + " Boxs]": " Boxs]", + "[Boxs]": "[Boxs]", + "*Boxs*": "*Boxs*", + " Boxs*": " Boxs*", + " Éditer.": " Éditer.", + " Éditer?": " Éditer?", + "Éditer ": "Éditer ", + " Éditer]": " Éditer]", + "[Éditer]": "[Éditer]", + "*Éditer*": "*Éditer*", + " Éditer*": " Éditer*", " FAQ.": " FAQs.", " FAQ?": " FAQs?", "FAQ ": "FAQs ", @@ -354,194 +207,12 @@ "[FAQ]": "[FAQs]", "*FAQ*": "*FAQs*", " FAQ*": " FAQs*", - " Configuration.": " Setup.", - " Configuration?": " Setup?", - "Configuration ": "Setup ", - " Configuration]": " Setup]", - "[Configuration]": "[Setup]", - "*Configuration*": "*Setup*", - " Configuration*": " Setup*", - " Plugins.": " Plugins.", - " Plugins?": " Plugins?", - "Plugins ": "Plugins ", - " Plugins]": " Plugins]", - "[Plugins]": "[Plugins]", - "*Plugins*": "*Plugins*", - " Plugins*": " Plugins*", - " Communication.": " Communication.", - " Communication?": " Communication?", - "Communication ": "Communication ", - " Communication]": " Communication]", - "[Communication]": "[Communication]", - "*Communication*": "*Communication*", - " Communication*": " Communication*", - " App.": " App.", - " App?": " App?", - "App ": "App ", - " App]": " App]", - "[App]": "[App]", - "*App*": "*App*", - " App*": " App*", - " Mobile.": " Mobile.", - " Mobile?": " Mobile?", - "Mobile ": "Mobile ", - " Mobile]": " Mobile]", - "[Mobile]": "[Mobile]", - "*Mobile*": "*Mobile*", - " Mobile*": " Mobile*", - " Ajouter.": " Add.", - " Ajouter?": " Add?", - "Ajouter ": "Add ", - " Ajouter]": " Add]", - "[Ajouter]": "[Add]", - "*Ajouter*": "*Add*", - " Ajouter*": " Add*", - " Activer.": " Activate.", - " Activer?": " Activate?", - "Activer ": "Activate ", - " Activer]": " Activate]", - "[Activer]": "[Activate]", - "*Activer*": "*Activate*", - " Activer*": " Activate*", - " Utilisateur.": " User.", - " Utilisateur?": " User?", - "Utilisateur ": "User ", - " Utilisateur]": " User]", - "[Utilisateur]": "[User]", - "*Utilisateur*": "*User*", - " Utilisateur*": " User*", - " Tip.": " Tip.", - " Tip?": " Tip?", - "Tip ": "Tip ", - " Tip]": " Tip]", - "[Tip]": "[Tip]", - "*Tip*": "*Tip*", - " Tip*": " Tip*", - " LIGHT.": " LIGHT.", - " LIGHT?": " LIGHT?", - "LIGHT ": "LIGHT ", - " LIGHT]": " LIGHT]", - "[LIGHT]": "[LIGHT]", - "*LIGHT*": "*LIGHT*", - " LIGHT*": " LIGHT*", - " ENERGY.": " ENERGY.", - " ENERGY?": " ENERGY?", - "ENERGY ": "ENERGY ", - " ENERGY]": " ENERGY]", - "[ENERGY]": "[ENERGY]", - "*ENERGY*": "*ENERGY*", - " ENERGY*": " ENERGY*", - " FLAP.": " FLAP.", - " FLAP?": " FLAP?", - "FLAP ": "FLAP ", - " FLAP]": " FLAP]", - "[FLAP]": "[FLAP]", - "*FLAP*": "*FLAP*", - " FLAP*": " FLAP*", - " Inondation.": " Flood.", - " Inondation?": " Flood?", - "Inondation ": "Flood ", - " Inondation]": " Flood]", - "[Inondation]": "[Flood]", - "*Inondation*": "*Flood*", - " Inondation*": " Flood*", - " FLOOD.": " FLOOD.", - " FLOOD?": " FLOOD?", - "FLOOD ": "FLOOD ", - " FLOOD]": " FLOOD]", - "[FLOOD]": "[FLOOD]", - "*FLOOD*": "*FLOOD*", - " FLOOD*": " FLOOD*", - " Serrure.": " Lock.", - " Serrure?": " Lock?", - "Serrure ": "Lock ", - " Serrure]": " Lock]", - "[Serrure]": "[Lock]", - "*Serrure*": "*Lock*", - " Serrure*": " Lock*", - " LOCK.": " LOCK.", - " LOCK?": " LOCK?", - "LOCK ": "LOCK ", - " LOCK]": " LOCK]", - "[LOCK]": "[LOCK]", - "*LOCK*": "*LOCK*", - " LOCK*": " LOCK*", - " SIREN.": " SIREN.", - " SIREN?": " SIREN?", - "SIREN ": "SIREN ", - " SIREN]": " SIREN]", - "[SIREN]": "[SIREN]", - "*SIREN*": "*SIREN*", - " SIREN*": " SIREN*", - " SMOKE.": " SMOKE.", - " SMOKE?": " SMOKE?", - "SMOKE ": "SMOKE ", - " SMOKE]": " SMOKE]", - "[SMOKE]": "[SMOKE]", - "*SMOKE*": "*SMOKE*", - " SMOKE*": " SMOKE*", - " TEMPERATURE.": " Temperature.", - " TEMPERATURE?": " Temperature?", - "TEMPERATURE ": "Temperature ", - " TEMPERATURE]": " Temperature]", - "[TEMPERATURE]": "[Temperature]", - "*TEMPERATURE*": "*Temperature*", - " TEMPERATURE*": " Temperature*", - " PRESENCE.": " Presence.", - " PRESENCE?": " Presence?", - "PRESENCE ": "Presence ", - " PRESENCE]": " Presence]", - "[PRESENCE]": "[Presence]", - "*PRESENCE*": "*Presence*", - " PRESENCE*": " Presence*", - " Ouvrant.": " Opening.", - " Ouvrant?": " Opening?", - "Ouvrant ": "Opening ", - " Ouvrant]": " Opening]", - "[Ouvrant]": "[Opening]", - "*Ouvrant*": "*Opening*", - " Ouvrant*": " Opening*", - " OPENING.": " OPENING.", - " OPENING?": " OPENING?", - "OPENING ": "OPENING ", - " OPENING]": " OPENING]", - "[OPENING]": "[OPENING]", - "*OPENING*": "*OPENING*", - " OPENING*": " OPENING*", - " HEATING.": " HEATING.", - " HEATING?": " HEATING?", - "HEATING ": "HEATING ", - " HEATING]": " HEATING]", - "[HEATING]": "[HEATING]", - "*HEATING*": "*HEATING*", - " HEATING*": " HEATING*", - " ACTION.": " ACTION.", - " ACTION?": " ACTION?", - "ACTION ": "ACTION ", - " ACTION]": " ACTION]", - "[ACTION]": "[ACTION]", - "*ACTION*": "*ACTION*", - " ACTION*": " ACTION*", - " INFO.": " INFO.", - " INFO?": " INFO?", - "INFO ": "INFO ", - " INFO]": " INFO]", - "[INFO]": "[INFO]", - "*INFO*": "*INFO*", - " INFO*": " INFO*", - " Troubleshooting.": " Troubleshooting.", - " Troubleshooting?": " Troubleshooting?", - "Troubleshooting ": "Troubleshooting ", - " Troubleshooting]": " Troubleshooting]", - "[Troubleshooting]": "[Troubleshooting]", - "*Troubleshooting*": "*Troubleshooting*", - " Troubleshooting*": " Troubleshooting*", - " telephone.": " Phone.", - " telephone?": " Phone?", - "telephone ": "Phone ", - " telephone]": " Phone]", - "[telephone]": "[Phone]", - "*telephone*": "*Phone*", - " telephone*": " Phone*" + " ACCUEIL.": " ACCUEIL.", + " ACCUEIL?": " ACCUEIL?", + "ACCUEIL ": "ACCUEIL ", + " ACCUEIL]": " ACCUEIL]", + "[ACCUEIL]": "[ACCUEIL]", + "*ACCUEIL*": "*ACCUEIL*", + " ACCUEIL*": " ACCUEIL*" } } \ No newline at end of file diff --git a/docs/i18n/es_ES.json b/docs/i18n/es_ES.json index 0423c533..70ab8189 100755 --- a/docs/i18n/es_ES.json +++ b/docs/i18n/es_ES.json @@ -2,17 +2,47 @@ "changelog.md": { "Changelog App Mobile": "Changelog Mobile App", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Como recordatorio si no hay información sobre la actualización, significa que solo se refiere a la actualización de documentación, traducción o texto", + "08\/07\/2025": "", + "Mise à jour de la doc sur droits utilisateurs partagés": "", + "18\/06\/2025": "18\/06\/2025", + "Ajout alerte si api mobile désactivée ou IP blanche": "Ajout alerte si api mobile désactivée ou IP blanche", + "25\/04\/2025": "25\/04\/2025", + "Ajout pour Max 8 Icones sur le menuCustom": "Ajout pour Max 8 Icones sur le menuCustom", + "24\/04\/2025": "24\/04\/2025", + "Ajout Commande Notifications Silencieuses pour Builds": "Ajout Commande Notifications Silencieuses pour Builds", + "IOS 491 et Android 875": "IOS 491 et Android 875", + "11\/04\/2025": "11\/04\/2025", + "Ajout paramètre Envoi NFC Direct au plugin après lecture": "Ajout paramètre Envoi NFC Direct au plugin après lecture", + "App V1": "Aplicación V1", + "Attention, à partir de cette version, l'appV1 n'est plus prise en charge": "Tenga en cuenta que a partir de esta versión, la aplicación V1 ya no es compatible", + "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification": "Siempre será posible acceder a su equipo, para posiblemente reemplazar sus comandos de geolocalización y notificación", + "Suppression des fichiers concernant l'AppV1": "Eliminar archivos AppV1", + "Nettoyage des infos stockées en BDD (config": "Información de limpieza almacenada en la base de datos (config", + "20\/08\/2024": "20\/08\/2024", + "Déplacement des infos notifications dans l'onglet \"Mobile": "Mover la información de notificación a la pestaña \"Móvil\"", + "04\/08\/2024": "08\/04\/2024", + "Prise en compte rétention des notifications pour suppression des images": "Teniendo en cuenta la retención de notificaciones por eliminación de imágenes", + "22\/07\/2024": "22\/07\/2024", + "Prise en compte rétention des notifications": "Teniendo en cuenta la retención de notificaciones", + "Target Sdk 34 pour Android": "Objetivo SDK 34 para Android", + "28\/05\/2024": "28\/05\/2024", + "Modification Géolocalisation pour prochaine version App": "Modificación de geolocalización para la próxima versión de la aplicación", + "Stockage Notifications dans le plugin": "Notificaciones de almacenamiento en el complemento", + "Nouvelles Api pour l'application": "Nuevas API para la aplicación", + "05\/04\/2024": "05\/04\/2024", + "Compatible uniquement avec la 4": "Compatible solo con los 4", + "4 du Core ou supérieur": "4 núcleos o superior", "15\/12\/2023": "15\/12\/2023", "Refactorisation importante du code": "Refactorización de código significativa", - "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré": "Es posible que el menú personalizado previamente guardado en la aplicación V2 ya no se guarde", + "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré": "Es posible que el menú personalizado previamente guardado en la aplicación V2 ya no se guarde", "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout": "Se está agregando una función para guardar menús en el complemento", "22\/10\/2023": "22\/10\/2023", - "Fix mise à jour geolocalisation de l'app v2": "Reparar la actualización de geolocalización de la aplicación v2", + "Fix mise à jour géolocalisation de l'app v2": "Reparar la actualización de geolocalización de la aplicación v2", "12\/10\/2023": "10\/12\/2023", "Mise à jour pour prendre en compte la nouvelle Application mobile": "Actualizado para tener en cuenta la nueva Aplicación Móvil", "09\/06\/2023": "09\/06\/2023", "Fix Notifications": "Reparar notificaciones", - "Ajout Affichage Equipements par Tableau": "Adición de visualización de equipos por mesa", + "Ajout Affichage Équipements par Tableau": "Adición de visualización de equipos por mesa", "19\/05\/2023": "19\/05\/2023", "PR by PhpVarious": "Relaciones públicas por PhpVarious", "Fix bugs mineurs": "Corregir errores menores", @@ -24,9 +54,9 @@ "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE": "FUTURA INTEGRACIÓN DE APPV2 ALPHA EN PLUGIN MÓVIL", "Nouvelle Interface Future AppV2": "Nueva interfaz Future AppV2", "Modale Custom Menu Future AppV2": "Menú personalizado modal Future AppV2", - "Modale QrCode Future AppV2": "Modal QrCode Future AppV2", + "Modale QR Code Future AppV2": "Aplicación futura de código QR modal V2", "13\/12\/2021": "13\/12\/2021", - "Mode offline pour le QrCode (creation du QrCode sans internet": "Modo sin conexión para QrCode (creación de QrCode sin Internet", + "Mode offline pour le QR Code (création du QR Code sans internet": "Modo offline para el Código QR (creación del Código QR sin internet", "Compatibilité 4": "Compatibilidad 4", "2 Jeedom Core": "2 Jeedom Core", "11\/10\/2021": "11\/10\/2021", @@ -38,23 +68,23 @@ "Ajout des images (Cameras, Rapports etc...) pour Android": "Agregar imágenes (cámaras, informes, etc.) para Android", "Prise en charge de la version 1.4": "Soporte para la versión 1.4", "1 de l'app Android": "1 de la aplicación de Android", - "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Soporte para emoticonos y saltos de línea con la nueva versión de Android 1.4.1", + "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Soporte para emoticonos y saltos de línea con la nueva versión de Android 1.4.1", "17\/02\/2021": "17\/02\/2021", "Ajout de l'id de groupe pour les notifications Android": "Identificación de grupo agregada para notificaciones de Android", - "Icones présentes pour les pièces dans la presentation": "Iconos presentes para las partes en la presentación", + "Icones présentes pour les pièces dans la présentation": "Iconos presentes para las partes en la presentación", "15\/04\/2020": "15\/04\/2020", - "Ajouts des Commandes de chaques mobile": "Adición de órdenes para cada móvil", + "Ajouts des Commandes de chaque mobile": "Comandos agregados para cada móvil", "31\/03\/2020": "31\/03\/2020", "Correction d'un bug sur l'envoi de notification sur certain Jeedom": "Corrección de un error en el envío de notificaciones en ciertos Jeedom", "19\/02\/2020": "19\/02\/2020", - "fix http": "arreglar http", - "error ligne 39 si téléphone non authentifié a la premiere connexion": "línea de error 39 si el teléfono no está autenticado en la primera conexión", + "Fix http": "Arreglar http", + "error ligne 39 si téléphone non authentifier à la première connexion": "Línea de error 39 si el teléfono no está autenticado en la primera conexión", "v1.3.0": "v1.3.0", "Notification ASK": "Pedir notificación", "Historique des notifications": "Historial de notificaciones", "Slider avec pourcentage": "Control deslizante con porcentaje", - "grosse modification de la synchronisation": "gran cambio en el tiempo", - "suppression du push to refresh": "eliminación de empuje para actualizar", + "Modification de la synchronisation": "Cambiando el tiempo", + "Suppression du push to refresh": "Eliminación de empuje para actualizar", " IMPORTANT.": " Importante.", " IMPORTANT?": " Importante?", "IMPORTANT ": "Importante ", @@ -62,6 +92,13 @@ "[IMPORTANT]": "[Importante]", "*IMPORTANT*": "*Importante*", " IMPORTANT*": " Importante*", + " xx\/08\/2024.": " xx\/08\/2024.", + " xx\/08\/2024?": " xx\/08\/2024?", + "xx\/08\/2024 ": "xx\/08\/2024 ", + " xx\/08\/2024]": " xx\/08\/2024]", + "[xx\/08\/2024]": "[xx\/08\/2024]", + "*xx\/08\/2024*": "*xx\/08\/2024*", + " xx\/08\/2024*": " xx\/08\/2024*", " Attention.": " Atención.", " Attention?": " Atención?", "Attention ": "Atención ", @@ -71,275 +108,70 @@ " Attention*": " Atención*" }, "index.md": { - " ": " ", - "`Information Générique`          ": "`Información genérica`", - "`GENERIC_INFO`": "`INFO_GENERICA`", - "Le bouton prend la forme du type de l'info": "El botón toma la forma del tipo de información", - "type générique": "Tipo genérico", - "Partie Dev plugin": "Parte del complemento de desarrollo", - "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc": "De forma predeterminada es un interruptor, si es un mensaje entonces tienes un sobre, si es un control deslizante tienes un control deslizante, etc", - "`Action Générique`          ": "`Acción genérica`", - "`GENERIC_ACTION`": "`ACCIÓN_GENERICA`", - "Le bouton prend la forme du type de l'action": "El botón toma la forma del tipo de acción", - "`HEATING_OTHER`": "`HEATING_OTHER`", - "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max": "Los botones ON \/ OFF y Status le permiten crear el botón en el extremo izquierdo de la plantilla y el `botón de calentamiento del cable piloto 'está ahí para agregar botones (5 máx", - "`Chauffage fil pilote bouton`(optionnel": "`Botón de calentamiento del cable piloto` (opcional", - "`HEATING_ON`": "`HEATING_ON`", - "`Chauffage fil pilote Bouton ON`": "`Botón de encendido del calentamiento del cable piloto`", - "`TEMPERATURE`(optionnel": "`TEMPERATURA` (opcional", - "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte": "Ver imagen (es decir, puede elegir entre ventana y puerta", - "`Température`(optionnel": "`TEMPERATURA` (opcional", - "`OPENING \/ OPENING_WINDOW`": "`OPENING \/ OPENING_WINDOW`", - "`Porte \/ Fenêtre`": "`Puerta\/Ventana`", - "`SABOTAGE`(optionnel": "`SABOTAGE` (opcional", - "Voir image": "Ver foto", - "`Sabotage`(optionnel": "`SABOTAGE` (opcional", - "`Présence`": "`PRESENCIA`", - "`HUMIDITY`(optionnel": "`HUMEDAD` (opcional", - "Voir Image": "Ver foto", - "`Humidité`(optionnel": "`Humedad` (opcional", - "`Température`": "`TEMPERATURA`", - "Permet d'avoir son capteur de fumée complet sur une seule ligne": "Le permite tener su sensor de humo completo en una sola línea", - "`Fumée`": "`humo`", - "`SIREN_OFF`": "`SIREN_OFF`", - "Retour d'état présent, le bouton de gauche permet de switcher entre on et off": "Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado", - "`Sirène Bouton Off`": "`Siren Button Off`", - "`SIREN_STATE`": "`SIREN_STATE`", - "`Sirène Etat`": "\"Estado de sirena\"", - "`LOCK_CLOSE`": "`LOCK_CLOSE`", - "`Serrure Bouton Fermer`": "`Cerrar el botón de bloqueo`", - "`LOCK_STATE`": "`LOCK_STATE`", - "`Serrure Etat`": "`Bloqueo de estado`", - "Permet d'avoir son capteur d'inondation complet sur une seule ligne": "Le permite tener su sensor de inundación completo en una sola línea", - "`FLAP_SLIDER`": "`FLAP_SLIDER`", - "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état": "Presencia de un control deslizante, con un botón Arriba \/ Abajo en Toggle (con icono de estado", - "`Volet Bouton Slider`": "`Panel del botón deslizante`", - "`FLAP_UP`": "`FLAP_UP`", - "`Volet Bouton Monter`": "`Panel de botones de montaje`", - "`FLAP_STATE`(optionnel": "`FLAP_STATE` (opcional", - "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel": "Presencia de tres botones \"Arriba\", \"Abajo\", \"Detener\", retroalimentación de estado opcional", - "`Volet Etat`(optionnel": "`Panel de estado` (opcional", - "`ENERGY_SLIDER`": "`ENERGY_SLIDER`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité": "Estado de retroalimentación presente, el botón izquierdo permite cambiar entre Encendido y Apagado y el control deslizante permite controlar la intensidad", - "`Prise Slider`": "`Toma deslizante`", - "`ENERGY_ON`": "`ENERGY_ON`", - "`Prise Bouton On`": "`Botón de enchufe activado`", - "`ENERGY_STATE`": "`ENERGY_STATE`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off": "Comentarios de estado presentes, el botón izquierdo alterna entre encendido y apagado", - "`Prise Etat`": "`Toma de estado`", - "`ENERGY_OFF`": "`ENERGY_OFF`", - "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état": "presencia de dos botones \"ON\" y \"Off\" sin retroalimentación de estado", - "`Prise Bouton Off`": "`Toma de botón apagado`", - "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode": "En el círculo, el color de la lámpara está presente y, al hacer clic en él, puede cambiar el color y activar un modo", - "`LIGHT_MODE`": "`LIGHT_MODE`", - "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue": "`Modo de luz` (opcional, se utiliza para tener modos de luz, por ejemplo, arco iris en Hue philips", - "`LIGHT_ON`": "`LIGHT_ON`", - "`Lumière Bouton On`": "`Botón de luz encendido`", - "`LIGHT_SLIDER`": "`LIGHT_SLIDER`", - "`Lumière Slider`": "`Light Slider`", - "`LIGHT_STATE`": "`LIGHT_STATE`", - "`Lumière Etat`": "`State Light`", - "`LIGHT_TOGGLE`": "`LIGHT_TOGGLE`", - "`Lumière Bouton Toggle`": "`Botón de alternancia de luz`", - "`LIGHT_OFF`": "`LIGHT_OFF`", - "`Lumière Bouton Off`": "`Botón apagado luz`", "Plugin Mobile": "Complemento móvil", - "Plugin permettant d'utiliser l'application Mobile Jeedom": "Complemento para usar la aplicación Jeedom Mobile", - "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile": "La aplicación móvil Jeedom requiere la instalación de este complemento para que la caja pueda comunicarse con la aplicación móvil", - "Configuration du plugin Mobile pour Application V2": "Configuración del complemento móvil para la aplicación V2", - "Après installation du plugin, il vous suffit de l'activer": "Después de instalar el complemento, solo necesita activarlo", - "Premiere connexion à l'application V2": "Primera conexión a la aplicación V2", - "Pour connecter votre téléphone": "Para conectar tu teléfono", - "il y a 2 méthodes possible;": "hay 2 métodos posibles;", - "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box": "en la primera pantalla de la aplicación, se le ofrece conectar su cuenta de mercado y así encontrar todas las casillas asociadas a esta cuenta, o simplemente agregar una casilla", - "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4": "Para beneficiarse de las funcionalidades de la aplicación, el núcleo de su Jeedom debe estar en 4.4", - "0 minimum": "0 mínimo", - "CONNEXION VIA LE COMPTE MARKET": "INICIAR SESIÓN A TRAVÉS DE LA CUENTA DE MERCADO", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe": "Todo lo que tiene que hacer es ingresar su Market ID y contraseña", - "CONNEXION VIA BOX ID": "CONEXIÓN MEDIANTE BOX ID", - "Plusieurs choix sur cet écran": "Varias opciones en esta pantalla", - "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "Ingresas la url de tu Jeedom (interna o externa), así como los identificadores de acceso a la misma y confirmas con el botón LOGIN", - "Vous cliquez sur QR Code": "Haces clic en el código QR", - "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin": "aparece una nueva pantalla; puede escanear un QRCode desde el complemento móvil del cuadro que desea agregar, a través de la pestaña QRCODE del complemento", - "Onglet Qr Code du plugin Mobile": "Pestaña Código QR del complemento móvil", - "v2ModalPlugin": "Complemento v2Modal", - "Une fois cette premiere étape passée, vous êtes enregistré dans l'application": "Una vez realizado este primer paso, ya estás registrado en la aplicación", - "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu": "si tiene el complemento móvil, tendrá acceso a través del menú a Notificaciones, QrCodes, Personalización del menú", - "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market": "En el menú, tendrá una pestaña Cajas, que agrupa todas las cajas presentes en esta cuenta de mercado", - "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box": "Simplemente haga clic en el cuadro donde está instalado el complemento móvil, luego identifíquese para acceder al cuadro", - "La box passera en haut de la liste, ayant validée son authentification": "La casilla irá al principio de la lista, habiendo validado su autenticación", - "Vous pouvez faire ainsi pour plusieurs boxs": "Puedes hacer esto para varias cajas", - "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;": "También puede hacer clic en el botón + en la parte inferior derecha para acceder a diferentes opciones;", - "QrCode pour ajouter une box à la liste via le plugin Mobile": "QrCode para agregar un cuadro a la lista a través del complemento móvil", - "Manuel pour ajouter manuellement une box": "Manual para agregar una caja manualmente", - "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau": "Detección Atlas y Luna (si estás en Wifi, detectará las cajas en la red", - "Synchronisation Market pour actualiser les informations du compte Market configuré": "Sincronización de Market para actualizar la información de la cuenta de Market configurada", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Para acceder a funciones como Notificaciones, Personalización de Menú o Geolocalización, primero debes haber seleccionado al menos una casilla actual", - "Fonctionnement de la Géolocalisation": "Cómo funciona la geolocalización", - "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +": "Añadimos una zona de Geolocalización pulsando en el icono +", - "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée": "Escribimos la dirección que buscamos, validamos con Enter en su teléfono; el cursor se posicionará entonces en la dirección deseada", - "Nous pouvons ensuite ajouter un nom et sauvegarder la zone": "Luego podemos agregar un nombre y guardar la zona", - "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile": "Esto creará un nuevo comando en tu equipo móvil, de tipo binario, que corresponderá a las entradas y salidas de la zona si la geolocalización está activada en tu teléfono móvil", - "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone": "También podemos cambiar el radio de la zona, para ampliar la detección de la zona", + "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom": "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom", + "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin": "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin", + "Configuration du plugin Mobile pour l'application V2": "Configuration du plugin Mobile pour l'application V2", + "Après avoir installé le plugin, activez-le simplement": "Après avoir installé le plugin, activez-le simplement", + "Première connexion à l'application V2": "Primera conexión a la aplicación V2", + "Pour connecter votre téléphone, deux méthodes sont disponibles": "Pour connecter votre téléphone, deux méthodes sont disponibles", + "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement": "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement", + "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4": "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4", + "0 ou supérieure": "0 ou supérieure", + "Connexion via le compte Market": "INICIAR SESIÓN A TRAVÉS DE LA CUENTA DE MERCADO", + "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter": "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter", + "Connexion via l'ID de la Box": "Connexion via l'ID de la Box", + "Sur cet écran, plusieurs options s'offrent à vous": "Sur cet écran, plusieurs options s'offrent à vous", + "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton": "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton", + "QR Code": "QR Code", + "Cliquez sur": "Cliquez sur", + "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter": "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter", + "Onglet QR Code du plugin Mobile": "Pestaña Código QR del complemento móvil", + "Une fois cette étape terminée, vous êtes enregistré dans l'application": "Une fois cette étape terminée, vous êtes enregistré dans l'application", + "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu": "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu", + "Dans le menu, un onglet": "Dans le menu, un onglet", + "regroupe toutes les Box associées à votre compte Market": "regroupe toutes les Box associées à votre compte Market", + "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder": "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder", + "La Box validée apparaîtra en haut de la liste": "La Box validée apparaîtra en haut de la liste", + "Vous pouvez répéter cette opération pour plusieurs Box": "Vous pouvez répéter cette opération pour plusieurs Box", + "+": "+", + "En cliquant sur le bouton": "En cliquant sur le bouton", + "en bas à droite, vous accédez à différentes options": "en bas à droite, vous accédez à différentes options", + "Ajouter une Box via un QR Code (depuis le plugin Mobile": "Ajouter une Box via un QR Code (depuis le plugin Mobile", + "Ajouter une Box manuellement": "Ajouter une Box manuellement", + "Détecter les Box Atlas et Luna sur le réseau Wi-Fi": "Détecter les Box Atlas et Luna sur le réseau Wi-Fi", + "Synchroniser les informations de votre compte Market": "Synchroniser les informations de votre compte Market", + "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle": "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle", + "Fonctionnement de la géolocalisation": "Cómo funciona la geolocalización", + "Ajoutez une zone de géolocalisation en cliquant sur l'icône": "Ajoutez une zone de géolocalisation en cliquant sur l'icône", + "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone": "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone", + "Le curseur se positionnera automatiquement sur l'adresse": "Le curseur se positionnera automatiquement sur l'adresse", + "Vous pouvez ensuite nommer et sauvegarder la zone": "Vous pouvez ensuite nommer et sauvegarder la zone", + "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone": "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone", + "Vous pouvez également ajuster le rayon de la zone pour élargir la détection": "Vous pouvez également ajuster le rayon de la zone pour élargir la détection", + "Pour supprimer une zone, cliquez sur": "Pour supprimer une zone, cliquez sur", + "puis sur l'icône Corbeille": "puis sur l'icône Corbeille", + "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box": "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box", + "Paramètres de l'application": "Paramètres de l'application", + "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur": "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur", + "Par défaut, elles sont réglées sur 5 secondes": "Par défaut, elles sont reglées sur 5 secondes", + "Mon mobile ne possède pas d'IQ (identifiant unique": "Mon mobile ne possède pas d'IQ (identifiant unique", + "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier": "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier", + "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application": "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application", + "Une alerte vous indiquera que la récupération de l'IQ est en cours": "Une alerte vous indiquera que la récupération de l'IQ est en cours", "J'ai des soucis avec les notifications": "Tengo problemas con las notificaciones", - "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta": "Esta parte se está mejorando y optimizando actualmente en la aplicación beta", + "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application": "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application", "J'ai des soucis d'affichage de ma webview": "Tengo problemas para mostrar mi vista web", - "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL": "En tu Jeedom, en Preferencias, comprueba que la página de inicio móvil sea INICIO", - "Configuration du plugin Mobile V1": "Configurar el complemento Mobile V1", - "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom": "Para configurar el complemento, debe agregar los teléfonos que podrán acceder a Jeedom", - "Pour Ajouter un téléphone": "Para agregar un teléfono", - "→": "→", - "Voici les paramètres à renseigner": "Aquí están los parámetros para ingresar", - "Nom de l'équipement mobile": "Nombre del equipo móvil", - "Nom du téléphone": "Nombre del teléfono", - "Activation de l'accès pour ce mobile": "Habilitar el acceso para este móvil", - "Type de Mobile": "Tipo de móvil", - "Sélection de l'OS du téléphone (iOS, Android": "Selección del sistema operativo del teléfono (iOS, Android", - "Utilisateur associé à cet accès": "Usuario asociado con este acceso", - "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits": "La elección del usuario es importante porque determina el equipo al que tendrá acceso de acuerdo con sus derechos", - "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule": "Después de guardar, obtendrá un QRCode que permite que la aplicación se configure", - "Configuration des plugins et commandes que reçoit l'app": "Configuración de complementos y comandos recibidos por la aplicación", - "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces": "Después de la inicialización del complemento móvil, tiene la posibilidad de modificar los tipos genéricos de pedidos, complementos y piezas", - "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Al hacer clic en un complemento, puede autorizarlo o no a chatear con la aplicación móvil y configurar cada uno de los tipos genéricos asociados con sus comandos", - "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Al hacer clic en una parte, puede autorizarla o no para que esté presente en la aplicación móvil y configurar cada uno de los tipos genéricos asociados con sus pedidos", - "Configuration de l'application Mobile": "Configuración de la aplicación móvil", - "Vous trouverez les applications sur les stores mobiles": "Encontrará las aplicaciones en las persianas móviles", - "Android Google Play": "Android Google Play", - "Apple App Store": "Apple App Store", - "Premier lancement de l'app": "Primer lanzamiento de la aplicación", - "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci": "Cuando inicie la aplicación móvil por primera vez, se le ofrecerá un tutorial para ayudarlo a configurarla", - "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone": "Después de descargar e instalar su aplicación móvil Jeedom, inicie la aplicación en su teléfono inteligente", - "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre": "Luego llega a un tutorial de configuración que le recomendamos que siga", - "Certaines étapes ont étés faites précédemment": "Algunos pasos se han realizado previamente", - "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode": "Luego podrá elegir entre una configuración manual o automática por QRcode", - "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment": "Si opta por la configuración de QRcode, simplemente muestre el QRcode presente en el complemento de la aplicación móvil en el equipo del teléfono inteligente creado previamente", - "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement": "En este caso, la aplicación recuperará automáticamente toda la configuración de su Jeedom y se conectará automáticamente", - "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau": "Cuando está conectado a su hogar a través de Wifi, la aplicación usará automáticamente la dirección Ethernet de Jeedom interna de su red", - "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez": "Cuando esté conectado en 4G o 3G, usará su dirección externa para conectarse a su Jeedom (por ejemplo, a través del servicio DNS de Jeedom si lo usa)", - "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom": "Si elige la configuración manual, en este caso deberá ingresar manualmente las direcciones IP internas y externas de su Jeedom", - "Cette option est réservée à un public averti": "Esta opción está reservada para un público informado", - "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation": "La aplicación se sincronizará y usted llegará a su página de inicio (precedida por una mini guía de presentación", - "L'application mobile Jeedom est maintenant prête à fonctionner": "La aplicación móvil Jeedom ahora está lista para funcionar", - "Les Favoris": "Favoritos", - "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios": "En la aplicación puede tener Favoritos (accesos directos de comandos, complementos, escenarios", - "Voici donc la marche à suivre pour en créer": "Aquí está el procedimiento para crearlos", - "Cliquez sur un des + sur l'écran d'accueil de l'application": "Haga clic en uno de los + en la pantalla de inicio de la aplicación", - "Vous arriverez sur la page de sélection du type de raccourci": "Llegará a la página de selección de tipo de acceso directo", - "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets": "Por ejemplo, vamos a tomar medidas, por lo que nos ofrece monedas \/ objetos", - "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci": "Luego, simplemente seleccione la acción que desea como acceso directo", - "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées": "Entonces es posible personalizar el color de este (por el momento se proponen tres colores", - "Ainsi que les deux textes associés": "Así como los dos textos asociados", - "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1": "Aquí, ahora tiene un acceso directo de su pedido (en la versión 1", - "1 il est prévu que les commandes On\/Off apparaissent sur la même touche": "1 Se espera que los comandos de encendido \/ apagado aparezcan en la misma tecla", - "Comment bien configurer ses types génériques": "Cómo configurar correctamente los tipos genéricos", - "Les Génériques Types dans le plugin Mobile": "Tipos genéricos en el complemento móvil", - "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas": "Mejor que las palabras, aquí hay un ejemplo de los créditos genéricos para una luz con todos sus controles (vea también la tabla de Luz a continuación)", - "Tableaux des templates de l'application": "Tablas de plantillas de aplicación", - "Les Lumières": "Las luces", - "`Lumière Couleur (info)`": "`Color claro (información)`", - "`Lumière Couleur (action)`": "`Color claro (acción)`", - "`LIGHT_COLOR`": "`LIGHT_COLOR`", - "`LIGHT_SET_COLOR`": "`LIGHT_SET_COLOR`", - "Les Prises": "Los enchufes", - "Les Volets": "Los boletos", - "`Volet Bouton Descendre`": "`Panel de botones hacia abajo`", - "`Volet Bouton Stop`": "`Panel de botones de parada`", - "`FLAP_DOWN`": "`FLAP_DOWN`", - "`FLAP_STOP`": "`FLAP_STOP`", - "`Volet Etat`": "`Panel de estado`", - "`FLAP_STATE`": "`FLAP_STATE`", - "`Serrure Bouton Ouvrir`": "`Bloqueo de botón abierto`", - "`LOCK_OPEN`": "`LOCK_OPEN`", - "Sirène": "Sirena", - "`Sirène Bouton On`": "`Siren Button On`", - "`SIREN_ON`": "`SIREN_ON`", - "Fumée": "Humo", - "Température": "Temperatura", - "Présence": "Presencia", - "`Luminosité`(optionnel": "`Brillo` (opcional", - "`UV`(optionnel": "`UV` (opcional", - "`BRIGHTNESS`(optionnel": "`BRILLO` (opcional", - "Fil pilote": "Cable piloto", - "`Chauffage fil pilote bouton OFF`": "`Botón de apagado del cable piloto de calentamiento`", - "`Chauffage fil pilote Etat`": "`Calentar el estado del cable piloto`", - "`HEATING_OFF`": "`HEATING_OFF`", - "`HEATING_STATE`": "`HEATING_STATE`", - "LES JOKERS": "Los bromistas", - "Générique Action": "Acción genérica", - "Générique Info": "Información genérica", - "Je suis sur Android version de l'app (1.0": "Estoy en la versión de Android de la aplicación (1.0", - "1 ou 1.0": "1 o 1.0", - "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app": "0) No puedo acceder a mis partes o incluso a la configuración de la aplicación", - "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option": "Recibió una ventana emergente que le advirtió que le preocupa la configuración de accesibilidad, por lo que solo tiene que ir a la configuración de accesibilidad de su dispositivo móvil y desmarcar las aplicaciones con esta opción", - "Un correctif sera apporté prochainement sur l'app": "Pronto se traerá una solución en la aplicación", - "J'ai un message dans une des lignes de mes modules me disant qu'il": "Tengo un mensaje en una de las líneas de mis módulos que me dice que", - "manque un Type Générique": "falta un tipo genérico", - "doc chapitre Type Générique": "doc capítulo Tipo genérico", - "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible": "Al leer este mensaje, le indica qué tipo genérico falta para crear una plantilla compatible", - "Il suffit juste de l'appliquer": "Solo aplícalo", - "Reportez-vous à la": "Consulte el", - "J'ai un souci sur un des plugins dit complètement intégré (météo": "Tengo un problema con uno de los complementos llamado totalmente integrado (clima", - "thermostat, alarme, caméra": "termostato, alarma, cámara", - "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module": "No dude en acceder a su módulo y haga clic en Guardar nuevamente, esto volverá a incluir los tipos genéricos asociados con el módulo", - "Impossible de mettre une info sur l'accueil de l'app": "No se puede poner una información sobre la bienvenida de la aplicación", - "Cela est normal, ça sera disponible sur la version 1.1": "Esto es normal, estará disponible en la versión 1.1", - "J'ai l'application qui prend enormement de memoire dans mon": "Tengo la aplicación que ocupa mucha memoria en mi", - "Il y avait un bug sur les versions 1.0": "Hubo un error en las versiones 1.0", - "0 et 1.0": "0 y 1.0", - "1 sur la partie Camera": "1 en la parte de la cámara", - "Le souci ne ce reproduira plus avec la 1.0": "El problema no volverá a suceder con 1.0", - "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache": "2, para eliminar el caché sin sobrevalorar la aplicación, simplemente vaya a la configuración de su aplicación móvil y haga clic en \"eliminar el caché", - "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile": "Me preocupa la primera sincronización en la aplicación o sql en el complemento móvil", - "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut": "Tienes que poner tipos genéricos y autorizar el complemento para enviar genéricos ver el documento un poco más alto", - " Image.": " Imagen.", - " Image?": " Imagen?", - "Image ": "Imagen ", - " Image]": " Imagen]", - "[Image]": "[Imagen]", - "*Image*": "*Imagen*", - " Image*": " Imagen*", - " Description.": " Descripción.", - " Description?": " Descripción?", - "Description ": "Descripción ", - " Description]": " Descripción]", - "[Description]": "[Descripción]", - "*Description*": "*Descripción*", - " Description*": " Descripción*", - " `PRESENCE`.": " `PRESENCIA`.", - " `PRESENCE`?": " `PRESENCIA`?", - "`PRESENCE` ": "`PRESENCIA` ", - " `PRESENCE`]": " `PRESENCIA`]", - "[`PRESENCE`]": "[`PRESENCIA`]", - "*`PRESENCE`*": "*`PRESENCIA`*", - " `PRESENCE`*": " `PRESENCIA`*", - " `TEMPERATURE`.": " `TEMPERATURA`.", - " `TEMPERATURE`?": " `TEMPERATURA`?", - "`TEMPERATURE` ": "`TEMPERATURA` ", - " `TEMPERATURE`]": " `TEMPERATURA`]", - "[`TEMPERATURE`]": "[`TEMPERATURA`]", - "*`TEMPERATURE`*": "*`TEMPERATURA`*", - " `TEMPERATURE`*": " `TEMPERATURA`*", - " `SMOKE`.": " `HUMO`.", - " `SMOKE`?": " `HUMO`?", - "`SMOKE` ": "`HUMO` ", - " `SMOKE`]": " `HUMO`]", - "[`SMOKE`]": "[`HUMO`]", - "*`SMOKE`*": "*`HUMO`*", - " `SMOKE`*": " `HUMO`*", - " `FLOOD`.": " `INUNDACIÓN`.", - " `FLOOD`?": " `INUNDACIÓN`?", - "`FLOOD` ": "`INUNDACIÓN` ", - " `FLOOD`]": " `INUNDACIÓN`]", - "[`FLOOD`]": "[`INUNDACIÓN`]", - "*`FLOOD`*": "*`INUNDACIÓN`*", - " `FLOOD`*": " `INUNDACIÓN`*", - " `Innondation`.": " `inundación`.", - " `Innondation`?": " `inundación`?", - "`Innondation` ": "`inundación` ", - " `Innondation`]": " `inundación`]", - "[`Innondation`]": "[`inundación`]", - "*`Innondation`*": "*`inundación`*", - " `Innondation`*": " `inundación`*", + "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur": "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur", + "Je souhaite partager mes droits mobile sans communiquer mon compte Market": "", + "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application": "", + "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc": "", + "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone": "", + "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile": "", + "Un code à 6 chiffres sera alors généré": "", + "Il devra le saisir sur le mobile possédant le compte Market, au même endroit": "", + "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction": "", + "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé": "", " IMPORTANT.": " IMPORTANTE.", " IMPORTANT?": " IMPORTANTE?", "IMPORTANT ": "IMPORTANTE ", @@ -347,6 +179,27 @@ "[IMPORTANT]": "[IMPORTANTE]", "*IMPORTANT*": "*IMPORTANTE*", " IMPORTANT*": " IMPORTANTE*", + " CONNEXION.": " CONNEXION.", + " CONNEXION?": " CONNEXION?", + "CONNEXION ": "CONNEXION ", + " CONNEXION]": " CONNEXION]", + "[CONNEXION]": "[CONNEXION]", + "*CONNEXION*": "*CONNEXION*", + " CONNEXION*": " CONNEXION*", + " Boxs.": " Boxs.", + " Boxs?": " Boxs?", + "Boxs ": "Boxs ", + " Boxs]": " Boxs]", + "[Boxs]": "[Boxs]", + "*Boxs*": "*Boxs*", + " Boxs*": " Boxs*", + " Éditer.": " Éditer.", + " Éditer?": " Éditer?", + "Éditer ": "Éditer ", + " Éditer]": " Éditer]", + "[Éditer]": "[Éditer]", + "*Éditer*": "*Éditer*", + " Éditer*": " Éditer*", " FAQ.": " Preguntas frecuentes.", " FAQ?": " Preguntas frecuentes?", "FAQ ": "Preguntas frecuentes ", @@ -354,194 +207,12 @@ "[FAQ]": "[Preguntas frecuentes]", "*FAQ*": "*Preguntas frecuentes*", " FAQ*": " Preguntas frecuentes*", - " Configuration.": " Configuración.", - " Configuration?": " Configuración?", - "Configuration ": "Configuración ", - " Configuration]": " Configuración]", - "[Configuration]": "[Configuración]", - "*Configuration*": "*Configuración*", - " Configuration*": " Configuración*", - " Plugins.": " Plugins.", - " Plugins?": " Plugins?", - "Plugins ": "Plugins ", - " Plugins]": " Plugins]", - "[Plugins]": "[Plugins]", - "*Plugins*": "*Plugins*", - " Plugins*": " Plugins*", - " Communication.": " Comunicación.", - " Communication?": " Comunicación?", - "Communication ": "Comunicación ", - " Communication]": " Comunicación]", - "[Communication]": "[Comunicación]", - "*Communication*": "*Comunicación*", - " Communication*": " Comunicación*", - " App.": " App.", - " App?": " App?", - "App ": "App ", - " App]": " App]", - "[App]": "[App]", - "*App*": "*App*", - " App*": " App*", - " Mobile.": " Móvil.", - " Mobile?": " Móvil?", - "Mobile ": "Móvil ", - " Mobile]": " Móvil]", - "[Mobile]": "[Móvil]", - "*Mobile*": "*Móvil*", - " Mobile*": " Móvil*", - " Ajouter.": " Añadir.", - " Ajouter?": " Añadir?", - "Ajouter ": "Añadir ", - " Ajouter]": " Añadir]", - "[Ajouter]": "[Añadir]", - "*Ajouter*": "*Añadir*", - " Ajouter*": " Añadir*", - " Activer.": " Activar.", - " Activer?": " Activar?", - "Activer ": "Activar ", - " Activer]": " Activar]", - "[Activer]": "[Activar]", - "*Activer*": "*Activar*", - " Activer*": " Activar*", - " Utilisateur.": " Usuario.", - " Utilisateur?": " Usuario?", - "Utilisateur ": "Usuario ", - " Utilisateur]": " Usuario]", - "[Utilisateur]": "[Usuario]", - "*Utilisateur*": "*Usuario*", - " Utilisateur*": " Usuario*", - " Tip.": " Punta.", - " Tip?": " Punta?", - "Tip ": "Punta ", - " Tip]": " Punta]", - "[Tip]": "[Punta]", - "*Tip*": "*Punta*", - " Tip*": " Punta*", - " LIGHT.": " LUZ.", - " LIGHT?": " LUZ?", - "LIGHT ": "LUZ ", - " LIGHT]": " LUZ]", - "[LIGHT]": "[LUZ]", - "*LIGHT*": "*LUZ*", - " LIGHT*": " LUZ*", - " ENERGY.": " ENERGÍA.", - " ENERGY?": " ENERGÍA?", - "ENERGY ": "ENERGÍA ", - " ENERGY]": " ENERGÍA]", - "[ENERGY]": "[ENERGÍA]", - "*ENERGY*": "*ENERGÍA*", - " ENERGY*": " ENERGÍA*", - " FLAP.": " SOLAPA.", - " FLAP?": " SOLAPA?", - "FLAP ": "SOLAPA ", - " FLAP]": " SOLAPA]", - "[FLAP]": "[SOLAPA]", - "*FLAP*": "*SOLAPA*", - " FLAP*": " SOLAPA*", - " Inondation.": " Inundación.", - " Inondation?": " Inundación?", - "Inondation ": "Inundación ", - " Inondation]": " Inundación]", - "[Inondation]": "[Inundación]", - "*Inondation*": "*Inundación*", - " Inondation*": " Inundación*", - " FLOOD.": " INUNDACIÓN.", - " FLOOD?": " INUNDACIÓN?", - "FLOOD ": "INUNDACIÓN ", - " FLOOD]": " INUNDACIÓN]", - "[FLOOD]": "[INUNDACIÓN]", - "*FLOOD*": "*INUNDACIÓN*", - " FLOOD*": " INUNDACIÓN*", - " Serrure.": " Bloquear.", - " Serrure?": " Bloquear?", - "Serrure ": "Bloquear ", - " Serrure]": " Bloquear]", - "[Serrure]": "[Bloquear]", - "*Serrure*": "*Bloquear*", - " Serrure*": " Bloquear*", - " LOCK.": " CERRAR.", - " LOCK?": " CERRAR?", - "LOCK ": "CERRAR ", - " LOCK]": " CERRAR]", - "[LOCK]": "[CERRAR]", - "*LOCK*": "*CERRAR*", - " LOCK*": " CERRAR*", - " SIREN.": " SIRENA.", - " SIREN?": " SIRENA?", - "SIREN ": "SIRENA ", - " SIREN]": " SIRENA]", - "[SIREN]": "[SIRENA]", - "*SIREN*": "*SIRENA*", - " SIREN*": " SIRENA*", - " SMOKE.": " FUMAR.", - " SMOKE?": " FUMAR?", - "SMOKE ": "FUMAR ", - " SMOKE]": " FUMAR]", - "[SMOKE]": "[FUMAR]", - "*SMOKE*": "*FUMAR*", - " SMOKE*": " FUMAR*", - " TEMPERATURE.": " Temperatura.", - " TEMPERATURE?": " Temperatura?", - "TEMPERATURE ": "Temperatura ", - " TEMPERATURE]": " Temperatura]", - "[TEMPERATURE]": "[Temperatura]", - "*TEMPERATURE*": "*Temperatura*", - " TEMPERATURE*": " Temperatura*", - " PRESENCE.": " Presencia.", - " PRESENCE?": " Presencia?", - "PRESENCE ": "Presencia ", - " PRESENCE]": " Presencia]", - "[PRESENCE]": "[Presencia]", - "*PRESENCE*": "*Presencia*", - " PRESENCE*": " Presencia*", - " Ouvrant.": " Apertura.", - " Ouvrant?": " Apertura?", - "Ouvrant ": "Apertura ", - " Ouvrant]": " Apertura]", - "[Ouvrant]": "[Apertura]", - "*Ouvrant*": "*Apertura*", - " Ouvrant*": " Apertura*", - " OPENING.": " APERTURA.", - " OPENING?": " APERTURA?", - "OPENING ": "APERTURA ", - " OPENING]": " APERTURA]", - "[OPENING]": "[APERTURA]", - "*OPENING*": "*APERTURA*", - " OPENING*": " APERTURA*", - " HEATING.": " CALEFACCIÓN.", - " HEATING?": " CALEFACCIÓN?", - "HEATING ": "CALEFACCIÓN ", - " HEATING]": " CALEFACCIÓN]", - "[HEATING]": "[CALEFACCIÓN]", - "*HEATING*": "*CALEFACCIÓN*", - " HEATING*": " CALEFACCIÓN*", - " ACTION.": " ACCIÓN.", - " ACTION?": " ACCIÓN?", - "ACTION ": "ACCIÓN ", - " ACTION]": " ACCIÓN]", - "[ACTION]": "[ACCIÓN]", - "*ACTION*": "*ACCIÓN*", - " ACTION*": " ACCIÓN*", - " INFO.": " INFORMACIÓN.", - " INFO?": " INFORMACIÓN?", - "INFO ": "INFORMACIÓN ", - " INFO]": " INFORMACIÓN]", - "[INFO]": "[INFORMACIÓN]", - "*INFO*": "*INFORMACIÓN*", - " INFO*": " INFORMACIÓN*", - " Troubleshooting.": " Solución de problemas.", - " Troubleshooting?": " Solución de problemas?", - "Troubleshooting ": "Solución de problemas ", - " Troubleshooting]": " Solución de problemas]", - "[Troubleshooting]": "[Solución de problemas]", - "*Troubleshooting*": "*Solución de problemas*", - " Troubleshooting*": " Solución de problemas*", - " telephone.": " Teléfono.", - " telephone?": " Teléfono?", - "telephone ": "Teléfono ", - " telephone]": " Teléfono]", - "[telephone]": "[Teléfono]", - "*telephone*": "*Teléfono*", - " telephone*": " Teléfono*" + " ACCUEIL.": " ACCUEIL.", + " ACCUEIL?": " ACCUEIL?", + "ACCUEIL ": "ACCUEIL ", + " ACCUEIL]": " ACCUEIL]", + "[ACCUEIL]": "[ACCUEIL]", + "*ACCUEIL*": "*ACCUEIL*", + " ACCUEIL*": " ACCUEIL*" } } \ No newline at end of file diff --git a/docs/i18n/fr_FR.json b/docs/i18n/fr_FR.json index da3850da..0d21e808 100755 --- a/docs/i18n/fr_FR.json +++ b/docs/i18n/fr_FR.json @@ -3,18 +3,49 @@ "Changelog App Mobile": "Changelog App Mobile", "IMPORTANT": "IMPORTANT", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte", + "08\/07\/2025": "08\/07\/2025", + "Mise à jour de la doc sur droits utilisateurs partagés": "Mise à jour de la doc sur droits utilisateurs partagés", + "18\/06\/2025": "18\/06\/2025", + "Ajout alerte si api mobile désactivée ou IP blanche": "Ajout alerte si api mobile désactivée ou IP blanche", + "25\/04\/2025": "25\/04\/2025", + "Ajout pour Max 8 Icones sur le menuCustom": "Ajout pour Max 8 Icones sur le menuCustom", + "24\/04\/2025": "24\/04\/2025", + "Ajout Commande Notifications Silencieuses pour Builds": "Ajout Commande Notifications Silencieuses pour Builds", + "IOS 491 et Android 875": "IOS 491 et Android 875", + "11\/04\/2025": "11\/04\/2025", + "Ajout paramètre Envoi NFC Direct au plugin après lecture": "Ajout paramètre Envoi NFC Direct au plugin après lecture", + "xx\/08\/2024": "xx\/08\/2024", + "App V1": "App V1", + "Attention, à partir de cette version, l'appV1 n'est plus prise en charge": "Attention, à partir de cette version, l'appV1 n'est plus prise en charge", + "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification": "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification", + "Suppression des fichiers concernant l'AppV1": "Suppression des fichiers concernant l'AppV1", + "Nettoyage des infos stockées en BDD (config": "Nettoyage des infos stockées en BDD (config", + "20\/08\/2024": "20\/08\/2024", + "Déplacement des infos notifications dans l'onglet \"Mobile": "Déplacement des infos notifications dans l'onglet \"Mobile", + "04\/08\/2024": "04\/08\/2024", + "Prise en compte rétention des notifications pour suppression des images": "Prise en compte rétention des notifications pour suppression des images", + "22\/07\/2024": "22\/07\/2024", + "Prise en compte rétention des notifications": "Prise en compte rétention des notifications", + "Target Sdk 34 pour Android": "Target Sdk 34 pour Android", + "28\/05\/2024": "28\/05\/2024", + "Modification Géolocalisation pour prochaine version App": "Modification Géolocalisation pour prochaine version App", + "Stockage Notifications dans le plugin": "Stockage Notifications dans le plugin", + "Nouvelles Api pour l'application": "Nouvelles Api pour l'application", + "05\/04\/2024": "05\/04\/2024", + "Compatible uniquement avec la 4": "Compatible uniquement avec la 4", + "4 du Core ou supérieur": "4 du Core ou supérieur", "15\/12\/2023": "15\/12\/2023", "Attention": "Attention", "Refactorisation importante du code": "Refactorisation importante du code", - "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré": "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré", + "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré": "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré", "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout": "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout", "22\/10\/2023": "22\/10\/2023", - "Fix mise à jour geolocalisation de l'app v2": "Fix mise à jour geolocalisation de l'app v2", + "Fix mise à jour géolocalisation de l'app v2": "Fix mise à jour géolocalisation de l'app v2", "12\/10\/2023": "12\/10\/2023", "Mise à jour pour prendre en compte la nouvelle Application mobile": "Mise à jour pour prendre en compte la nouvelle Application mobile", "09\/06\/2023": "09\/06\/2023", "Fix Notifications": "Fix Notifications", - "Ajout Affichage Equipements par Tableau": "Ajout Affichage Equipements par Tableau", + "Ajout Affichage Équipements par Tableau": "Ajout Affichage Équipements par Tableau", "19\/05\/2023": "19\/05\/2023", "PR by PhpVarious": "PR by PhpVarious", "Fix bugs mineurs": "Fix bugs mineurs", @@ -26,9 +57,9 @@ "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE": "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE", "Nouvelle Interface Future AppV2": "Nouvelle Interface Future AppV2", "Modale Custom Menu Future AppV2": "Modale Custom Menu Future AppV2", - "Modale QrCode Future AppV2": "Modale QrCode Future AppV2", + "Modale QR Code Future AppV2": "Modale QR Code Future AppV2", "13\/12\/2021": "13\/12\/2021", - "Mode offline pour le QrCode (creation du QrCode sans internet": "Mode offline pour le QrCode (creation du QrCode sans internet", + "Mode offline pour le QR Code (création du QR Code sans internet": "Mode offline pour le QR Code (création du QR Code sans internet", "Compatibilité 4": "Compatibilité 4", "2 Jeedom Core": "2 Jeedom Core", "11\/10\/2021": "11\/10\/2021", @@ -40,280 +71,94 @@ "Ajout des images (Cameras, Rapports etc...) pour Android": "Ajout des images (Cameras, Rapports etc...) pour Android", "Prise en charge de la version 1.4": "Prise en charge de la version 1.4", "1 de l'app Android": "1 de l'app Android", - "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1", + "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1", "17\/02\/2021": "17\/02\/2021", "Ajout de l'id de groupe pour les notifications Android": "Ajout de l'id de groupe pour les notifications Android", - "Icones présentes pour les pièces dans la presentation": "Icones présentes pour les pièces dans la presentation", + "Icones présentes pour les pièces dans la présentation": "Icones présentes pour les pièces dans la présentation", "15\/04\/2020": "15\/04\/2020", - "Ajouts des Commandes de chaques mobile": "Ajouts des Commandes de chaques mobile", + "Ajouts des Commandes de chaque mobile": "Ajouts des Commandes de chaque mobile", "31\/03\/2020": "31\/03\/2020", "Correction d'un bug sur l'envoi de notification sur certain Jeedom": "Correction d'un bug sur l'envoi de notification sur certain Jeedom", "19\/02\/2020": "19\/02\/2020", - "fix http": "fix http", - "error ligne 39 si téléphone non authentifié a la premiere connexion": "error ligne 39 si téléphone non authentifié a la premiere connexion", + "Fix http": "Fix http", + "error ligne 39 si téléphone non authentifier à la première connexion": "error ligne 39 si téléphone non authentifier à la première connexion", "v1.3.0": "v1.3.0", "Notification ASK": "Notification ASK", "Historique des notifications": "Historique des notifications", "Slider avec pourcentage": "Slider avec pourcentage", - "grosse modification de la synchronisation": "grosse modification de la synchronisation", - "suppression du push to refresh": "suppression du push to refresh" + "Modification de la synchronisation": "Modification de la synchronisation", + "Suppression du push to refresh": "Suppression du push to refresh" }, "index.md": { - " ": " ", - "`Information Générique`          ": "`Information Générique`          ", - "`GENERIC_INFO`": "`GENERIC_INFO`", - "Le bouton prend la forme du type de l'info": "Le bouton prend la forme du type de l'info", - "Image": "Image", - "type générique": "type générique", - "Partie Dev plugin": "Partie Dev plugin", - "Description": "Description", - "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc": "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc", - "`Action Générique`          ": "`Action Générique`          ", - "`GENERIC_ACTION`": "`GENERIC_ACTION`", - "Le bouton prend la forme du type de l'action": "Le bouton prend la forme du type de l'action", - "`HEATING_OTHER`": "`HEATING_OTHER`", - "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max": "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max", - "`Chauffage fil pilote bouton`(optionnel": "`Chauffage fil pilote bouton`(optionnel", - "`HEATING_ON`": "`HEATING_ON`", - "`Chauffage fil pilote Bouton ON`": "`Chauffage fil pilote Bouton ON`", - "`TEMPERATURE`(optionnel": "`TEMPERATURE`(optionnel", - "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte": "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte", - "`Température`(optionnel": "`Température`(optionnel", - "`OPENING \/ OPENING_WINDOW`": "`OPENING \/ OPENING_WINDOW`", - "`Porte \/ Fenêtre`": "`Porte \/ Fenêtre`", - "`SABOTAGE`(optionnel": "`SABOTAGE`(optionnel", - "Voir image": "Voir image", - "`Sabotage`(optionnel": "`Sabotage`(optionnel", - "`PRESENCE`": "`PRESENCE`", - "`Présence`": "`Présence`", - "`HUMIDITY`(optionnel": "`HUMIDITY`(optionnel", - "Voir Image": "Voir Image", - "`Humidité`(optionnel": "`Humidité`(optionnel", - "`TEMPERATURE`": "`TEMPERATURE`", - "`Température`": "`Température`", - "Permet d'avoir son capteur de fumée complet sur une seule ligne": "Permet d'avoir son capteur de fumée complet sur une seule ligne", - "`SMOKE`": "`SMOKE`", - "`Fumée`": "`Fumée`", - "`SIREN_OFF`": "`SIREN_OFF`", - "Retour d'état présent, le bouton de gauche permet de switcher entre on et off": "Retour d'état présent, le bouton de gauche permet de switcher entre on et off", - "`Sirène Bouton Off`": "`Sirène Bouton Off`", - "`SIREN_STATE`": "`SIREN_STATE`", - "`Sirène Etat`": "`Sirène Etat`", - "`LOCK_CLOSE`": "`LOCK_CLOSE`", - "`Serrure Bouton Fermer`": "`Serrure Bouton Fermer`", - "`LOCK_STATE`": "`LOCK_STATE`", - "`Serrure Etat`": "`Serrure Etat`", - "Permet d'avoir son capteur d'inondation complet sur une seule ligne": "Permet d'avoir son capteur d'inondation complet sur une seule ligne", - "`FLOOD`": "`FLOOD`", - "`Innondation`": "`Innondation`", - "`FLAP_SLIDER`": "`FLAP_SLIDER`", - "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état": "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état", - "`Volet Bouton Slider`": "`Volet Bouton Slider`", - "`FLAP_UP`": "`FLAP_UP`", - "`Volet Bouton Monter`": "`Volet Bouton Monter`", - "`FLAP_STATE`(optionnel": "`FLAP_STATE`(optionnel", - "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel": "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel", - "`Volet Etat`(optionnel": "`Volet Etat`(optionnel", - "`ENERGY_SLIDER`": "`ENERGY_SLIDER`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité": "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité", - "`Prise Slider`": "`Prise Slider`", - "`ENERGY_ON`": "`ENERGY_ON`", - "`Prise Bouton On`": "`Prise Bouton On`", - "`ENERGY_STATE`": "`ENERGY_STATE`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off": "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off", - "`Prise Etat`": "`Prise Etat`", - "`ENERGY_OFF`": "`ENERGY_OFF`", - "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état": "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état", - "`Prise Bouton Off`": "`Prise Bouton Off`", - "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode": "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode", - "`LIGHT_MODE`": "`LIGHT_MODE`", - "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue": "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue", - "`LIGHT_ON`": "`LIGHT_ON`", - "`Lumière Bouton On`": "`Lumière Bouton On`", - "`LIGHT_SLIDER`": "`LIGHT_SLIDER`", - "`Lumière Slider`": "`Lumière Slider`", - "`LIGHT_STATE`": "`LIGHT_STATE`", - "`Lumière Etat`": "`Lumière Etat`", - "`LIGHT_TOGGLE`": "`LIGHT_TOGGLE`", - "`Lumière Bouton Toggle`": "`Lumière Bouton Toggle`", - "`LIGHT_OFF`": "`LIGHT_OFF`", - "`Lumière Bouton Off`": "`Lumière Bouton Off`", "Plugin Mobile": "Plugin Mobile", - "Plugin permettant d'utiliser l'application Mobile Jeedom": "Plugin permettant d'utiliser l'application Mobile Jeedom", - "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile": "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile", - "Configuration du plugin Mobile pour Application V2": "Configuration du plugin Mobile pour Application V2", - "Après installation du plugin, il vous suffit de l'activer": "Après installation du plugin, il vous suffit de l'activer", - "Premiere connexion à l'application V2": "Premiere connexion à l'application V2", - "Pour connecter votre téléphone": "Pour connecter votre téléphone", - "il y a 2 méthodes possible;": "il y a 2 méthodes possible;", - "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box": "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box", + "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom": "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom", + "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin": "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin", + "Configuration du plugin Mobile pour l'application V2": "Configuration du plugin Mobile pour l'application V2", + "Après avoir installé le plugin, activez-le simplement": "Après avoir installé le plugin, activez-le simplement", + "Première connexion à l'application V2": "Première connexion à l'application V2", + "Pour connecter votre téléphone, deux méthodes sont disponibles": "Pour connecter votre téléphone, deux méthodes sont disponibles", + "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement": "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement", "IMPORTANT": "IMPORTANT", - "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4": "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4", - "0 minimum": "0 minimum", - "CONNEXION VIA LE COMPTE MARKET": "CONNEXION VIA LE COMPTE MARKET", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe": "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe", - "CONNEXION VIA BOX ID": "CONNEXION VIA BOX ID", - "Plusieurs choix sur cet écran": "Plusieurs choix sur cet écran", - "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION", - "Vous cliquez sur QR Code": "Vous cliquez sur QR Code", - "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin": "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin", - "Onglet Qr Code du plugin Mobile": "Onglet Qr Code du plugin Mobile", - "v2ModalPlugin": "v2ModalPlugin", - "Une fois cette premiere étape passée, vous êtes enregistré dans l'application": "Une fois cette premiere étape passée, vous êtes enregistré dans l'application", - "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu": "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu", - "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market": "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market", - "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box": "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box", - "La box passera en haut de la liste, ayant validée son authentification": "La box passera en haut de la liste, ayant validée son authentification", - "Vous pouvez faire ainsi pour plusieurs boxs": "Vous pouvez faire ainsi pour plusieurs boxs", - "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;": "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;", - "QrCode pour ajouter une box à la liste via le plugin Mobile": "QrCode pour ajouter une box à la liste via le plugin Mobile", - "Manuel pour ajouter manuellement une box": "Manuel pour ajouter manuellement une box", - "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau": "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau", - "Synchronisation Market pour actualiser les informations du compte Market configuré": "Synchronisation Market pour actualiser les informations du compte Market configuré", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle", - "Fonctionnement de la Géolocalisation": "Fonctionnement de la Géolocalisation", - "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +": "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +", - "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée": "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée", - "Nous pouvons ensuite ajouter un nom et sauvegarder la zone": "Nous pouvons ensuite ajouter un nom et sauvegarder la zone", - "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile": "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile", - "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone": "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone", + "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4": "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4", + "0 ou supérieure": "0 ou supérieure", + "Connexion via le compte Market": "Connexion via le compte Market", + "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter": "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter", + "Connexion via l'ID de la Box": "Connexion via l'ID de la Box", + "Sur cet écran, plusieurs options s'offrent à vous": "Sur cet écran, plusieurs options s'offrent à vous", + "CONNEXION": "CONNEXION", + "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton": "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton", + "QR Code": "QR Code", + "Cliquez sur": "Cliquez sur", + "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter": "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter", + "Onglet QR Code du plugin Mobile": "Onglet QR Code du plugin Mobile", + "Une fois cette étape terminée, vous êtes enregistré dans l'application": "Une fois cette étape terminée, vous êtes enregistré dans l'application", + "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu": "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu", + "Boxs": "Boxs", + "Dans le menu, un onglet": "Dans le menu, un onglet", + "regroupe toutes les Box associées à votre compte Market": "regroupe toutes les Box associées à votre compte Market", + "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder": "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder", + "La Box validée apparaîtra en haut de la liste": "La Box validée apparaîtra en haut de la liste", + "Vous pouvez répéter cette opération pour plusieurs Box": "Vous pouvez répéter cette opération pour plusieurs Box", + "+": "+", + "En cliquant sur le bouton": "En cliquant sur le bouton", + "en bas à droite, vous accédez à différentes options": "en bas à droite, vous accédez à différentes options", + "Ajouter une Box via un QR Code (depuis le plugin Mobile": "Ajouter une Box via un QR Code (depuis le plugin Mobile", + "Ajouter une Box manuellement": "Ajouter une Box manuellement", + "Détecter les Box Atlas et Luna sur le réseau Wi-Fi": "Détecter les Box Atlas et Luna sur le réseau Wi-Fi", + "Synchroniser les informations de votre compte Market": "Synchroniser les informations de votre compte Market", + "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle": "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle", + "Fonctionnement de la géolocalisation": "Fonctionnement de la géolocalisation", + "Ajoutez une zone de géolocalisation en cliquant sur l'icône": "Ajoutez une zone de géolocalisation en cliquant sur l'icône", + "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone": "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone", + "Le curseur se positionnera automatiquement sur l'adresse": "Le curseur se positionnera automatiquement sur l'adresse", + "Vous pouvez ensuite nommer et sauvegarder la zone": "Vous pouvez ensuite nommer et sauvegarder la zone", + "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone": "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone", + "Vous pouvez également ajuster le rayon de la zone pour élargir la détection": "Vous pouvez également ajuster le rayon de la zone pour élargir la détection", + "Éditer": "Éditer", + "Pour supprimer une zone, cliquez sur": "Pour supprimer une zone, cliquez sur", + "puis sur l'icône Corbeille": "puis sur l'icône Corbeille", + "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box": "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box", + "Paramètres de l'application": "Paramètres de l'application", + "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur": "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur", + "Par défaut, elles sont réglées sur 5 secondes": "Par défaut, elles sont réglées sur 5 secondes", "FAQ": "FAQ", + "Mon mobile ne possède pas d'IQ (identifiant unique": "Mon mobile ne possède pas d'IQ (identifiant unique", + "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier": "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier", + "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application": "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application", + "Une alerte vous indiquera que la récupération de l'IQ est en cours": "Une alerte vous indiquera que la récupération de l'IQ est en cours", "J'ai des soucis avec les notifications": "J'ai des soucis avec les notifications", - "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta": "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta", + "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application": "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application", "J'ai des soucis d'affichage de ma webview": "J'ai des soucis d'affichage de ma webview", - "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL": "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL", - "Configuration du plugin Mobile V1": "Configuration du plugin Mobile V1", - "Configuration": "Configuration", - "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom": "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom", - "Plugins": "Plugins", - "Communication": "Communication", - "Pour Ajouter un téléphone": "Pour Ajouter un téléphone", - "→": "→", - "App": "App", - "Mobile": "Mobile", - "Ajouter": "Ajouter", - "Voici les paramètres à renseigner": "Voici les paramètres à renseigner", - "Nom de l'équipement mobile": "Nom de l'équipement mobile", - "Nom du téléphone": "Nom du téléphone", - "Activer": "Activer", - "Activation de l'accès pour ce mobile": "Activation de l'accès pour ce mobile", - "Type de Mobile": "Type de Mobile", - "Sélection de l'OS du téléphone (iOS, Android": "Sélection de l'OS du téléphone (iOS, Android", - "Utilisateur": "Utilisateur", - "Utilisateur associé à cet accès": "Utilisateur associé à cet accès", - "Tip": "Tip", - "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits": "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits", - "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule": "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule", - "Configuration des plugins et commandes que reçoit l'app": "Configuration des plugins et commandes que reçoit l'app", - "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces": "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces", - "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes": "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes", - "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes": "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes", - "Configuration de l'application Mobile": "Configuration de l'application Mobile", - "Vous trouverez les applications sur les stores mobiles": "Vous trouverez les applications sur les stores mobiles", - "Android Google Play": "Android Google Play", - "Apple App Store": "Apple App Store", - "Premier lancement de l'app": "Premier lancement de l'app", - "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci": "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci", - "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone": "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone", - "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre": "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre", - "Certaines étapes ont étés faites précédemment": "Certaines étapes ont étés faites précédemment", - "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode": "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode", - "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment": "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment", - "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement": "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement", - "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau": "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau", - "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez": "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez", - "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom": "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom", - "Cette option est réservée à un public averti": "Cette option est réservée à un public averti", - "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation": "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation", - "L'application mobile Jeedom est maintenant prête à fonctionner": "L'application mobile Jeedom est maintenant prête à fonctionner", - "Les Favoris": "Les Favoris", - "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios": "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios", - "Voici donc la marche à suivre pour en créer": "Voici donc la marche à suivre pour en créer", - "Cliquez sur un des + sur l'écran d'accueil de l'application": "Cliquez sur un des + sur l'écran d'accueil de l'application", - "Vous arriverez sur la page de sélection du type de raccourci": "Vous arriverez sur la page de sélection du type de raccourci", - "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets": "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets", - "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci": "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci", - "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées": "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées", - "Ainsi que les deux textes associés": "Ainsi que les deux textes associés", - "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1": "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1", - "1 il est prévu que les commandes On\/Off apparaissent sur la même touche": "1 il est prévu que les commandes On\/Off apparaissent sur la même touche", - "Comment bien configurer ses types génériques": "Comment bien configurer ses types génériques", - "Les Génériques Types dans le plugin Mobile": "Les Génériques Types dans le plugin Mobile", - "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas": "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas", - "Tableaux des templates de l'application": "Tableaux des templates de l'application", - "Les Lumières": "Les Lumières", - "LIGHT": "LIGHT", - "`Lumière Couleur (info)`": "`Lumière Couleur (info)`", - "`Lumière Couleur (action)`": "`Lumière Couleur (action)`", - "`LIGHT_COLOR`": "`LIGHT_COLOR`", - "`LIGHT_SET_COLOR`": "`LIGHT_SET_COLOR`", - "Les Prises": "Les Prises", - "ENERGY": "ENERGY", - "Les Volets": "Les Volets", - "FLAP": "FLAP", - "`Volet Bouton Descendre`": "`Volet Bouton Descendre`", - "`Volet Bouton Stop`": "`Volet Bouton Stop`", - "`FLAP_DOWN`": "`FLAP_DOWN`", - "`FLAP_STOP`": "`FLAP_STOP`", - "`Volet Etat`": "`Volet Etat`", - "`FLAP_STATE`": "`FLAP_STATE`", - "Inondation": "Inondation", - "FLOOD": "FLOOD", - "Serrure": "Serrure", - "LOCK": "LOCK", - "`Serrure Bouton Ouvrir`": "`Serrure Bouton Ouvrir`", - "`LOCK_OPEN`": "`LOCK_OPEN`", - "Sirène": "Sirène", - "SIREN": "SIREN", - "`Sirène Bouton On`": "`Sirène Bouton On`", - "`SIREN_ON`": "`SIREN_ON`", - "Fumée": "Fumée", - "SMOKE": "SMOKE", - "Température": "Température", - "TEMPERATURE": "TEMPERATURE", - "Présence": "Présence", - "PRESENCE": "PRESENCE", - "`Luminosité`(optionnel": "`Luminosité`(optionnel", - "`UV`(optionnel": "`UV`(optionnel", - "`BRIGHTNESS`(optionnel": "`BRIGHTNESS`(optionnel", - "Ouvrant": "Ouvrant", - "OPENING": "OPENING", - "Fil pilote": "Fil pilote", - "HEATING": "HEATING", - "`Chauffage fil pilote bouton OFF`": "`Chauffage fil pilote bouton OFF`", - "`Chauffage fil pilote Etat`": "`Chauffage fil pilote Etat`", - "`HEATING_OFF`": "`HEATING_OFF`", - "`HEATING_STATE`": "`HEATING_STATE`", - "LES JOKERS": "LES JOKERS", - "Générique Action": "Générique Action", - "ACTION": "ACTION", - "Générique Info": "Générique Info", - "INFO": "INFO", - "Troubleshooting": "Troubleshooting", - "Je suis sur Android version de l'app (1.0": "Je suis sur Android version de l'app (1.0", - "1 ou 1.0": "1 ou 1.0", - "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app": "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app", - "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option": "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option", - "Un correctif sera apporté prochainement sur l'app": "Un correctif sera apporté prochainement sur l'app", - "J'ai un message dans une des lignes de mes modules me disant qu'il": "J'ai un message dans une des lignes de mes modules me disant qu'il", - "manque un Type Générique": "manque un Type Générique", - "doc chapitre Type Générique": "doc chapitre Type Générique", - "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible": "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible", - "Il suffit juste de l'appliquer": "Il suffit juste de l'appliquer", - "Reportez-vous à la": "Reportez-vous à la", - "J'ai un souci sur un des plugins dit complètement intégré (météo": "J'ai un souci sur un des plugins dit complètement intégré (météo", - "thermostat, alarme, caméra": "thermostat, alarme, caméra", - "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module": "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module", - "Impossible de mettre une info sur l'accueil de l'app": "Impossible de mettre une info sur l'accueil de l'app", - "Cela est normal, ça sera disponible sur la version 1.1": "Cela est normal, ça sera disponible sur la version 1.1", - "J'ai l'application qui prend enormement de memoire dans mon": "J'ai l'application qui prend enormement de memoire dans mon", - "telephone": "telephone", - "Il y avait un bug sur les versions 1.0": "Il y avait un bug sur les versions 1.0", - "0 et 1.0": "0 et 1.0", - "1 sur la partie Camera": "1 sur la partie Camera", - "Le souci ne ce reproduira plus avec la 1.0": "Le souci ne ce reproduira plus avec la 1.0", - "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache": "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache", - "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile": "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile", - "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut": "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut" + "ACCUEIL": "ACCUEIL", + "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur": "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur", + "Je souhaite partager mes droits mobile sans communiquer mon compte Market": "Je souhaite partager mes droits mobile sans communiquer mon compte Market", + "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application": "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application", + "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc": "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc", + "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone": "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone", + "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile": "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile", + "Un code à 6 chiffres sera alors généré": "Un code à 6 chiffres sera alors généré", + "Il devra le saisir sur le mobile possédant le compte Market, au même endroit": "Il devra le saisir sur le mobile possédant le compte Market, au même endroit", + "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction": "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction", + "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé": "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé" } } \ No newline at end of file diff --git a/docs/i18n/pt_PT.json b/docs/i18n/pt_PT.json index 2b1f6b02..82d04680 100755 --- a/docs/i18n/pt_PT.json +++ b/docs/i18n/pt_PT.json @@ -2,17 +2,47 @@ "changelog.md": { "Changelog App Mobile": "Changelog Mobile App", "Pour rappel s'il n'y a pas d'information sur la mise à jour, c'est que celle-ci concerne uniquement de la mise à jour de documentation, de traduction ou de texte": "Como lembrete, se não houver informações sobre a atualização, isso significa que se trata apenas da atualização da documentação, tradução ou texto", + "08\/07\/2025": "", + "Mise à jour de la doc sur droits utilisateurs partagés": "", + "18\/06\/2025": "18\/06\/2025", + "Ajout alerte si api mobile désactivée ou IP blanche": "Ajout alerte si api mobile désactivée ou IP blanche", + "25\/04\/2025": "25\/04\/2025", + "Ajout pour Max 8 Icones sur le menuCustom": "Ajout pour Max 8 Icones sur le menuCustom", + "24\/04\/2025": "24\/04\/2025", + "Ajout Commande Notifications Silencieuses pour Builds": "Ajout Commande Notifications Silencieuses pour Builds", + "IOS 491 et Android 875": "IOS 491 et Android 875", + "11\/04\/2025": "11\/04\/2025", + "Ajout paramètre Envoi NFC Direct au plugin après lecture": "Ajout paramètre Envoi NFC Direct au plugin après lecture", + "App V1": "Aplicativo V1", + "Attention, à partir de cette version, l'appV1 n'est plus prise en charge": "Observe que a partir desta versão o appV1 não é mais compatível", + "Il sera toujours possible d'accéder à votre équipement, pour éventuellement, remplacer vos commandes de géolocalisation et de notification": "Será sempre possível aceder ao seu equipamento, para eventualmente substituir os seus comandos de geolocalização e notificação", + "Suppression des fichiers concernant l'AppV1": "Excluindo arquivos AppV1", + "Nettoyage des infos stockées en BDD (config": "Limpeza de informações armazenadas no banco de dados (config", + "20\/08\/2024": "20\/08\/2024", + "Déplacement des infos notifications dans l'onglet \"Mobile": "Movendo informações de notificação para a guia “Celular”", + "04\/08\/2024": "08\/04\/2024", + "Prise en compte rétention des notifications pour suppression des images": "Levando em consideração a retenção de notificações para exclusão de imagens", + "22\/07\/2024": "22\/07\/2024", + "Prise en compte rétention des notifications": "Tendo em conta a retenção de notificações", + "Target Sdk 34 pour Android": "Destino SDK 34 para Android", + "28\/05\/2024": "28\/05\/2024", + "Modification Géolocalisation pour prochaine version App": "Modificação de geolocalização para próxima versão do aplicativo", + "Stockage Notifications dans le plugin": "Notificações de armazenamento no plugin", + "Nouvelles Api pour l'application": "Novas APIs para o aplicativo", + "05\/04\/2024": "05\/04\/2024", + "Compatible uniquement avec la 4": "Compatível apenas com o 4", + "4 du Core ou supérieur": "4 núcleos ou superior", "15\/12\/2023": "15\/12\/2023", "Refactorisation importante du code": "Refatoração significativa de código", - "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus etre enregistré": "o menu Personalizado salvo anteriormente no appV2 não poderá mais ser salvo", + "le menu Custom préalablement enregistré sur l'appV2 est susceptible de ne plus être enregistré": "o menu Personalizado salvo anteriormente no appV2 não poderá mais ser salvo", "Une fonction pour enregistrer les menus dans le plugin est en cours d'ajout": "Uma função para salvar menus no plugin está sendo adicionada", "22\/10\/2023": "22\/10\/2023", - "Fix mise à jour geolocalisation de l'app v2": "Corrigir atualização de geolocalização do aplicativo v2", + "Fix mise à jour géolocalisation de l'app v2": "Corrigir atualização de geolocalização do aplicativo v2", "12\/10\/2023": "10\/12\/2023", "Mise à jour pour prendre en compte la nouvelle Application mobile": "Atualizado para levar em conta o novo aplicativo móvel", "09\/06\/2023": "06\/09\/2023", "Fix Notifications": "Consertar Notificações", - "Ajout Affichage Equipements par Tableau": "Adição de exibição de equipamentos por tabela", + "Ajout Affichage Équipements par Tableau": "Adição de exibição de equipamentos por tabela", "19\/05\/2023": "19\/05\/2023", "PR by PhpVarious": "PR por PhpVarious", "Fix bugs mineurs": "Corrigir pequenos bugs", @@ -24,9 +54,9 @@ "FUTURE APPV2 ALPHA INTEGRATION DANS PLUGIN MOBILE": "FUTURA INTEGRAÇÃO APPV2 ALPHA EM PLUGIN MÓVEL", "Nouvelle Interface Future AppV2": "Nova Interface Futuro AppV2", "Modale Custom Menu Future AppV2": "Menu Personalizado Modal Futuro AppV2", - "Modale QrCode Future AppV2": "Modal QrCode Future AppV2", + "Modale QR Code Future AppV2": "Código QR Modal Futuro AppV2", "13\/12\/2021": "13\/12\/2021", - "Mode offline pour le QrCode (creation du QrCode sans internet": "Modo offline para QrCode (criação de QrCode sem internet", + "Mode offline pour le QR Code (création du QR Code sans internet": "Modo offline para o QR Code (criação do QR Code sem internet", "Compatibilité 4": "Compatibilidade 4", "2 Jeedom Core": "2 Jeedom Core", "11\/10\/2021": "11\/10\/2021", @@ -38,23 +68,23 @@ "Ajout des images (Cameras, Rapports etc...) pour Android": "Adicionando imagens (câmeras, relatórios etc ...) para Android", "Prise en charge de la version 1.4": "Suporte para versão 1.4", "1 de l'app Android": "1 do aplicativo Android", - "Prise en charge des emoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Suporte para emoticons e quebras de linha com a nova versão do Android 1.4.1", + "Prise en charge des émoticons et des retour a la ligne avec la nouvelle version Android 1.4.1": "Suporte para emoticons e quebras de linha com a nova versão do Android 1.4.1", "17\/02\/2021": "17\/02\/2021", "Ajout de l'id de groupe pour les notifications Android": "Adicionado id de grupo para notificações Android", - "Icones présentes pour les pièces dans la presentation": "Ícones presentes para as partes da apresentação", + "Icones présentes pour les pièces dans la présentation": "Ícones presentes para as partes da apresentação", "15\/04\/2020": "15\/04\/2020", - "Ajouts des Commandes de chaques mobile": "Adição de pedidos para cada celular", + "Ajouts des Commandes de chaque mobile": "Comandos adicionados para cada celular", "31\/03\/2020": "31\/03\/2020", "Correction d'un bug sur l'envoi de notification sur certain Jeedom": "Correção de um bug no envio de notificação em determinados Jeedom", "19\/02\/2020": "19\/02\/2020", - "fix http": "corrigir http", - "error ligne 39 si téléphone non authentifié a la premiere connexion": "linha de erro 39 se o telefone não estiver autenticado na primeira conexão", + "Fix http": "Corrigir http", + "error ligne 39 si téléphone non authentifier à la première connexion": "linha de erro 39 se o telefone não for autenticado na primeira conexão", "v1.3.0": "v1.3.0", "Notification ASK": "ASK notificação", "Historique des notifications": "Histórico de notificações", "Slider avec pourcentage": "Controle deslizante com porcentagem", - "grosse modification de la synchronisation": "grande mudança no tempo", - "suppression du push to refresh": "remoção do push para atualizar", + "Modification de la synchronisation": "Mudando o tempo", + "Suppression du push to refresh": "Remoção do push para atualizar", " IMPORTANT.": " IMPORTANTE.", " IMPORTANT?": " IMPORTANTE?", "IMPORTANT ": "IMPORTANTE ", @@ -62,6 +92,13 @@ "[IMPORTANT]": "[IMPORTANTE]", "*IMPORTANT*": "*IMPORTANTE*", " IMPORTANT*": " IMPORTANTE*", + " xx\/08\/2024.": " xx\/08\/2024.", + " xx\/08\/2024?": " xx\/08\/2024?", + "xx\/08\/2024 ": "xx\/08\/2024 ", + " xx\/08\/2024]": " xx\/08\/2024]", + "[xx\/08\/2024]": "[xx\/08\/2024]", + "*xx\/08\/2024*": "*xx\/08\/2024*", + " xx\/08\/2024*": " xx\/08\/2024*", " Attention.": " Atenção.", " Attention?": " Atenção?", "Attention ": "Atenção ", @@ -71,275 +108,70 @@ " Attention*": " Atenção*" }, "index.md": { - " ": " ", - "`Information Générique`          ": "`Informações Genéricas`", - "`GENERIC_INFO`": "`GENERIC_INFO`", - "Le bouton prend la forme du type de l'info": "O botão assume a forma do tipo de informação", - "type générique": "Tipo genérico", - "Partie Dev plugin": "Parte do plugin Dev", - "Par défaut c'est un toggle, si c'est un message alors vous avez une enveloppe, si slider vous avez un slider etc": "Por padrão, é uma alternância, se for uma mensagem, então você tem um envelope, se for um controle deslizante, você tem um controle deslizante, etc", - "`Action Générique`          ": "`Ação Genérica`", - "`GENERIC_ACTION`": "`GENERIC_ACTION`", - "Le bouton prend la forme du type de l'action": "O botão assume a forma do tipo de ação", - "`HEATING_OTHER`": "`HEATING_OTHER`", - "Les boutons ON\/OFF et Etat permette de créer le bouton tout à gauche du template et les `chauffage fil pilote Bouton`sont là pour rajouter des boutons (5 max": "Os botões ON \/ OFF e Status permitem criar o botão na extrema esquerda do modelo e os `fios de aquecimento do botão piloto 'existem para adicionar botões (5 no máximo", - "`Chauffage fil pilote bouton`(optionnel": "`Aquecimento do fio piloto de botão` (opcional", - "`HEATING_ON`": "`HEATING_ON`", - "`Chauffage fil pilote Bouton ON`": "`Botão LIGADO do aquecimento do fio piloto`", - "`TEMPERATURE`(optionnel": "`TEMPERATURE` (opcional", - "Voir Image (à savoir que vous pouvez choisir entre fenêtre et porte": "Consulte Imagem (ou seja, você pode escolher entre janela e porta", - "`Température`(optionnel": "`TEMPERATURE` (opcional", - "`OPENING \/ OPENING_WINDOW`": "`OPENING \/ OPENING_WINDOW`", - "`Porte \/ Fenêtre`": "`Porta\/Janela`", - "`SABOTAGE`(optionnel": "`SABOTAGE` (opcional", - "Voir image": "Veja a imagem", - "`Sabotage`(optionnel": "`SABOTAGE` (opcional", - "`Présence`": "PRESENÇA", - "`HUMIDITY`(optionnel": "«UMIDADE» (opcional", - "Voir Image": "Veja a imagem", - "`Humidité`(optionnel": "Humidade (opcional", - "`Température`": "TEMPERATURA", - "Permet d'avoir son capteur de fumée complet sur une seule ligne": "Permite que você tenha seu sensor de fumaça completo em uma única linha", - "`Fumée`": "`Fumaça`", - "`SIREN_OFF`": "`SIREN_OFF`", - "Retour d'état présent, le bouton de gauche permet de switcher entre on et off": "Feedback de status presente, o botão esquerdo alterna entre ligado e desligado", - "`Sirène Bouton Off`": "`Botão da sirene desativado`", - "`SIREN_STATE`": "`SIREN_STATE`", - "`Sirène Etat`": "`Estado da sirene`", - "`LOCK_CLOSE`": "`LOCK_CLOSE`", - "`Serrure Bouton Fermer`": "`Fechar botão de bloqueio`", - "`LOCK_STATE`": "`LOCK_STATE`", - "`Serrure Etat`": "`Bloqueio de estado`", - "Permet d'avoir son capteur d'inondation complet sur une seule ligne": "Permite que você tenha seu sensor de inundação completo em uma única linha", - "`FLAP_SLIDER`": "`FLAP_SLIDER`", - "Présence d'un slider, avec un bouton Monter\/Descendre en Toggle (avec icône d'état": "Presença de um controle deslizante, com um botão Acima \/ Abaixo em Alternar (com ícone de status", - "`Volet Bouton Slider`": "`Painel do botão deslizante`", - "`FLAP_UP`": "`FLAP_UP`", - "`Volet Bouton Monter`": "`Montar painel de botões`", - "`FLAP_STATE`(optionnel": "`FLAP_STATE` (opcional", - "Présence de trois boutons \"Monter\", \"Descendre\", \"Stop\", retour d'état optionnel": "Presença de três botões \"Para cima\", \"Para baixo\", \"Parar\", feedback opcional do status", - "`Volet Etat`(optionnel": "Painel de estado (opcional", - "`ENERGY_SLIDER`": "`ENERGY_SLIDER`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off et le slider permet de contrôler l'intensité": "Feedback de status presente, o botão esquerdo permite alternar entre On e Off e o controle deslizante permite controlar a intensidade", - "`Prise Slider`": "`Soquete deslizante`", - "`ENERGY_ON`": "`ENERGY_ON`", - "`Prise Bouton On`": "`Botão de soquete ativado`", - "`ENERGY_STATE`": "`ENERGY_STATE`", - "Retour d'état présent, le bouton de gauche permet de switcher entre On et Off": "Feedback de status presente, o botão esquerdo alterna entre ligado e desligado", - "`Prise Etat`": "Tomada de Estado", - "`ENERGY_OFF`": "`ENERGY_OFF`", - "présence de deux boutons \"ON\" et \"Off\" pas de retour d'état": "presença de dois botões \"ON\" e \"Off\" sem feedback de status", - "`Prise Bouton Off`": "`Botão fora do soquete`", - "Dans le cercle la couleur de la lampe est présente et lors d'un cloc dans celui-ci vous pouvez changer la couleur et activer un mode": "No círculo, a cor da lâmpada está presente e, quando você clica nela, pode alterar a cor e ativar um modo", - "`LIGHT_MODE`": "`LIGHT_MODE`", - "`Lumière Mode` (optionnel, il sert à avoir des mode de lumière,par exemple arc-en-ciel sur les philips Hue": "`Light Mode` (opcional, é usado para ter modos de luz, por exemplo, arco-íris na Hue philips)", - "`LIGHT_ON`": "`LIGHT_ON`", - "`Lumière Bouton On`": "`Botão de luz ligado`", - "`LIGHT_SLIDER`": "`LIGHT_SLIDER`", - "`Lumière Slider`": "`Light Slider`", - "`LIGHT_STATE`": "`LIGHT_STATE`", - "`Lumière Etat`": "`Luz do estado`", - "`LIGHT_TOGGLE`": "`LIGHT_TOGGLE`", - "`Lumière Bouton Toggle`": "`Botão de alternância de luz`", - "`LIGHT_OFF`": "`LIGHT_OFF`", - "`Lumière Bouton Off`": "`Botão apagado`", "Plugin Mobile": "Mobile Plugin", - "Plugin permettant d'utiliser l'application Mobile Jeedom": "Plug-in para usar o aplicativo Jeedom Mobile", - "L'application mobile Jeedom nécessite l'installation de ce plugin afin que la box puisse dialoguer avec l'application Mobile": "O aplicativo móvel Jeedom requer a instalação deste plug-in para que a caixa possa se comunicar com o aplicativo móvel", - "Configuration du plugin Mobile pour Application V2": "Configuração do plugin Mobile para Application V2", - "Après installation du plugin, il vous suffit de l'activer": "Depois de instalar o plugin, você só precisa ativá-lo", - "Premiere connexion à l'application V2": "Primeira conexão com o aplicativo V2", - "Pour connecter votre téléphone": "Para conectar seu telefone", - "il y a 2 méthodes possible;": "existem 2 métodos possíveis;", - "sur le premier écran de l'application, il vous est proposé de connecter votre compte market, et ainsi de retrouver toutes les boxs associées à ce compte, ou bien simplement ajouter une box": "na primeira tela do aplicativo, você pode conectar sua conta de mercado e, assim, encontrar todas as caixas associadas a esta conta ou simplesmente adicionar uma caixa", - "Pour profiter des fonctionnalités de l'application, le core de votre Jeedom doit etre en 4.4": "Para aproveitar as funcionalidades do aplicativo, o núcleo do seu Jeedom deve estar em 4.4", - "0 minimum": "0 mínimo", - "CONNEXION VIA LE COMPTE MARKET": "LOGIN VIA CONTA DE MERCADO", - "Il vous faut simplement rentrer votre identifiant Market ainsi que votre mot de passe": "Tudo o que você precisa fazer é inserir seu Market ID e senha", - "CONNEXION VIA BOX ID": "CONEXÃO VIA CAIXA ID", - "Plusieurs choix sur cet écran": "Várias opções nesta tela", - "Vous entrez l'url de votre Jeedom (interne ou externe), ainsi que les identifiants d'accès à celle-ci et vous confirmez avec le bouton CONNEXION": "Você insere a url do seu Jeedom (interno ou externo), bem como os identificadores de acesso a ele e confirma com o botão LOGIN", - "Vous cliquez sur QR Code": "Você clica no QR Code", - "un nouvel écran apparait; vous pourrez scanner un QRCode depuis le plugin Mobile de la box que vous souhaitez ajoutée, via l'onglet QRCODE du plugin": "uma nova tela aparece; você pode digitalizar um QRCode do plugin Mobile da caixa que deseja adicionar, através da guia QRCODE do plugin", - "Onglet Qr Code du plugin Mobile": "Aba Qr Code do plugin Mobile", - "v2ModalPlugin": "v2ModalPlugin", - "Une fois cette premiere étape passée, vous êtes enregistré dans l'application": "Uma vez que esta primeira etapa foi concluída, você está registrado no aplicativo", - "si vous possédez le plugin Mobile, vous aurez accès via le menu aux Notifications, aux QrCodes, la customisation du Menu": "se você tiver o plugin Mobile, terá acesso através do menu a Notificações, QrCodes, personalização de Menu", - "Dans le menu, vous aurez un onglet Boxs, qui regroupe toutes les box présentes sur ce compte market": "No menu, você terá a aba Caixas, que agrupa todas as caixas presentes nesta conta de mercado", - "Il vous suffit de cliquer sur la box où le plugin Mobile est installé, puis de vous identifiez pour accéder a la box": "Basta clicar na caixa onde está instalado o plugin Mobile, depois se identificar para acessar a caixa", - "La box passera en haut de la liste, ayant validée son authentification": "A caixa irá para o topo da lista, validada a sua autenticação", - "Vous pouvez faire ainsi pour plusieurs boxs": "Você pode fazer isso para várias caixas", - "Vous pouvez aussi cliquer sur le bouton + en bas à droite pour accéder à différentes options;": "Você também pode clicar no botão + no canto inferior direito para acessar diferentes opções;", - "QrCode pour ajouter une box à la liste via le plugin Mobile": "QrCode para adicionar uma caixa à lista através do plugin Mobile", - "Manuel pour ajouter manuellement une box": "Manual para adicionar manualmente uma caixa", - "Detection Atlas et Luna (si vous êtes en Wifi, détectera les boxs sur le réseau": "Detecção Atlas e Luna (se estiver no Wifi, irá detectar as caixas na rede", - "Synchronisation Market pour actualiser les informations du compte Market configuré": "Sincronização do Market para atualizar as informações configuradas da conta do Market", - "Pour acceder aux fonctionnalités comme les Notifications, la Personnalisation du Menu ou la Géolocalisation, il faut au préalable avoir selectionné au moins une box 'actuelle": "Para acessar recursos como Notificações, Personalização de Menu ou Geolocalização, você deve primeiro ter selecionado pelo menos uma caixa atual", - "Fonctionnement de la Géolocalisation": "Como funciona a geolocalização", - "Nous ajoutons une zone de Géolocalisation en cliquant sur l'icone +": "Adicionamos uma zona de geolocalização clicando no ícone +", - "Nous tapons l'adresse recherchée, nous validons avec Entrée sur son téléphone; le curseur va alors se positionner sur l'adresse recherchée": "Digitamos o endereço que procuramos, validamos com Enter no seu telefone; o cursor irá então se posicionar no endereço desejado", - "Nous pouvons ensuite ajouter un nom et sauvegarder la zone": "Podemos então adicionar um nome e salvar a zona", - "Cela crééra une nouvelle commande sur votre équipement mobile, de type binaire, qui correspondra aux entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone mobile": "Isto irá criar um novo comando no seu equipamento móvel, do tipo binário, que corresponderá às entradas e saídas da zona se a geolocalização estiver ativada no seu telemóvel", - "Nous pouvons également changer le radius de la zone, pour étendre la détection de la zone": "Também podemos alterar o raio da zona, para estender a detecção da zona", + "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom": "Le plugin Mobile permet d'utiliser l'application Mobile Jeedom", + "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin": "Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin", + "Configuration du plugin Mobile pour l'application V2": "Configuration du plugin Mobile pour l'application V2", + "Après avoir installé le plugin, activez-le simplement": "Après avoir installé le plugin, activez-le simplement", + "Première connexion à l'application V2": "Primeira conexão com o aplicativo V2", + "Pour connecter votre téléphone, deux méthodes sont disponibles": "Pour connecter votre téléphone, deux méthodes sont disponibles", + "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement": "Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement", + "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4": "Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4", + "0 ou supérieure": "0 ou supérieure", + "Connexion via le compte Market": "LOGIN VIA CONTA DE MERCADO", + "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter": "Saisissez simplement votre identifiant et mot de passe Market pour vous connecter", + "Connexion via l'ID de la Box": "Connexion via l'ID de la Box", + "Sur cet écran, plusieurs options s'offrent à vous": "Sur cet écran, plusieurs options s'offrent à vous", + "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton": "Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton", + "QR Code": "QR Code", + "Cliquez sur": "Cliquez sur", + "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter": "un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter", + "Onglet QR Code du plugin Mobile": "Aba Qr Code do plugin Mobile", + "Une fois cette étape terminée, vous êtes enregistré dans l'application": "Une fois cette étape terminée, vous êtes enregistré dans l'application", + "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu": "Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu", + "Dans le menu, un onglet": "Dans le menu, un onglet", + "regroupe toutes les Box associées à votre compte Market": "regroupe toutes les Box associées à votre compte Market", + "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder": "Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder", + "La Box validée apparaîtra en haut de la liste": "La Box validée apparaîtra en haut de la liste", + "Vous pouvez répéter cette opération pour plusieurs Box": "Vous pouvez répéter cette opération pour plusieurs Box", + "+": "+", + "En cliquant sur le bouton": "En cliquant sur le bouton", + "en bas à droite, vous accédez à différentes options": "en bas à droite, vous accédez à différentes options", + "Ajouter une Box via un QR Code (depuis le plugin Mobile": "Ajouter une Box via un QR Code (depuis le plugin Mobile", + "Ajouter une Box manuellement": "Ajouter une Box manuellement", + "Détecter les Box Atlas et Luna sur le réseau Wi-Fi": "Détecter les Box Atlas et Luna sur le réseau Wi-Fi", + "Synchroniser les informations de votre compte Market": "Synchroniser les informations de votre compte Market", + "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle": "Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme \"actuelle", + "Fonctionnement de la géolocalisation": "Como funciona a geolocalização", + "Ajoutez une zone de géolocalisation en cliquant sur l'icône": "Ajoutez une zone de géolocalisation en cliquant sur l'icône", + "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone": "Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone", + "Le curseur se positionnera automatiquement sur l'adresse": "Le curseur se positionnera automatiquement sur l'adresse", + "Vous pouvez ensuite nommer et sauvegarder la zone": "Vous pouvez ensuite nommer et sauvegarder la zone", + "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone": "Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone", + "Vous pouvez également ajuster le rayon de la zone pour élargir la détection": "Vous pouvez également ajuster le rayon de la zone pour élargir la détection", + "Pour supprimer une zone, cliquez sur": "Pour supprimer une zone, cliquez sur", + "puis sur l'icône Corbeille": "puis sur l'icône Corbeille", + "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box": "Cela supprimera la zone de l'application ainsi que la commande associée sur la Box", + "Paramètres de l'application": "Paramètres de l'application", + "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur": "Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur", + "Par défaut, elles sont réglées sur 5 secondes": "Par défaut, elles sont reglées sur 5 secondes", + "Mon mobile ne possède pas d'IQ (identifiant unique": "Mon mobile ne possède pas d'IQ (identifiant unique", + "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier": "Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier", + "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application": "Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application", + "Une alerte vous indiquera que la récupération de l'IQ est en cours": "Une alerte vous indiquera que la récupération de l'IQ est en cours", "J'ai des soucis avec les notifications": "Tenho problemas com notificações", - "Cette partie est actuellement en cours d'amélioration et d'optimisation sur l'application beta": "Esta parte está sendo melhorada e otimizada no aplicativo beta", + "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application": "Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application", "J'ai des soucis d'affichage de ma webview": "Tenho problemas para exibir meu webview", - "Sur votre Jeedom, dans les Préférences, vérifiez que la page d'accueil du mobile soit bien ACCUEIL": "No seu Jeedom, nas Preferências, verifique se a página inicial do celular é HOME", - "Configuration du plugin Mobile V1": "Configurando o plugin Mobile V1", - "Pour configurer le plugin, vous devez ajouter les téléphones qui pourront accéder à Jeedom": "Para configurar o plug-in, você deve adicionar os telefones que poderão acessar o Jeedom", - "Pour Ajouter un téléphone": "Para adicionar um telefone", - "→": "→", - "Voici les paramètres à renseigner": "Aqui estão os parâmetros para inserir", - "Nom de l'équipement mobile": "Nome do equipamento móvel", - "Nom du téléphone": "Nome do telefone", - "Activation de l'accès pour ce mobile": "Ativando o acesso para este celular", - "Type de Mobile": "Tipo de celular", - "Sélection de l'OS du téléphone (iOS, Android": "Seleção de SO do telefone (iOS, Android", - "Utilisateur associé à cet accès": "Usuário associado a este acesso", - "Le choix de l'utilisateur est important car il détermine les équipements auxquels celui-ci aura accès en fonction de ses droits": "A escolha do usuário é importante, pois determina o equipamento ao qual ele terá acesso de acordo com seus direitos", - "Après avoir sauvegardé, vous obtiendrez un QRCode permettant à l'application de se configurer toute seule": "Após salvar, você receberá um QRCode permitindo que o aplicativo se configure", - "Configuration des plugins et commandes que reçoit l'app": "Configuração de plugins e comandos recebidos pelo aplicativo", - "Après l'initialisation du Plugin Mobile vous avez la possibilité de remanier les types génériques des commandes, des plugins et des pièces": "Após a inicialização do Mobile Plugin, você tem a possibilidade de modificar os tipos genéricos de pedidos, plugins e peças", - "En cliquant sur un plugin, vous pouvez l'autoriser ou non à dialoguer avec l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Ao clicar em um plug-in, você pode autorizá-lo ou não a conversar com o aplicativo móvel e configurar cada um dos tipos genéricos associados aos seus comandos", - "En cliquant sur une pièce, vous pouvez l'autoriser ou non à être présente dans l'application mobile, et configurer chacun des types génériques associés à ses commandes": "Ao clicar em uma peça, você pode autorizá-la ou não a estar presente no aplicativo móvel e configurar cada um dos tipos genéricos associados a seus pedidos", - "Configuration de l'application Mobile": "Configuração de aplicativo para dispositivos móveis", - "Vous trouverez les applications sur les stores mobiles": "Você encontrará os aplicativos nas persianas móveis", - "Android Google Play": "Android Google Play", - "Apple App Store": "Apple App Store", - "Premier lancement de l'app": "Primeiro lançamento do aplicativo", - "Au 1er lancement de l'application Mobile, un tutorial vous sera proposé afin de vous accompagner dans la configuration de celle-ci": "Ao iniciar o aplicativo Mobile pela primeira vez, você receberá um tutorial para ajudá-lo a configurá-lo", - "Après avoir téléchargé et installé votre application mobile Jeedom, lancez l'application sur votre smartphone": "Depois de baixar e instalar seu aplicativo móvel Jeedom, inicie o aplicativo em seu smartphone", - "Vous arrivez alors dans un didacticiel de configuration que nous vous conseillons de suivre": "Você chega em um tutorial de configuração que recomendamos que você siga", - "Certaines étapes ont étés faites précédemment": "Algumas etapas foram realizadas anteriormente", - "Vous aurez ensuite le choix entre une configuration manuelle ou automatique par QRcode": "Você poderá escolher entre uma configuração manual ou automática pelo QRcode", - "Si vous optez pour la configuration par QRcode, il suffit de flasher le QRcode présent sur le plugin App Mobile dans l'équipement smartphone créé précédemment": "Se você optar pela configuração do QRcode, basta exibir o QRcode presente no plug-in Mobile App no equipamento para smartphone criado anteriormente", - "Dans ce cas, l'application va récupérer automatiquement toute la configuration de votre Jeedom et se connecter automatiquement": "Nesse caso, o aplicativo recuperará automaticamente toda a configuração do seu Jeedom e se conectará automaticamente", - "Lorsqu'il sera connecté chez vous en Wifi, l'application utilisera automatiquement l'adresse Jeedom ethernet interne à votre réseau": "Quando estiver conectado à sua casa via Wifi, o aplicativo usará automaticamente o endereço Ethernet Jeedom interno à sua rede", - "Lorsque vous serez connecté en 4G ou 3G, il utilisera votre adresse externe pour se connecter à votre Jeedom (par exemple via le service DNS Jeedom si vous l'utilisez": "Quando você está conectado em 4G ou 3G, ele usa seu endereço externo para conectar-se ao seu Jeedom (por exemplo, através do serviço DNS Jeedom, se você o usar", - "Si vous optez pour la configuration manuelle, dans ce cas il vous faudra entrer à la main les adresses IP interne et externe de votre Jeedom": "Se você escolher a configuração manual, nesse caso, será necessário inserir manualmente os endereços IP internos e externos do seu Jeedom", - "Cette option est réservée à un public averti": "Esta opção está reservada a um público informado", - "L'application va se synchroniser et vous arrivez sur sa page d'accueil (précédée par un mini guide de présentation": "O aplicativo será sincronizado e você chegará à sua página inicial (precedida por um mini guia de apresentação", - "L'application mobile Jeedom est maintenant prête à fonctionner": "O aplicativo móvel Jeedom está pronto para funcionar", - "Les Favoris": "Favoritos", - "Sur l'application vous pouvez avoir des Favoris (raccourcis de commandes, plugins, scénarios": "No aplicativo, você pode ter Favoritos (atalhos de comandos, plugins, cenários", - "Voici donc la marche à suivre pour en créer": "Aqui está o procedimento para criá-los", - "Cliquez sur un des + sur l'écran d'accueil de l'application": "Clique em um dos + na tela inicial do aplicativo", - "Vous arriverez sur la page de sélection du type de raccourci": "Você chegará à página de seleção do tipo de atalho", - "Par exemple, nous allons prendre Action, il nous propose donc des Pièces\/Objets": "Por exemplo, vamos executar uma ação, por isso nos oferece moedas \/ objetos", - "Il vous suffit alors de sélectionner l'action que vous souhaitez en raccourci": "Em seguida, basta selecionar a ação que deseja como atalho", - "Il est ensuite possible de personnaliser la couleur de celle-ci (pour le moment trois couleurs sont proposées": "É então possível personalizar a cor deste (no momento, três cores são propostas", - "Ainsi que les deux textes associés": "Bem como os dois textos associados", - "Voilà, vous avez maitenant un raccourci de votre commande (dans la version 1": "Aqui, você tem agora um atalho do seu pedido (na versão 1", - "1 il est prévu que les commandes On\/Off apparaissent sur la même touche": "1 Espera-se que os comandos liga \/ desliga apareçam na mesma tecla", - "Comment bien configurer ses types génériques": "Como configurar corretamente tipos genéricos", - "Les Génériques Types dans le plugin Mobile": "Tipos genéricos no plug-in Mobile", - "Mieux que des mots, voici un exemple des génériques types pour une lumière avec toutes ses commandes (voir aussi le tableau Lumière plus bas": "Melhor que as palavras, aqui está um exemplo dos créditos genéricos para uma luz com todos os seus controles (veja também a tabela Luz abaixo)", - "Tableaux des templates de l'application": "Tabelas de modelo de aplicativo", - "Les Lumières": "As luzes", - "`Lumière Couleur (info)`": "`Cor clara (informação)`", - "`Lumière Couleur (action)`": "`Cor clara (ação)`", - "`LIGHT_COLOR`": "`LIGHT_COLOR`", - "`LIGHT_SET_COLOR`": "`LIGHT_SET_COLOR`", - "Les Prises": "As tomadas", - "Les Volets": "As persianas", - "`Volet Bouton Descendre`": "`Painel de botões para baixo`", - "`Volet Bouton Stop`": "`Painel do botão Stop '", - "`FLAP_DOWN`": "`FLAP_DOWN`", - "`FLAP_STOP`": "`FLAP_STOP`", - "`Volet Etat`": "Painel de estado", - "`FLAP_STATE`": "`FLAP_STATE`", - "`Serrure Bouton Ouvrir`": "`Abrir botão de bloqueio`", - "`LOCK_OPEN`": "`LOCK_OPEN`", - "Sirène": "Sereia", - "`Sirène Bouton On`": "`Botão da sirene ligado`", - "`SIREN_ON`": "`SIREN_ON`", - "Fumée": "Fumaça", - "Température": "Temperatura", - "Présence": "Presença", - "`Luminosité`(optionnel": "`Brightness` (opcional", - "`UV`(optionnel": "`UV` (opcional", - "`BRIGHTNESS`(optionnel": "`BRILHO` (opcional", - "Fil pilote": "Fio piloto", - "`Chauffage fil pilote bouton OFF`": "`Botão OFF do fio piloto de aquecimento`", - "`Chauffage fil pilote Etat`": "`Estado do fio piloto de aquecimento`", - "`HEATING_OFF`": "`HEATING_OFF`", - "`HEATING_STATE`": "`HEATING_STATE`", - "LES JOKERS": "OS JOKERS", - "Générique Action": "Ação genérica", - "Générique Info": "Informações genéricas", - "Je suis sur Android version de l'app (1.0": "Estou na versão Android do aplicativo (1.0", - "1 ou 1.0": "1 ou 1.0", - "0) je n'arrive pas à accéder à mes pièces ni même à la configuration de l'app": "0) Não consigo acessar minhas partes ou mesmo a configuração do aplicativo", - "Vous avez eu un popup vous avertissant d'un souci sur les paramètres d'accessibilité, il vous suffit donc de vous rendre dans les paramètres d'accessibilité de votre mobile et de décocher les applications utilisant cette option": "Você tinha um pop-up alertando sobre uma preocupação com as configurações de acessibilidade; basta acessar as configurações de acessibilidade do seu celular e desmarcar os aplicativos usando esta opção", - "Un correctif sera apporté prochainement sur l'app": "Uma correção será trazida em breve no aplicativo", - "J'ai un message dans une des lignes de mes modules me disant qu'il": "Eu tenho uma mensagem em uma das linhas dos meus módulos dizendo que", - "manque un Type Générique": "sem um tipo genérico", - "doc chapitre Type Générique": "doc capítulo Tipo genérico", - "En lisant ce message, il vous dit quel type générique manque pour créer un template compatible": "Ao ler esta mensagem, ele informa qual tipo genérico está ausente para criar um modelo compatível", - "Il suffit juste de l'appliquer": "Apenas aplique", - "Reportez-vous à la": "Consulte o", - "J'ai un souci sur un des plugins dit complètement intégré (météo": "Estou com um problema com um dos plug-ins chamado totalmente integrado", - "thermostat, alarme, caméra": "termostato, alarme, câmera", - "N'hésitez pas à accéder à votre module et de bien cliquer sursauvegarder à nouveau, cela permettra de ré-inclure les typesgénériques associés au module": "Não hesite em acessar seu módulo e clique em Salvar novamente. Isso incluirá novamente os tipos genéricos associados ao módulo", - "Impossible de mettre une info sur l'accueil de l'app": "Não foi possível colocar uma informação sobre as boas-vindas do aplicativo", - "Cela est normal, ça sera disponible sur la version 1.1": "Isso é normal, estará disponível na versão 1.1", - "J'ai l'application qui prend enormement de memoire dans mon": "Eu tenho o aplicativo que ocupa muita memória no meu", - "Il y avait un bug sur les versions 1.0": "Houve um erro nas versões 1.0", - "0 et 1.0": "0 e 1.0", - "1 sur la partie Camera": "1 na parte da câmera", - "Le souci ne ce reproduira plus avec la 1.0": "O problema não acontecerá novamente com 1.0", - "2, pour supprimer le cache sans surprimer l'app, il suffit d'aller dans la configuration de votre App Mobile et de cliquer sur \"supprimer le cache": "2, para excluir o cache sem aumentar o preço do aplicativo, basta acessar a configuração do seu aplicativo móvel e clicar em \"excluir o cache", - "J'ai un souci de premiere synchronisation sur l'app ou de sql sur le plugin mobile": "Tenho uma preocupação de primeira sincronização no aplicativo ou de sql no plug-in móvel", - "Il faut bien mettre des types génériques et autoriser le plugin a envoyer les generiques voir la doc un peux plus haut": "Você precisa colocar tipos genéricos e autorizar o plug-in a enviar genéricos, veja o documento um pouco mais alto", - " Image.": " Imagem.", - " Image?": " Imagem?", - "Image ": "Imagem ", - " Image]": " Imagem]", - "[Image]": "[Imagem]", - "*Image*": "*Imagem*", - " Image*": " Imagem*", - " Description.": " Descrição.", - " Description?": " Descrição?", - "Description ": "Descrição ", - " Description]": " Descrição]", - "[Description]": "[Descrição]", - "*Description*": "*Descrição*", - " Description*": " Descrição*", - " `PRESENCE`.": " PRESENÇA.", - " `PRESENCE`?": " PRESENÇA?", - "`PRESENCE` ": "PRESENÇA ", - " `PRESENCE`]": " PRESENÇA]", - "[`PRESENCE`]": "[PRESENÇA]", - "*`PRESENCE`*": "*PRESENÇA*", - " `PRESENCE`*": " PRESENÇA*", - " `TEMPERATURE`.": " TEMPERATURA.", - " `TEMPERATURE`?": " TEMPERATURA?", - "`TEMPERATURE` ": "TEMPERATURA ", - " `TEMPERATURE`]": " TEMPERATURA]", - "[`TEMPERATURE`]": "[TEMPERATURA]", - "*`TEMPERATURE`*": "*TEMPERATURA*", - " `TEMPERATURE`*": " TEMPERATURA*", - " `SMOKE`.": " «FUMO».", - " `SMOKE`?": " «FUMO»?", - "`SMOKE` ": "«FUMO» ", - " `SMOKE`]": " «FUMO»]", - "[`SMOKE`]": "[«FUMO»]", - "*`SMOKE`*": "*«FUMO»*", - " `SMOKE`*": " «FUMO»*", - " `FLOOD`.": " `INUNDAÇÃO '.", - " `FLOOD`?": " `INUNDAÇÃO '?", - "`FLOOD` ": "`INUNDAÇÃO ' ", - " `FLOOD`]": " `INUNDAÇÃO ']", - "[`FLOOD`]": "[`INUNDAÇÃO ']", - "*`FLOOD`*": "*`INUNDAÇÃO '*", - " `FLOOD`*": " `INUNDAÇÃO '*", - " `Innondation`.": " `Inundação`.", - " `Innondation`?": " `Inundação`?", - "`Innondation` ": "`Inundação` ", - " `Innondation`]": " `Inundação`]", - "[`Innondation`]": "[`Inundação`]", - "*`Innondation`*": "*`Inundação`*", - " `Innondation`*": " `Inundação`*", + "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur": "Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur", + "Je souhaite partager mes droits mobile sans communiquer mon compte Market": "", + "Vous possédez le plugin Mobile sur votre box et vous l'avez ajouté dans l'application": "", + "vous avez accès aux notifications, à la géolocalisation, au menu personnalisé, etc": "", + "Un autre membre de votre famille, par exemple, souhaite également recevoir les notifications, mais vous ne souhaitez pas entrer votre compte Market sur son téléphone": "", + "il lui suffit d'aller dans Préférences > Réglages et de cliquer sur \"Demander des droits à un autre mobile": "", + "Un code à 6 chiffres sera alors généré": "", + "Il devra le saisir sur le mobile possédant le compte Market, au même endroit": "", + "Un code à 4 chiffres sera ensuite généré pour être communiqué au mobile demandeur, confirmant ainsi la transaction": "", + "L'application sur le mobile demandeur redémarrera et disposera désormais de l'accès aux notifications, sans avoir de compte Market associé": "", " IMPORTANT.": " IMPORTANTE.", " IMPORTANT?": " IMPORTANTE?", "IMPORTANT ": "IMPORTANTE ", @@ -347,6 +179,27 @@ "[IMPORTANT]": "[IMPORTANTE]", "*IMPORTANT*": "*IMPORTANTE*", " IMPORTANT*": " IMPORTANTE*", + " CONNEXION.": " CONNEXION.", + " CONNEXION?": " CONNEXION?", + "CONNEXION ": "CONNEXION ", + " CONNEXION]": " CONNEXION]", + "[CONNEXION]": "[CONNEXION]", + "*CONNEXION*": "*CONNEXION*", + " CONNEXION*": " CONNEXION*", + " Boxs.": " Boxs.", + " Boxs?": " Boxs?", + "Boxs ": "Boxs ", + " Boxs]": " Boxs]", + "[Boxs]": "[Boxs]", + "*Boxs*": "*Boxs*", + " Boxs*": " Boxs*", + " Éditer.": " Éditer.", + " Éditer?": " Éditer?", + "Éditer ": "Éditer ", + " Éditer]": " Éditer]", + "[Éditer]": "[Éditer]", + "*Éditer*": "*Éditer*", + " Éditer*": " Éditer*", " FAQ.": " Perguntas frequentes.", " FAQ?": " Perguntas frequentes?", "FAQ ": "Perguntas frequentes ", @@ -354,194 +207,12 @@ "[FAQ]": "[Perguntas frequentes]", "*FAQ*": "*Perguntas frequentes*", " FAQ*": " Perguntas frequentes*", - " Configuration.": " Configuração.", - " Configuration?": " Configuração?", - "Configuration ": "Configuração ", - " Configuration]": " Configuração]", - "[Configuration]": "[Configuração]", - "*Configuration*": "*Configuração*", - " Configuration*": " Configuração*", - " Plugins.": " Plugins.", - " Plugins?": " Plugins?", - "Plugins ": "Plugins ", - " Plugins]": " Plugins]", - "[Plugins]": "[Plugins]", - "*Plugins*": "*Plugins*", - " Plugins*": " Plugins*", - " Communication.": " Comunicação.", - " Communication?": " Comunicação?", - "Communication ": "Comunicação ", - " Communication]": " Comunicação]", - "[Communication]": "[Comunicação]", - "*Communication*": "*Comunicação*", - " Communication*": " Comunicação*", - " App.": " App.", - " App?": " App?", - "App ": "App ", - " App]": " App]", - "[App]": "[App]", - "*App*": "*App*", - " App*": " App*", - " Mobile.": " Móvel.", - " Mobile?": " Móvel?", - "Mobile ": "Móvel ", - " Mobile]": " Móvel]", - "[Mobile]": "[Móvel]", - "*Mobile*": "*Móvel*", - " Mobile*": " Móvel*", - " Ajouter.": " Adicionar.", - " Ajouter?": " Adicionar?", - "Ajouter ": "Adicionar ", - " Ajouter]": " Adicionar]", - "[Ajouter]": "[Adicionar]", - "*Ajouter*": "*Adicionar*", - " Ajouter*": " Adicionar*", - " Activer.": " Ativar.", - " Activer?": " Ativar?", - "Activer ": "Ativar ", - " Activer]": " Ativar]", - "[Activer]": "[Ativar]", - "*Activer*": "*Ativar*", - " Activer*": " Ativar*", - " Utilisateur.": " Usuário.", - " Utilisateur?": " Usuário?", - "Utilisateur ": "Usuário ", - " Utilisateur]": " Usuário]", - "[Utilisateur]": "[Usuário]", - "*Utilisateur*": "*Usuário*", - " Utilisateur*": " Usuário*", - " Tip.": " Dica.", - " Tip?": " Dica?", - "Tip ": "Dica ", - " Tip]": " Dica]", - "[Tip]": "[Dica]", - "*Tip*": "*Dica*", - " Tip*": " Dica*", - " LIGHT.": " LUZ.", - " LIGHT?": " LUZ?", - "LIGHT ": "LUZ ", - " LIGHT]": " LUZ]", - "[LIGHT]": "[LUZ]", - "*LIGHT*": "*LUZ*", - " LIGHT*": " LUZ*", - " ENERGY.": " ENERGIA.", - " ENERGY?": " ENERGIA?", - "ENERGY ": "ENERGIA ", - " ENERGY]": " ENERGIA]", - "[ENERGY]": "[ENERGIA]", - "*ENERGY*": "*ENERGIA*", - " ENERGY*": " ENERGIA*", - " FLAP.": " Aba.", - " FLAP?": " Aba?", - "FLAP ": "Aba ", - " FLAP]": " Aba]", - "[FLAP]": "[Aba]", - "*FLAP*": "*Aba*", - " FLAP*": " Aba*", - " Inondation.": " Inundação.", - " Inondation?": " Inundação?", - "Inondation ": "Inundação ", - " Inondation]": " Inundação]", - "[Inondation]": "[Inundação]", - "*Inondation*": "*Inundação*", - " Inondation*": " Inundação*", - " FLOOD.": " ENCHENTE.", - " FLOOD?": " ENCHENTE?", - "FLOOD ": "ENCHENTE ", - " FLOOD]": " ENCHENTE]", - "[FLOOD]": "[ENCHENTE]", - "*FLOOD*": "*ENCHENTE*", - " FLOOD*": " ENCHENTE*", - " Serrure.": " Bloquear.", - " Serrure?": " Bloquear?", - "Serrure ": "Bloquear ", - " Serrure]": " Bloquear]", - "[Serrure]": "[Bloquear]", - "*Serrure*": "*Bloquear*", - " Serrure*": " Bloquear*", - " LOCK.": " TRANCAR.", - " LOCK?": " TRANCAR?", - "LOCK ": "TRANCAR ", - " LOCK]": " TRANCAR]", - "[LOCK]": "[TRANCAR]", - "*LOCK*": "*TRANCAR*", - " LOCK*": " TRANCAR*", - " SIREN.": " SIRENE.", - " SIREN?": " SIRENE?", - "SIREN ": "SIRENE ", - " SIREN]": " SIRENE]", - "[SIREN]": "[SIRENE]", - "*SIREN*": "*SIRENE*", - " SIREN*": " SIRENE*", - " SMOKE.": " FUMAÇA.", - " SMOKE?": " FUMAÇA?", - "SMOKE ": "FUMAÇA ", - " SMOKE]": " FUMAÇA]", - "[SMOKE]": "[FUMAÇA]", - "*SMOKE*": "*FUMAÇA*", - " SMOKE*": " FUMAÇA*", - " TEMPERATURE.": " Temperatura.", - " TEMPERATURE?": " Temperatura?", - "TEMPERATURE ": "Temperatura ", - " TEMPERATURE]": " Temperatura]", - "[TEMPERATURE]": "[Temperatura]", - "*TEMPERATURE*": "*Temperatura*", - " TEMPERATURE*": " Temperatura*", - " PRESENCE.": " Presença.", - " PRESENCE?": " Presença?", - "PRESENCE ": "Presença ", - " PRESENCE]": " Presença]", - "[PRESENCE]": "[Presença]", - "*PRESENCE*": "*Presença*", - " PRESENCE*": " Presença*", - " Ouvrant.": " Abertura.", - " Ouvrant?": " Abertura?", - "Ouvrant ": "Abertura ", - " Ouvrant]": " Abertura]", - "[Ouvrant]": "[Abertura]", - "*Ouvrant*": "*Abertura*", - " Ouvrant*": " Abertura*", - " OPENING.": " ABERTURA.", - " OPENING?": " ABERTURA?", - "OPENING ": "ABERTURA ", - " OPENING]": " ABERTURA]", - "[OPENING]": "[ABERTURA]", - "*OPENING*": "*ABERTURA*", - " OPENING*": " ABERTURA*", - " HEATING.": " AQUECIMENTO.", - " HEATING?": " AQUECIMENTO?", - "HEATING ": "AQUECIMENTO ", - " HEATING]": " AQUECIMENTO]", - "[HEATING]": "[AQUECIMENTO]", - "*HEATING*": "*AQUECIMENTO*", - " HEATING*": " AQUECIMENTO*", - " ACTION.": " AÇÃO.", - " ACTION?": " AÇÃO?", - "ACTION ": "AÇÃO ", - " ACTION]": " AÇÃO]", - "[ACTION]": "[AÇÃO]", - "*ACTION*": "*AÇÃO*", - " ACTION*": " AÇÃO*", - " INFO.": " INFORMAÇÕES.", - " INFO?": " INFORMAÇÕES?", - "INFO ": "INFORMAÇÕES ", - " INFO]": " INFORMAÇÕES]", - "[INFO]": "[INFORMAÇÕES]", - "*INFO*": "*INFORMAÇÕES*", - " INFO*": " INFORMAÇÕES*", - " Troubleshooting.": " Solução de problemas.", - " Troubleshooting?": " Solução de problemas?", - "Troubleshooting ": "Solução de problemas ", - " Troubleshooting]": " Solução de problemas]", - "[Troubleshooting]": "[Solução de problemas]", - "*Troubleshooting*": "*Solução de problemas*", - " Troubleshooting*": " Solução de problemas*", - " telephone.": " Telefone.", - " telephone?": " Telefone?", - "telephone ": "Telefone ", - " telephone]": " Telefone]", - "[telephone]": "[Telefone]", - "*telephone*": "*Telefone*", - " telephone*": " Telefone*" + " ACCUEIL.": " ACCUEIL.", + " ACCUEIL?": " ACCUEIL?", + "ACCUEIL ": "ACCUEIL ", + " ACCUEIL]": " ACCUEIL]", + "[ACCUEIL]": "[ACCUEIL]", + "*ACCUEIL*": "*ACCUEIL*", + " ACCUEIL*": " ACCUEIL*" } } \ No newline at end of file diff --git a/docs/images/ACTION.jpg b/docs/images/ACTION.jpg deleted file mode 100755 index 6f619a12..00000000 Binary files a/docs/images/ACTION.jpg and /dev/null differ diff --git a/docs/images/Button_Dashboard_icon@3x.png b/docs/images/Button_Dashboard_icon@3x.png deleted file mode 100755 index 3eafc626..00000000 Binary files a/docs/images/Button_Dashboard_icon@3x.png and /dev/null differ diff --git a/docs/images/Button_Design_icon@3x.png b/docs/images/Button_Design_icon@3x.png deleted file mode 100755 index e5e6d7af..00000000 Binary files a/docs/images/Button_Design_icon@3x.png and /dev/null differ diff --git a/docs/images/Button_Synthese_icon@3x.png b/docs/images/Button_Synthese_icon@3x.png deleted file mode 100755 index eaab45c0..00000000 Binary files a/docs/images/Button_Synthese_icon@3x.png and /dev/null differ diff --git a/docs/images/Button_URL_icon@3x.png b/docs/images/Button_URL_icon@3x.png deleted file mode 100755 index 6af241c1..00000000 Binary files a/docs/images/Button_URL_icon@3x.png and /dev/null differ diff --git a/docs/images/ENERGY_1.jpg b/docs/images/ENERGY_1.jpg deleted file mode 100755 index 33e2b43e..00000000 Binary files a/docs/images/ENERGY_1.jpg and /dev/null differ diff --git a/docs/images/ENERGY_2.jpg b/docs/images/ENERGY_2.jpg deleted file mode 100755 index ba27c09b..00000000 Binary files a/docs/images/ENERGY_2.jpg and /dev/null differ diff --git a/docs/images/ENERGY_3.jpg b/docs/images/ENERGY_3.jpg deleted file mode 100755 index 1cc9fa79..00000000 Binary files a/docs/images/ENERGY_3.jpg and /dev/null differ diff --git a/docs/images/FLAP_1.jpg b/docs/images/FLAP_1.jpg deleted file mode 100755 index 920eee11..00000000 Binary files a/docs/images/FLAP_1.jpg and /dev/null differ diff --git a/docs/images/FLAP_2.jpg b/docs/images/FLAP_2.jpg deleted file mode 100755 index ea0a8164..00000000 Binary files a/docs/images/FLAP_2.jpg and /dev/null differ diff --git a/docs/images/FLOOD.jpg b/docs/images/FLOOD.jpg deleted file mode 100755 index e3781224..00000000 Binary files a/docs/images/FLOOD.jpg and /dev/null differ diff --git a/docs/images/IMG_0738.PNG b/docs/images/IMG_0738.PNG deleted file mode 100755 index 2b3367ab..00000000 Binary files a/docs/images/IMG_0738.PNG and /dev/null differ diff --git a/docs/images/INFO.jpg b/docs/images/INFO.jpg deleted file mode 100755 index 67e8bfe5..00000000 Binary files a/docs/images/INFO.jpg and /dev/null differ diff --git a/docs/images/LIGHT_1.jpg b/docs/images/LIGHT_1.jpg deleted file mode 100755 index 972b1595..00000000 Binary files a/docs/images/LIGHT_1.jpg and /dev/null differ diff --git a/docs/images/LIGHT_2.jpg b/docs/images/LIGHT_2.jpg deleted file mode 100755 index e22fd26e..00000000 Binary files a/docs/images/LIGHT_2.jpg and /dev/null differ diff --git a/docs/images/LIGHT_3.jpg b/docs/images/LIGHT_3.jpg deleted file mode 100755 index 9110a48d..00000000 Binary files a/docs/images/LIGHT_3.jpg and /dev/null differ diff --git a/docs/images/LIGHT_4.jpg b/docs/images/LIGHT_4.jpg deleted file mode 100755 index 2fe520c3..00000000 Binary files a/docs/images/LIGHT_4.jpg and /dev/null differ diff --git a/docs/images/LOCK.jpg b/docs/images/LOCK.jpg deleted file mode 100755 index f68ab4c0..00000000 Binary files a/docs/images/LOCK.jpg and /dev/null differ diff --git a/docs/images/OPENING.jpg b/docs/images/OPENING.jpg deleted file mode 100755 index 434950b2..00000000 Binary files a/docs/images/OPENING.jpg and /dev/null differ diff --git a/docs/images/PRESENCE.jpg b/docs/images/PRESENCE.jpg deleted file mode 100755 index d1dd013d..00000000 Binary files a/docs/images/PRESENCE.jpg and /dev/null differ diff --git a/docs/images/SIREN.jpg b/docs/images/SIREN.jpg deleted file mode 100755 index 137411ed..00000000 Binary files a/docs/images/SIREN.jpg and /dev/null differ diff --git a/docs/images/SMOKE.jpg b/docs/images/SMOKE.jpg deleted file mode 100755 index 1b3fcf27..00000000 Binary files a/docs/images/SMOKE.jpg and /dev/null differ diff --git a/docs/images/TEMPERATURE.jpg b/docs/images/TEMPERATURE.jpg deleted file mode 100755 index 3850acce..00000000 Binary files a/docs/images/TEMPERATURE.jpg and /dev/null differ diff --git a/docs/images/android copy.png b/docs/images/android copy.png deleted file mode 100755 index e33724b6..00000000 Binary files a/docs/images/android copy.png and /dev/null differ diff --git a/docs/images/android.png b/docs/images/android.png deleted file mode 100755 index e33724b6..00000000 Binary files a/docs/images/android.png and /dev/null differ diff --git a/docs/images/appareil-ios.png b/docs/images/appareil-ios.png deleted file mode 100755 index 76a3a193..00000000 Binary files a/docs/images/appareil-ios.png and /dev/null differ diff --git a/docs/images/attention.jpg b/docs/images/attention.jpg deleted file mode 100755 index 3382c8b6..00000000 Binary files a/docs/images/attention.jpg and /dev/null differ diff --git a/docs/images/config-piece.png b/docs/images/config-piece.png deleted file mode 100755 index 4f731f02..00000000 Binary files a/docs/images/config-piece.png and /dev/null differ diff --git a/docs/images/config-plugin-1.png b/docs/images/config-plugin-1.png deleted file mode 100755 index 4a94b5da..00000000 Binary files a/docs/images/config-plugin-1.png and /dev/null differ diff --git a/docs/images/config-plugin.png b/docs/images/config-plugin.png deleted file mode 100755 index 0bd18972..00000000 Binary files a/docs/images/config-plugin.png and /dev/null differ diff --git a/docs/images/config-pluginhb.png b/docs/images/config-pluginhb.png deleted file mode 100755 index 1a6bf269..00000000 Binary files a/docs/images/config-pluginhb.png and /dev/null differ diff --git a/docs/images/cuisine-homekit.jpg b/docs/images/cuisine-homekit.jpg deleted file mode 100755 index 63961d3b..00000000 Binary files a/docs/images/cuisine-homekit.jpg and /dev/null differ diff --git a/docs/images/demonHB.png b/docs/images/demonHB.png deleted file mode 100755 index 0d4606bb..00000000 Binary files a/docs/images/demonHB.png and /dev/null differ diff --git "a/docs/images/d\303\251mon-homebridge.png" "b/docs/images/d\303\251mon-homebridge.png" deleted file mode 100755 index 90738256..00000000 Binary files "a/docs/images/d\303\251mon-homebridge.png" and /dev/null differ diff --git "a/docs/images/d\303\251pendances-homebridge.png" "b/docs/images/d\303\251pendances-homebridge.png" deleted file mode 100755 index 43139ac0..00000000 Binary files "a/docs/images/d\303\251pendances-homebridge.png" and /dev/null differ diff --git a/docs/images/garage-homekit.png b/docs/images/garage-homekit.png deleted file mode 100755 index 41bd753b..00000000 Binary files a/docs/images/garage-homekit.png and /dev/null differ diff --git a/docs/images/generic_type_in_plugin.jpg b/docs/images/generic_type_in_plugin.jpg deleted file mode 100755 index 1999dad5..00000000 Binary files a/docs/images/generic_type_in_plugin.jpg and /dev/null differ diff --git a/docs/images/home-1.jpg b/docs/images/home-1.jpg deleted file mode 100755 index dce27147..00000000 Binary files a/docs/images/home-1.jpg and /dev/null differ diff --git a/docs/images/home-2.jpg b/docs/images/home-2.jpg deleted file mode 100755 index 87112434..00000000 Binary files a/docs/images/home-2.jpg and /dev/null differ diff --git a/docs/images/home-3.jpg b/docs/images/home-3.jpg deleted file mode 100755 index 0880c0ba..00000000 Binary files a/docs/images/home-3.jpg and /dev/null differ diff --git a/docs/images/home-4.jpg b/docs/images/home-4.jpg deleted file mode 100755 index d425cc82..00000000 Binary files a/docs/images/home-4.jpg and /dev/null differ diff --git a/docs/images/home-5.jpg b/docs/images/home-5.jpg deleted file mode 100755 index c0e031bc..00000000 Binary files a/docs/images/home-5.jpg and /dev/null differ diff --git a/docs/images/home-6.jpg b/docs/images/home-6.jpg deleted file mode 100755 index 836e47b6..00000000 Binary files a/docs/images/home-6.jpg and /dev/null differ diff --git a/docs/images/home-7.jpg b/docs/images/home-7.jpg deleted file mode 100755 index af543d23..00000000 Binary files a/docs/images/home-7.jpg and /dev/null differ diff --git a/docs/images/homekit-logo.jpg b/docs/images/homekit-logo.jpg deleted file mode 100755 index 63b8a0b5..00000000 Binary files a/docs/images/homekit-logo.jpg and /dev/null differ diff --git a/docs/images/ios copy.png b/docs/images/ios copy.png deleted file mode 100755 index 462de40f..00000000 Binary files a/docs/images/ios copy.png and /dev/null differ diff --git a/docs/images/ios.png b/docs/images/ios.png deleted file mode 100755 index 462de40f..00000000 Binary files a/docs/images/ios.png and /dev/null differ diff --git a/docs/images/mobile10.png b/docs/images/mobile10.png deleted file mode 100755 index 6a29ae10..00000000 Binary files a/docs/images/mobile10.png and /dev/null differ diff --git a/docs/images/mobile11.png b/docs/images/mobile11.png deleted file mode 100755 index 6775c561..00000000 Binary files a/docs/images/mobile11.png and /dev/null differ diff --git a/docs/images/mobile12.png b/docs/images/mobile12.png deleted file mode 100755 index d2db8dbd..00000000 Binary files a/docs/images/mobile12.png and /dev/null differ diff --git a/docs/images/mobile2.png b/docs/images/mobile2.png deleted file mode 100755 index 6acc33e3..00000000 Binary files a/docs/images/mobile2.png and /dev/null differ diff --git a/docs/images/mobile3.png b/docs/images/mobile3.png deleted file mode 100755 index bc34e465..00000000 Binary files a/docs/images/mobile3.png and /dev/null differ diff --git a/docs/images/mobile4.png b/docs/images/mobile4.png deleted file mode 100755 index f7df5f5e..00000000 Binary files a/docs/images/mobile4.png and /dev/null differ diff --git a/docs/images/mobile5.png b/docs/images/mobile5.png deleted file mode 100755 index 1b0010f8..00000000 Binary files a/docs/images/mobile5.png and /dev/null differ diff --git a/docs/images/mobile6.jpg b/docs/images/mobile6.jpg deleted file mode 100755 index 3e6367cc..00000000 Binary files a/docs/images/mobile6.jpg and /dev/null differ diff --git a/docs/images/mobile7.jpg b/docs/images/mobile7.jpg deleted file mode 100755 index 5a7e52d5..00000000 Binary files a/docs/images/mobile7.jpg and /dev/null differ diff --git a/docs/images/mobile8.jpg b/docs/images/mobile8.jpg deleted file mode 100755 index 7e707ba8..00000000 Binary files a/docs/images/mobile8.jpg and /dev/null differ diff --git a/docs/images/mobile9.jpg b/docs/images/mobile9.jpg deleted file mode 100755 index 7d6ce203..00000000 Binary files a/docs/images/mobile9.jpg and /dev/null differ diff --git a/docs/images/mobile_dashboard_1.PNG b/docs/images/mobile_dashboard_1.PNG deleted file mode 100755 index 09e21aa5..00000000 Binary files a/docs/images/mobile_dashboard_1.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_2.PNG b/docs/images/mobile_dashboard_2.PNG deleted file mode 100755 index ee9d54f5..00000000 Binary files a/docs/images/mobile_dashboard_2.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_3.PNG b/docs/images/mobile_dashboard_3.PNG deleted file mode 100755 index c0ba38bb..00000000 Binary files a/docs/images/mobile_dashboard_3.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_4.PNG b/docs/images/mobile_dashboard_4.PNG deleted file mode 100755 index 81911c63..00000000 Binary files a/docs/images/mobile_dashboard_4.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_5.PNG b/docs/images/mobile_dashboard_5.PNG deleted file mode 100755 index a379e489..00000000 Binary files a/docs/images/mobile_dashboard_5.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_6.PNG b/docs/images/mobile_dashboard_6.PNG deleted file mode 100755 index afac9488..00000000 Binary files a/docs/images/mobile_dashboard_6.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_7.PNG b/docs/images/mobile_dashboard_7.PNG deleted file mode 100755 index 7c7eecd4..00000000 Binary files a/docs/images/mobile_dashboard_7.PNG and /dev/null differ diff --git a/docs/images/mobile_dashboard_8.PNG b/docs/images/mobile_dashboard_8.PNG deleted file mode 100755 index 85208077..00000000 Binary files a/docs/images/mobile_dashboard_8.PNG and /dev/null differ diff --git a/docs/images/mobile_icon copy.png b/docs/images/mobile_icon copy.png deleted file mode 100755 index d4fd114e..00000000 Binary files a/docs/images/mobile_icon copy.png and /dev/null differ diff --git a/docs/images/mobile_icon.png b/docs/images/mobile_icon.png deleted file mode 100755 index d4fd114e..00000000 Binary files a/docs/images/mobile_icon.png and /dev/null differ diff --git a/docs/images/piece-homekit.jpg b/docs/images/piece-homekit.jpg deleted file mode 100755 index 103c1d4b..00000000 Binary files a/docs/images/piece-homekit.jpg and /dev/null differ diff --git a/docs/images/reference-etat.png b/docs/images/reference-etat.png deleted file mode 100755 index 30bcbf37..00000000 Binary files a/docs/images/reference-etat.png and /dev/null differ diff --git a/docs/images/sans-reponse.jpg b/docs/images/sans-reponse.jpg deleted file mode 100755 index 7b7e6a93..00000000 Binary files a/docs/images/sans-reponse.jpg and /dev/null differ diff --git a/docs/images/siri-01.jpg b/docs/images/siri-01.jpg deleted file mode 100755 index b81daad9..00000000 Binary files a/docs/images/siri-01.jpg and /dev/null differ diff --git a/docs/images/siri-02.jpg b/docs/images/siri-02.jpg deleted file mode 100755 index 2c8743ea..00000000 Binary files a/docs/images/siri-02.jpg and /dev/null differ diff --git a/docs/images/typegen-1.png b/docs/images/typegen-1.png deleted file mode 100755 index 067c3afb..00000000 Binary files a/docs/images/typegen-1.png and /dev/null differ diff --git a/docs/images/typeginfo.png b/docs/images/typeginfo.png deleted file mode 100755 index 7c417371..00000000 Binary files a/docs/images/typeginfo.png and /dev/null differ diff --git a/docs/images/v2ConnectBox.jpeg b/docs/images/v2ConnectBox.jpeg deleted file mode 100755 index c0da35a3..00000000 Binary files a/docs/images/v2ConnectBox.jpeg and /dev/null differ diff --git a/docs/images/v2FullMenu.jpeg b/docs/images/v2FullMenu.jpeg deleted file mode 100755 index 757f5264..00000000 Binary files a/docs/images/v2FullMenu.jpeg and /dev/null differ diff --git a/docs/images/v2MenuBoxs.jpeg b/docs/images/v2MenuBoxs.jpeg deleted file mode 100755 index 1b0bd7f8..00000000 Binary files a/docs/images/v2MenuBoxs.jpeg and /dev/null differ diff --git a/docs/images/v2ModalMenuCustom.png b/docs/images/v2ModalMenuCustom.png deleted file mode 100755 index 4ae1f831..00000000 Binary files a/docs/images/v2ModalMenuCustom.png and /dev/null differ diff --git a/docs/images/v2ModifyLittleRadius.jpeg b/docs/images/v2ModifyLittleRadius.jpeg deleted file mode 100755 index ffbf2b27..00000000 Binary files a/docs/images/v2ModifyLittleRadius.jpeg and /dev/null differ diff --git a/docs/images/v2ZoneInactive.jpeg b/docs/images/v2ZoneInactive.jpeg deleted file mode 100755 index 7bce54cf..00000000 Binary files a/docs/images/v2ZoneInactive.jpeg and /dev/null differ diff --git a/docs/images/v2app.png b/docs/images/v2app.png deleted file mode 100644 index 4e9a126f..00000000 Binary files a/docs/images/v2app.png and /dev/null differ diff --git a/docs/images/windows.png b/docs/images/windows.png deleted file mode 100755 index 8bec1b28..00000000 Binary files a/docs/images/windows.png and /dev/null differ diff --git a/docs/images/ypegeaction.png b/docs/images/ypegeaction.png deleted file mode 100755 index 4bf3cb57..00000000 Binary files a/docs/images/ypegeaction.png and /dev/null differ diff --git a/docs/images/ypegelumi.png b/docs/images/ypegelumi.png deleted file mode 100755 index f137260c..00000000 Binary files a/docs/images/ypegelumi.png and /dev/null differ diff --git a/docs/pt_PT/changelog.md b/docs/pt_PT/changelog.md index 25939321..00d4ad74 100755 --- a/docs/pt_PT/changelog.md +++ b/docs/pt_PT/changelog.md @@ -5,6 +5,61 @@ > Como lembrete, se não houver informações sobre a atualização, isso significa que se trata apenas da atualização da documentação, tradução ou texto +# + +- + +# 18/06/2025 + +- Ajout alerte si api mobile désactivée ou IP blanche + +# 25/04/2025 + +- Ajout pour Max 8 Icones sur le menuCustom + + +# 24/04/2025 + +- Ajout Commande Notifications Silencieuses pour Builds : IOS 491 et Android 875 + + +# 11/04/2025 + +- Ajout paramètre Envoi NFC Direct au plugin après lecture + +# xx/08/2024 + +> **Aplicativo V1** +> +> Observe que a partir desta versão o appV1 não é mais compatível. +> Será sempre possível aceder ao seu equipamento, para eventualmente substituir os seus comandos de geolocalização e notificação. + +- Excluindo arquivos AppV1. +- Limpeza de informações armazenadas no banco de dados (config). + +# 20/08/2024 + +- Movendo informações de notificação para a guia “Celular”" + +# 08/04/2024 + +- Levando em consideração a retenção de notificações para exclusão de imagens + + +# 22/07/2024 + +- Tendo em conta a retenção de notificações +- Destino SDK 34 para Android + +# 28/05/2024 + +- Modificação de geolocalização para próxima versão do aplicativo +- Notificações de armazenamento no plugin +- Novas APIs para o aplicativo + +# 05/04/2024 + +- Compatível apenas com o 4.4 núcleos ou superior. # 15/12/2023 @@ -41,11 +96,11 @@ - FUTURA INTEGRAÇÃO APPV2 ALPHA EM PLUGIN MÓVEL - Nova Interface Futuro AppV2 - Menu Personalizado Modal Futuro AppV2 -- Modal QrCode Future AppV2 +- Código QR Modal Futuro AppV2 # 13/12/2021 -- Modo offline para QrCode (criação de QrCode sem internet.). +- Modo offline para o QR Code (criação do QR Code sem internet). - Compatibilidade 4.2 Jeedom Core # 11/10/2021 @@ -70,7 +125,7 @@ # 15/04/2020 -- Adição de pedidos para cada celular. +- Comandos adicionados para cada celular. # 31/03/2020 @@ -78,12 +133,12 @@ # 19/02/2020 --corrigir http.linha de erro 39 se o telefone não estiver autenticado na primeira conexão. +- Corrigir http.linha de erro 39 se o telefone não for autenticado na primeira conexão. # v1.3.0 - ASK notificação - Histórico de notificações - Controle deslizante com porcentagem -- grande mudança no tempo -- remoção do push para atualizar +- Mudando o tempo +- Remoção do push para atualizar diff --git a/docs/pt_PT/index.md b/docs/pt_PT/index.md index e05c624c..6e565268 100755 --- a/docs/pt_PT/index.md +++ b/docs/pt_PT/index.md @@ -1,326 +1,103 @@ # Mobile Plugin -Plug-in para usar o aplicativo Jeedom Mobile. +Le plugin Mobile permet d'utiliser l'application Mobile Jeedom. -O aplicativo móvel Jeedom requer a instalação deste plug-in para que a caixa possa se comunicar com o aplicativo móvel. +Pour que l'application Mobile puisse communiquer avec votre Box Jeedom, il est nécessaire d'installer ce plugin. -# Configuração do plugin Mobile para Application V2 +# Configuration du plugin Mobile pour l'application V2 -Depois de instalar o plugin, você só precisa ativá-lo : +Après avoir installé le plugin, activez-le simplement : -![mobile1](./images/mobile1.png) + # Primeira conexão com o aplicativo V2 -Para conectar seu telefone : existem 2 métodos possíveis; -na primeira tela do aplicativo, você pode conectar sua conta de mercado e, assim, encontrar todas as caixas associadas a esta conta ou simplesmente adicionar uma caixa. +Pour connecter votre téléphone, deux méthodes sont disponibles : +Sur le premier écran de l'application, vous pouvez soit connecter votre compte Market pour retrouver toutes les Box associées à ce compte, soit ajouter une Box manuellement. -![v2ConnectMarket](./images/v2firstConnect.jpeg) + -> **IMPORTANTE** -> -> Para aproveitar as funcionalidades do aplicativo, o núcleo do seu Jeedom deve estar em 4.4.0 mínimo +> **IMPORTANTE** +> Pour profiter pleinement des fonctionnalités de l'application, votre Core Jeedom doit être en version 4.4.0 ou supérieure. -#### **LOGIN VIA CONTA DE MERCADO** : +### **LOGIN VIA CONTA DE MERCADO** -![v2ConnectMarket](./images/v2connectMarket.PNG) + -Tudo o que você precisa fazer é inserir seu Market ID e senha. +Saisissez simplement votre identifiant et mot de passe Market pour vous connecter. -#### **CONEXÃO VIA CAIXA ID** : +### **Connexion via l'ID de la Box** -![v22methods](./images/v22methods.PNG) + -Várias opções nesta tela : +Sur cet écran, plusieurs options s'offrent à vous : -- Você insere a url do seu Jeedom (interno ou externo), bem como os identificadores de acesso a ele e confirma com o botão LOGIN +- Entrez l'URL de votre Jeedom (interne ou externe), ainsi que vos identifiants d'accès, puis cliquez sur le bouton **CONNEXION**. +- Cliquez sur **QR Code** : un nouvel écran s'affiche, vous permettant de scanner un QR Code depuis l'onglet QR Code du plugin Mobile de la Box que vous souhaitez ajouter. -- Você clica no QR Code : uma nova tela aparece; você pode digitalizar um QRCode do plugin Mobile da caixa que deseja adicionar, através da guia QRCODE do plugin. + -![v2ModalQrApp](./images/v2QRCodeConnect.PNG) +> **Aba Qr Code do plugin Mobile** +> -> Aba Qr Code do plugin Mobile +Une fois cette étape terminée, vous êtes enregistré dans l'application. Si vous possédez le plugin Mobile, vous aurez accès à des fonctionnalités comme les notifications, les QR Codes, ou encore la personnalisation du menu. -> > ![v2ModalPlugin](./images/v2ModalQrCode.png) +Dans le menu, un onglet **Boxs** regroupe toutes les Box associées à votre compte Market. -Uma vez que esta primeira etapa foi concluída, você está registrado no aplicativo: se você tiver o plugin Mobile, terá acesso através do menu a Notificações, QrCodes, personalização de Menu .... + -No menu, você terá a aba Caixas, que agrupa todas as caixas presentes nesta conta de mercado + -![v2MenuBoxs](./images/v2MenuBoxs.PNG) +Cliquez sur la Box où le plugin Mobile est installé, puis identifiez-vous pour y accéder. +La Box validée apparaîtra en haut de la liste. Vous pouvez répéter cette opération pour plusieurs Box. -![v2floutedBoxs](./images/v2floutedBoxs.png) +En cliquant sur le bouton **+** en bas à droite, vous accédez à différentes options : -Basta clicar na caixa onde está instalado o plugin Mobile, depois se identificar para acessar a caixa. +- Ajouter une Box via un QR Code (depuis le plugin Mobile), +- Ajouter une Box manuellement, +- Détecter les Box Atlas et Luna sur le réseau Wi-Fi, +- Synchroniser les informations de votre compte Market. -A caixa irá para o topo da lista, validada a sua autenticação. -Você pode fazer isso para várias caixas. + -Você também pode clicar no botão + no canto inferior direito para acessar diferentes opções; +Pour accéder à des fonctionnalités comme les notifications, la personnalisation du menu ou la géolocalisation, vous devez d'abord sélectionner une Box comme "actuelle". -- QrCode para adicionar uma caixa à lista através do plugin Mobile, -- Manual para adicionar manualmente uma caixa -- Detecção Atlas e Luna (se estiver no Wifi, irá detectar as caixas na rede) -- Sincronização do Market para atualizar as informações configuradas da conta do Market - -![v2greenBtnAdd](./images/v2greenBtnAdd.PNG) - -Para acessar recursos como Notificações, Personalização de Menu ou Geolocalização, você deve primeiro ter selecionado pelo menos uma caixa atual' - -![v2ActualBoxFlouted](./images/v2ActualBoxFlouted.jpeg) + # Como funciona a geolocalização -Adicionamos uma zona de geolocalização clicando no ícone + - -![v2AddZone](./images/v2AddZone.jpeg) - -Digitamos o endereço que procuramos, validamos com Enter no seu telefone; o cursor irá então se posicionar no endereço desejado. -Podemos então adicionar um nome e salvar a zona. - -Isto irá criar um novo comando no seu equipamento móvel, do tipo binário, que corresponderá às entradas e saídas da zona se a geolocalização estiver ativada no seu telemóvel. - -Também podemos alterar o raio da zona, para estender a detecção da zona. - -![v2ModifyBigRadius](./images/v2ModifyBigRadius.jpeg) - -# FAQ - -> **Tenho problemas com notificações** -> -> Esta parte está sendo melhorada e otimizada no aplicativo beta. - -> **Tenho problemas para exibir meu webview** -> -> No seu Jeedom, nas Preferências, verifique se a página inicial do celular é HOME. - -# Configurando o plugin Mobile V1 - -Depois de instalar o plugin, você só precisa ativá-lo : - -![mobile1](../images/mobile1.png) - -**Configuração** - -Para configurar o plug-in, você deve adicionar os telefones que poderão acessar o Jeedom. - -Para adicionar um telefone : **Plugins** → **Comunicação** → **App -Mobile** → **Adicionar** - -![mobile2](../images/mobile2.png) - -Aqui estão os parâmetros para inserir : - -- **Nome do equipamento móvel** : Nome do telefone -- **Ativar** : Ativando o acesso para este celular -- **Tipo de celular** : Seleção de SO do telefone (iOS, Android) -- **Usuário** : Usuário associado a este acesso - -> **Dica** -> -> A escolha do usuário é importante, pois determina o equipamento ao qual ele terá acesso de acordo com seus direitos. - -![mobile3](../images/mobile3.png) - -Após salvar, você receberá um QRCode permitindo que o aplicativo se configure. - -# Configuração de plugins e comandos recebidos pelo aplicativo - -Após a inicialização do Mobile Plugin, você tem a possibilidade de modificar os tipos genéricos de pedidos, plugins e peças. - -![mobile10](../images/mobile10.png) - -Ao clicar em um plug-in, você pode autorizá-lo ou não a conversar com o aplicativo móvel e configurar cada um dos tipos genéricos associados aos seus comandos. - -![mobile11](../images/mobile11.png) - -Ao clicar em uma peça, você pode autorizá-la ou não a estar presente no aplicativo móvel e configurar cada um dos tipos genéricos associados a seus pedidos. - -![mobile12](../images/mobile12.png) - -# Configuração de aplicativo para dispositivos móveis - -Você encontrará os aplicativos nas persianas móveis : - -**Android Google Play** - -![Google Play FR](../images/Google_Play_FR.png) - -**Apple App Store** - -![App Store FR](../images/App_Store_FR.png) - -## Primeiro lançamento do aplicativo - -Ao iniciar o aplicativo Mobile pela primeira vez, você receberá um tutorial para ajudá-lo a configurá-lo. - -Depois de baixar e instalar seu aplicativo móvel Jeedom, inicie o aplicativo em seu smartphone. - -Você chega em um tutorial de configuração que recomendamos que você siga. Algumas etapas foram realizadas anteriormente. - -Você poderá escolher entre uma configuração manual ou automática pelo QRcode. Se você optar pela configuração do QRcode, basta exibir o QRcode presente no plug-in Mobile App no equipamento para smartphone criado anteriormente. Nesse caso, o aplicativo recuperará automaticamente toda a configuração do seu Jeedom e se conectará automaticamente. Quando estiver conectado à sua casa via Wifi, o aplicativo usará automaticamente o endereço Ethernet Jeedom interno à sua rede. Quando você está conectado em 4G ou 3G, ele usa seu endereço externo para conectar-se ao seu Jeedom (por exemplo, através do serviço DNS Jeedom, se você o usar). Se você escolher a configuração manual, nesse caso, será necessário inserir manualmente os endereços IP internos e externos do seu Jeedom. Esta opção está reservada a um público informado. - -O aplicativo será sincronizado e você chegará à sua página inicial (precedida por um mini guia de apresentação). - -O aplicativo móvel Jeedom está pronto para funcionar. - -## Favoritos - -No aplicativo, você pode ter Favoritos (atalhos de comandos, plugins, cenários). +Ajoutez une zone de géolocalisation en cliquant sur l'icône **+**. -Aqui está o procedimento para criá-los : + -Clique em um dos + na tela inicial do aplicativo : +Saisissez l'adresse recherchée et validez avec la touche Entrée de votre téléphone. Le curseur se positionnera automatiquement sur l'adresse. Vous pouvez ensuite nommer et sauvegarder la zone. -![mobile dashboard 1](../images/mobile_dashboard_1.PNG) +Cela créera une commande binaire sur votre équipement mobile, qui indiquera les entrées et sorties de la zone si la géolocalisation est activée sur votre téléphone. -Você chegará à página de seleção do tipo de atalho : +Vous pouvez également ajuster le rayon de la zone pour élargir la détection. -![mobile dashboard 2](../images/mobile_dashboard_2.PNG) + -Por exemplo, vamos executar uma ação, por isso nos oferece moedas / objetos : +Pour supprimer une zone, cliquez sur **Éditer**, puis sur l'icône Corbeille. Cela supprimera la zone de l'application ainsi que la commande associée sur la Box. -![mobile dashboard 3](../images/mobile_dashboard_3.PNG) +# Paramètres de l'application -Em seguida, basta selecionar a ação que deseja como atalho : +Vous pouvez configurer la durée d'affichage des notifications in-app selon leur type (Succès, Info, Erreur). Par défaut, elles sont reglées sur 5 secondes. -![mobile dashboard 4](../images/mobile_dashboard_4.PNG) + -É então possível personalizar a cor deste (no momento, três cores são propostas) : - -![mobile dashboard 5](../images/mobile_dashboard_5.PNG) - -Bem como os dois textos associados : - -![mobile dashboard 6](../images/mobile_dashboard_6.PNG) -![mobile dashboard 7](../images/mobile_dashboard_7.PNG) - -Aqui, você tem agora um atalho do seu pedido (na versão 1.1 Espera-se que os comandos liga / desliga apareçam na mesma tecla). - -![mobile dashboard 8](../images/mobile_dashboard_8.PNG) - -# Como configurar corretamente tipos genéricos - -## Tipos genéricos no plug-in Mobile - -Melhor que as palavras, aqui está um exemplo dos créditos genéricos para uma luz com todos os seus controles (veja também a tabela Luz abaixo)) : - -![generic type in plugin](../images/generic_type_in_plugin.jpg) - -## Tabelas de modelo de aplicativo - -### As luzes - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![LUZ](../images/LIGHT_1.jpg) | `Botão de luz ligado`
`Botão apagado` | `LIGHT_ON`
`LIGHT_OFF` | presença de dois botões "ON" e "Off" sem feedback de status. | -| ![LUZ](../images/LIGHT_2.jpg) | `Botão de luz ligado`
`Botão apagado`
`Luz do estado` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE` | Feedback de status presente, o botão esquerdo alterna entre ligado e desligado | -| ![LUZ](../images/LIGHT_2.jpg) | `Botão de alternância de luz`
`Luz do estado` | `LIGHT_TOGGLE`
`LIGHT_STATE` | Feedback de status presente, o botão esquerdo alterna entre ligado e desligado | -| ![LUZ](../images/LIGHT_3.jpg) | `Botão de luz ligado`
`Botão apagado`
`Luz do estado`
`Light Slider` | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER` | Feedback de status presente, o botão esquerdo permite alternar entre On e Off e o controle deslizante permite controlar a intensidade | -| ![LUZ](../images/LIGHT_4.jpg) | `Botão de luz ligado`
`Botão apagado`
`Luz do estado`
`Light Slider`
`Cor clara (informação)`
`Cor clara (ação)`
`Light Mode` (opcional, é usado para ter modos de luz, por exemplo, arco-íris na Hue philips)) | `LIGHT_ON`
`LIGHT_OFF`
`LIGHT_STATE`
`LIGHT_SLIDER`
`LIGHT_COLOR`
`LIGHT_SET_COLOR`
`LIGHT_MODE` | Feedback de status presente, o botão esquerdo permite alternar entre On e Off e o controle deslizante permite controlar a intensidade. No círculo, a cor da lâmpada está presente e, quando você clica nela, pode alterar a cor e ativar um modo | - -### As tomadas - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-------------------------------: | :--------------------------------------------------------------------------- | :------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------: | -| ![ENERGIA](../images/ENERGY_1.jpg) | `Botão de soquete ativado`
`Botão fora do soquete` | `ENERGY_ON`
`ENERGY_OFF` | presença de dois botões "ON" e "Off" sem feedback de status. | -| ![ENERGIA](../images/ENERGY_2.jpg) | `Botão de soquete ativado`
`Botão fora do soquete`
Tomada de Estado | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE` | Feedback de status presente, o botão esquerdo alterna entre ligado e desligado | -| ![ENERGIA](../images/ENERGY_3.jpg) | `Botão de soquete ativado`
`Botão fora do soquete`
Tomada de Estado
`Soquete deslizante` | `ENERGY_ON`
`ENERGY_OFF`
`ENERGY_STATE`
`ENERGY_SLIDER` | Feedback de status presente, o botão esquerdo permite alternar entre On e Off e o controle deslizante permite controlar a intensidade | - -### As persianas - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------: | :-------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------: | -| ![Aba](../images/FLAP_1.jpg)   | `Montar painel de botões`
`Painel de botões para baixo`
`Painel do botão Stop '
Painel de estado (opcional) | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE` (opcional) | Presença de três botões "Para cima", "Para baixo", "Parar", feedback opcional do status. | -| ![Aba](../images/FLAP_2.jpg)   | `Montar painel de botões`
`Painel de botões para baixo`
`Painel do botão Stop '
Painel de estado
`Painel do botão deslizante` | `FLAP_UP`
`FLAP_DOWN`
`FLAP_STOP`
`FLAP_STATE`
`FLAP_SLIDER` | Presença de um controle deslizante, com um botão Acima / Abaixo em Alternar (com ícone de status) | - -### Inondation - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------: | :--------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :------------------------------------------------------------------: | -| ![ENCHENTE](../images/FLOOD.jpg)   | `Innondation`
`TEMPERATURE` (opcional)
Humidade (opcional)
`SABOTAGE` (opcional) | `FLOOD`
`TEMPERATURE` (opcional)
«UMIDADE» (opcional)
«UMIDADE» (opcional) | Permite que você tenha seu sensor de inundação completo em uma única linha. | - -### Serrure - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :---------------------------: | :--------------------------------------------------------------------- | :-------------------------------------------- | :---------------------------------------------------------------------------: | -| ![TRANCAR](../images/LOCK.jpg)   | `Bloqueio de estado`
`Abrir botão de bloqueio`
`Fechar botão de bloqueio` | `LOCK_STATE`
`LOCK_OPEN`
`LOCK_CLOSE` | Feedback de status presente, o botão esquerdo alterna entre ligado e desligado | - -### Sereia - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------: | :----------------------------------------------------------- | :------------------------------------------- | :---------------------------------------------------------------------------: | -| ![SIRENE](../images/SIREN.jpg)   | `Estado da sirene`
`Botão da sirene ligado`
`Botão da sirene desativado` | `SIREN_STATE`
`SIREN_ON`
`SIREN_OFF` | Feedback de status presente, o botão esquerdo alterna entre ligado e desligado | - -### Fumaça - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------: | :----------------------------------- | :----------------------------------- | :--------------------------------------------------------------: | -| ![FUMAÇA](../images/SMOKE.jpg)   | `Fumaça`
`TEMPERATURE` (opcional) | `SMOKE`
`TEMPERATURE` (opcional) | Permite que você tenha seu sensor de fumaça completo em uma única linha. | - -### Temperatura - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------------------: | :-------------------------------------- | :-------------------------------------- | :---------: | -| ![Temperatura](../images/TEMPERATURE.jpg)   | TEMPERATURA
Humidade (opcional) | `TEMPERATURE`
«UMIDADE» (opcional) | Veja a imagem. | - -### Presença - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-----------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------ | :---------: | -| ![Presença](../images/PRESENCE.jpg)   | PRESENÇA
`TEMPERATURE` (opcional)
`Brightness` (opcional)
Humidade (opcional)
`UV` (opcional)
`SABOTAGE` (opcional) | `PRESENCE`
`TEMPERATURE` (opcional)
`BRILHO` (opcional)
«UMIDADE» (opcional)
`UV` (opcional)
`SABOTAGE` (opcional) | Veja a imagem. | - -### Ouvrant - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :---------------------------------: | :--------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------------: | -| ![ABERTURA](../images/OPENING.jpg)   | `Porta/Janela`
`TEMPERATURE` (opcional) | `OPENING / OPENING_WINDOW`
`TEMPERATURE` (opcional) | Consulte Imagem (ou seja, você pode escolher entre janela e porta). | - -### Fio piloto - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :---------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![AQUECIMENTO](../images/HEATING.jpg)   | `Botão LIGADO do aquecimento do fio piloto`
`Botão OFF do fio piloto de aquecimento`
`Estado do fio piloto de aquecimento`
`Aquecimento do fio piloto de botão` (opcional) | `HEATING_ON`
`HEATING_OFF`
`HEATING_STATE`
`HEATING_OTHER` | Os botões ON / OFF e Status permitem criar o botão na extrema esquerda do modelo e os `fios de aquecimento do botão piloto 'existem para adicionar botões (5 no máximo) | - -## OS JOKERS - -### Ação genérica - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :-------------------------------: | :--------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ![AÇÃO](../images/ACTION.jpg)   | `Ação Genérica` | `GENERIC_ACTION` | O botão assume a forma do tipo de ação. Por padrão, é uma alternância, se for uma mensagem, então você tem um envelope, se for um controle deslizante, você tem um controle deslizante, etc... | - -### Informações genéricas - -| Imagem | Tipo genérico | Parte do plugin Dev | Descrição | -| :---------------------------: | :-------------------------------- | :---------------- | :-----------------------------------------: | -| ![INFORMAÇÕES](../images/INFO.jpg)   | `Informações Genéricas` | `GENERIC_INFO` | O botão assume a forma do tipo de informação. | - -# Troubleshooting - -**Estou na versão Android do aplicativo (1.0.1 ou 1.0.0) Não consigo acessar minhas partes ou mesmo a configuração do aplicativo.** - -Você tinha um pop-up alertando sobre uma preocupação com as configurações de acessibilidade; basta acessar as configurações de acessibilidade do seu celular e desmarcar os aplicativos usando esta opção. (Uma correção será trazida em breve no aplicativo) - -**Eu tenho uma mensagem em uma das linhas dos meus módulos dizendo que -sem um tipo genérico !** - -Ao ler esta mensagem, ele informa qual tipo genérico está ausente para criar um modelo compatível. Apenas aplique.Consulte o [doc capítulo Tipo genérico](https://www.jeedom.com/doc/documentation/plugins/mobile/pt_PT/mobile#_configuration_des_plugins_et_commandes_que_reçoit_l_app). - -**Estou com um problema com um dos plug-ins chamado totalmente integrado, -termostato, alarme, câmera) !** - -Não hesite em acessar seu módulo e clique em Salvar novamente. Isso incluirá novamente os tipos genéricos associados ao módulo. +# FAQ -**Não foi possível colocar uma informação sobre as boas-vindas do aplicativo !** +> **Mon mobile ne possède pas d'IQ (identifiant unique)** +> Le plugin Mobile a besoin de l'IQ du téléphone pour l'identifier. Si ce paramètre est manquant dans les logs du plugin, rendez-vous dans le menu Préférences de l'application. Une alerte vous indiquera que la récupération de l'IQ est en cours. -Isso é normal, estará disponível na versão 1.1. +> **Tenho problemas com notificações** +> Cette fonctionnalité est en cours d'amélioration et d'optimisation dans la version bêta de l'application. -**Eu tenho o aplicativo que ocupa muita memória no meu -Telefone !** +> **Tenho problemas para exibir meu webview** +> Vérifiez dans les Préférences de votre Jeedom que la page d'accueil mobile est bien définie sur **ACCUEIL**. -Houve um erro nas versões 1.0.0 e 1.0.1 na parte da câmera. O problema não acontecerá novamente com 1.0.2, para excluir o cache sem aumentar o preço do aplicativo, basta acessar a configuração do seu aplicativo móvel e clicar em "excluir o cache". +> **** +> : . : ". . . . -**Tenho uma preocupação de primeira sincronização no aplicativo ou de sql no plug-in móvel !** -Você precisa colocar tipos genéricos e autorizar o plug-in a enviar genéricos, veja o documento um pouco mais alto. diff --git a/plugin_info/configuration.php b/plugin_info/configuration.php index 0955b1e8..1958a18c 100755 --- a/plugin_info/configuration.php +++ b/plugin_info/configuration.php @@ -25,7 +25,7 @@
- {{Notifications de l'app}} + {{Notifications de l'app}}
diff --git a/plugin_info/info.json b/plugin_info/info.json index b6322d83..82c54028 100755 --- a/plugin_info/info.json +++ b/plugin_info/info.json @@ -2,16 +2,16 @@ "id": "mobile", "name": "App Mobile", "description": { - "fr_FR": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.", - "en_US": "Attzltion the v1 app is not compatible with the latest Android. The official Jeedom application allows you to control your Jeedom home automation system, whether in local Wifi, or on your operator's 3G\/4G network. The app automatically connects to your Jeedom with automatic initialization by QRcode, no configuration is necessary. (possibility to do it manually) You will find on your mobile all the features of your Jeedom. You will be able to customize your application with shortcuts and more... Current features: - Management of your scenarios. - Management of your home automation according to your rooms and equipment. - Shift and automatic status return - Compatibility with plugins, such as thermostat, alarm, camera etc... - Customizable interface with shortcuts. - General home automation summary and by room - Notifications (with ASK support) - Display of Designs More features and compatibilities are coming in future updates! Privacy. No data (home automation or personal) is stored or kept on our servers", - "es_ES": "Attzltion, la aplicación v1 no es compatible con la última versión de Android. La aplicación oficial Jeedom le permite controlar su sistema domótico Jeedom, ya sea en Wifi local o en la red 3G\/4G de su operador. La aplicación se conecta automáticamente a su Jeedom con inicialización automática por código QR, no es necesaria ninguna configuración. (posibilidad de hacerlo manualmente) Encontrará en su móvil todas las características de su Jeedom. Podrás personalizar tu aplicación con accesos directos y más... Características actuales: - Gestión de sus escenarios. - Gestión de la domótica de tu hogar según tus estancias y equipamientos. - Turno y retorno de estado automático - Compatibilidad con complementos, como termostato, alarma, cámara, etc. - Interfaz personalizable con accesos directos. - Resumen domótica general y por estancias - Notificaciones (con soporte ASK) - Exhibición de Diseños ¡Más características y compatibilidades vendrán en futuras actualizaciones! Privacidad. Ningún dato (domótico o personal) es almacenado o guardado en nuestros servidores", - "de_DE": "Achtung: Die v1-App ist nicht mit dem neuesten Android kompatibel. Mit der offiziellen Jeedom-Anwendung können Sie Ihr Jeedom-Hausautomationssystem steuern, sei es im lokalen WLAN oder im 3G\/4G-Netzwerk Ihres Betreibers. Die App verbindet sich automatisch mit Ihrem Jeedom mit automatischer Initialisierung per QR-Code, eine Konfiguration ist nicht erforderlich. (Möglichkeit, dies manuell zu tun) Auf Ihrem Handy finden Sie alle Funktionen Ihres Jeedom. Sie können Ihre Anwendung mit Verknüpfungen und mehr anpassen ... Aktuelle Funktionen: - Verwaltung Ihrer Szenarien. - Verwaltung Ihrer Hausautomation entsprechend Ihren Räumen und Ihrer Ausstattung. - Umschalten und automatische Statusrückgabe - Kompatibilität mit Plugins wie Thermostat, Alarm, Kamera usw. - Anpassbare Benutzeroberfläche mit Verknüpfungen. - Allgemeine Zusammenfassung der Hausautomation und nach Raum - Benachrichtigungen (mit ASK-Unterstützung) - Anzeige von Designs Weitere Funktionen und Kompatibilitäten folgen in zukünftigen Updates! Privatsphäre. Auf unseren Servern werden keine Daten (hausautomatische oder persönliche) gespeichert oder gespeichert", - "pt_PT": "Attzltion, o aplicativo v1 não é compatível com o Android mais recente. O aplicativo oficial Jeedom permite que você controle seu sistema de automação residencial Jeedom, seja no Wifi local, seja na rede 3G\/4G da sua operadora. O app se conecta automaticamente ao seu Jeedom com inicialização automática por QRcode, não sendo necessária nenhuma configuração. (possibilidade de fazer manualmente) Você encontrará no seu celular todas as funcionalidades do seu Jeedom. Você poderá customizar seu aplicativo com atalhos e muito mais... Características atuais: - Gestão dos seus cenários. - Gestão da sua domótica de acordo com as suas divisões e equipamentos. - Turno e retorno automático de status - Compatibilidade com plugins, como termostato, alarme, câmera etc... - Interface personalizável com atalhos. - Resumo da domótica geral e por divisão - Notificações (com suporte ASK) - Exibição de Projetos Mais recursos e compatibilidades estão chegando em futuras atualizações! Privacidade. Nenhum dado (doméstico ou pessoal) é armazenado ou mantido em nossos servidores", - "ru_RU": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", - "id_ID": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", - "it_IT": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", - "ja_JP": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", - "tr": "Attzltion l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" + "fr_FR": "L’app V2 nécessite Android14 ou IOS 12.4 minimum. Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 4G/%G de votre opérateur. L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique - Interface personnalisable avec les raccourcis Notifications (avec prise en charge du ASKD'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs.", + "en_US": "Warning: the BETA version no longer supports the V1 app, it is reserved for the new V2 app (currently beta). Requires Android14 or IOS 12.4 minimum. Please note that the v1 app is not compatible with the latest Android. The official Jeedom application allows you to control your Jeedom home automation system, whether in local WiFi, or on your operator's 3G\/4G network. The app automatically connects to your Jeedom with automatic initialization by QRcode, no configuration is necessary. (possibility to do it manually) You will find all the features of your Jeedom on your mobile. You will be able to customize your application with shortcuts and more... Current features: - Management of your scenarios. - Management of your home automation based on your rooms and equipment. - Automatic shift and return to state - Compatibility with plugins, such as thermostat, alarm, camera etc... - Customizable interface with shortcuts. - General and room-by-room home automation summary - Notifications (with ASK support) - Displaying Designs More features and compatibilities are coming in future updates! Respect for privacy. No data (home automation or personal) is stored or kept on our servers", + "es_ES": "Tenga en cuenta: la versión BETA ya no es compatible con la aplicación V1, está reservada para la nueva aplicación V2 (actualmente beta). Requiere Android14 o IOS 12.4 mínimo. Tenga en cuenta que la aplicación v1 no es compatible con la última versión de Android. La aplicación oficial Jeedom te permite controlar tu sistema domótico Jeedom, ya sea a través de WiFi local o en la red 3G\/4G de tu operador. La aplicación se conecta automáticamente a tu Jeedom con inicialización automática mediante código QR, no es necesaria ninguna configuración. (posibilidad de hacerlo manualmente) Encontrarás todas las funciones de tu Jeedom en tu móvil. Podrás personalizar tu aplicación con atajos y más... Características actuales: - Gestión de tus escenarios. - Gestión de tu domótica en función de tus estancias y equipamientos. - Cambio y retorno automático de estado. - Compatibilidad con complementos, como termostato, alarma, cámara, etc... - Interfaz personalizable con atajos. - Resumen general de domótica y por estancias - Notificaciones (con soporte ASK) - Exhibición de Diseños ¡Más funciones y compatibilidad estarán disponibles en futuras actualizaciones! Respeto a la privacidad. No se almacena ni retiene ningún dato (domótico o personal) en nuestros servidores", + "de_DE": "Bitte beachten Sie: Die BETA-Version unterstützt die V1-App nicht mehr, sie ist für die neue V2-App (derzeit Beta) reserviert. Erfordert mindestens Android14 oder IOS 12.4. Bitte beachten Sie, dass die v1-App nicht mit dem neuesten Android kompatibel ist. Mit der offiziellen Jeedom-Anwendung können Sie Ihr Jeedom-Hausautomationssystem steuern, sei es über lokales WLAN oder über das 3G\/4G-Netzwerk Ihres Betreibers. Die App verbindet sich automatisch mit Ihrem Jeedom mit automatischer Initialisierung per QR-Code, eine Konfiguration ist nicht erforderlich. (Möglichkeit, dies manuell zu tun) Sie finden alle Funktionen Ihres Jeedom auf Ihrem Handy. Sie können Ihre Anwendung mit Verknüpfungen und mehr personalisieren ... Aktuelle Funktionen: - Verwaltung Ihrer Szenarien. - Verwaltung Ihrer Hausautomation entsprechend Ihren Räumen und Ihrer Ausstattung. - Automatische Statusverschiebung und -rückkehr - Kompatibilität mit Plugins wie Thermostat, Alarm, Kamera usw. - Anpassbare Benutzeroberfläche mit Verknüpfungen. - Allgemeine Zusammenfassung der Hausautomation und nach Raum - Benachrichtigungen (mit ASK-Unterstützung) - Anzeige von Designs Weitere Funktionen und Kompatibilität folgen in zukünftigen Updates! Respekt vor der Privatsphäre. Auf unseren Servern werden keine Daten (hausautomatische oder persönliche) gespeichert oder aufbewahrt", + "pt_PT": "Observação: a versão BETA não suporta mais o aplicativo V1, está reservada para o novo aplicativo V2 (atualmente beta). Requer no mínimo Android14 ou IOS 12.4. Observe que o aplicativo v1 não é compatível com o Android mais recente. O aplicativo oficial Jeedom permite que você controle seu sistema de automação residencial Jeedom, seja via WiFi local, ou na rede 3G\/4G da sua operadora. O aplicativo se conecta automaticamente ao seu Jeedom com inicialização automática por QRcode, nenhuma configuração é necessária. (possibilidade de fazer manualmente) Você encontrará todos os recursos do seu Jeedom no seu celular. Você poderá personalizar seu aplicativo com atalhos e muito mais... Recursos atuais: - Gestão dos seus cenários. - Gestão da sua domótica de acordo com as suas divisões e equipamentos. - Mudança e retorno automático de status - Compatibilidade com plugins, como termostato, alarme, câmera etc... - Interface personalizável com atalhos. - Resumo geral de automação residencial e por cômodo - Notificações (com suporte ASK) - Exibição de Projetos Mais recursos e compatibilidade chegarão em atualizações futuras! Respeito pela privacidade. Nenhum dado (domótico ou pessoal) é armazenado ou retido em nossos servidores", + "ru_RU": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", + "id_ID": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", + "it_IT": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", + "ja_JP": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs", + "tr": "Attention : la version BETA ne supporte plus l'app V1, elle est réservée à la nouvelle app V2 (beta actuellement). Nécessite Android14 ou IOS 12.4 minimum.Attention, l'app v1 n'est pas compatible avec le dernier Android. L'application officielle Jeedom permet le pilotage de votre système domotique Jeedom, que ce soit en Wifi local, ou sur le réseau 3G\/4G de votre opérateur.L'app se connecte automatiquement à votre Jeedom avec une initialisation automatique par QRcode, aucune configuration n'est nécessaire. (possibilité de le faire manuellement)Vous retrouverez sur votre mobile toutes les fonctionnalités de votre Jeedom.Vous pourrez personnaliser votre application avec des raccourcis et plus encore...Fonctionnalités actuelles:- Gestion de vos scénarios.- Gestion de votre domotique en fonction de vos pièces et équipements.- Maj et retour d'état automatique- Compatibilité aves les plugins, tel que thermostat, alarme, caméra etc...- Interface personnalisable avec les raccourcis.- Résumé domotique général et par pièce- Notifications (avec prise en charge du ASK)- Affichage des Designs D'autres fonctionnalités et compatibilités sont à venir dans les prochaines mises à jour !Respect de la vie privée.Aucune donnée (domotique ou personnelle) n'est stockée ou conservée sur nos serveurs" }, "licence": "AGPL", "author": "Jeedom SAS", @@ -21,7 +21,6 @@ "hasOwnDeamon": false, "maxDependancyInstallTime": 0, "category": "communication", - "version": "0.4", "changelog": "https:\/\/doc.jeedom.com\/#language#\/plugins\/communication\/mobile\/changelog", "documentation": "https:\/\/doc.jeedom.com\/#language#\/plugins\/communication\/mobile\/", "language": [ @@ -44,6 +43,7 @@ "diy", "mobile", "v4", + "atlas", "luna" ], "changelog_beta": "https:\/\/doc.jeedom.com\/#language#\/plugins\/communication\/mobile\/beta\/changelog", diff --git a/plugin_info/install.php b/plugin_info/install.php index 5ca9d369..64e3de82 100755 --- a/plugin_info/install.php +++ b/plugin_info/install.php @@ -18,55 +18,189 @@ function mobile_install() { - $oldFiles = [dirname(__FILE__) . '/../desktop/css/panel.css', - dirname(__FILE__) . '/../desktop/php/panelMenuCustom.php', - dirname(__FILE__) . '/../desktop/js/panelMenuCustom.js', - dirname(__FILE__) . '/../desktop/modal/health.php']; - foreach ($oldFiles as $oldFile) { - if (file_exists($oldFile)) { - shell_exec('rm ' . $oldFile); - } + /* function launched when activating the plugin or when installing the plugin */ + log::add('mobile', 'debug', '┌────────── :fg-warning: Launch function mobile_install() :/fg: ──────────'); + + /* Create folder for notifications */ + $pathNotifications = dirname(__FILE__) . '/../core/data/notifications/'; + if (!is_dir($pathNotifications)) { + log::add('mobile', 'debug', '| creating folder for the notifications'); + mkdir($pathNotifications, 0775, true); } - //config::save('displayMobilePanel',1, 'mobile'); - jeedom::getApiKey('mobile'); + log::add('mobile', 'debug', '└───────────────────────────────────────────'); } - - function mobile_update() { - // config::save('displayMobilePanel',1, 'mobile'); + /* function launched when updating plugin */ + log::add('mobile', 'debug', '┌────────── :fg-warning: Launch function mobile_update() :/fg: ──────────'); + + /* Create folder for notifications */ + $pathNotifications = dirname(__FILE__) . '/../core/data/notifications/'; + if (!is_dir($pathNotifications)) { + log::add('mobile', 'debug', '| creating folder for the notifications'); + mkdir($pathNotifications, 0775, true); + } + $mobiles = eqLogic::byType('mobile'); - foreach($mobiles as $mobile){ + $migrateLogicalId = array('phoneBattery' => 'battery::level', 'phoneCharging' => 'battery::isCharging'); + foreach ($mobiles as $mobile) { + /* Delete mobile with bad logicalId */ + if ($mobile->getLogicalId() == null || $mobile->getLogicalId() == "") { + log::add('mobile', 'debug', '| Removing equipment ' . $mobile->getId() . ' because it does not contain a logicalId'); + $mobile->remove(); + continue; + } + /* Set menu by defaut if no exist */ $customMenu = $mobile->getConfiguration('menuCustomArray'); - if(!isset($customMenu)){ - $icons = $mobile->getConfiguration('nbIcones', 3); - $menuCustomArray = array(); - for($i=1; $i < intval($icons) + 1; $i++){ - $menuCustomArray[$i]['selectNameMenu'] = $mobile->getConfiguration('selectNameMenu'.$i); - $menuCustomArray[$i]['renameIcon'] = $mobile->getConfiguration('renameIcon'.$i); - $menuCustomArray[$i]['spanIcon'] = $mobile->getConfiguration('spanIcon'.$i); - $menuCustomArray[$i]['urlUser'] = $mobile->getConfiguration('urlUser'.$i); - } + if (empty($customMenu)) { + log::add('mobile', 'debug', '| Assigning a default menu to the equipment ' . $mobile->getId()); + $menuCustomArray = mobile::getMenuDefaultV2(); + $mobile->setConfiguration('nbIcones', count($menuCustomArray)); + $mobile->setConfiguration('defaultIdMobile', $mobile->getId()); $mobile->setConfiguration('menuCustomArray', $menuCustomArray); - $mobile->save(); } + $mobile->save(); + /* Migrate logicalId for cmdForSpecificChannel */ + if ($mobile->getConfiguration('appVersion', 1) == '1') continue; + foreach ($migrateLogicalId as $oldLogical => $newLogical) { + $cmd = cmd::byEqLogicIdAndLogicalId($mobile->getId(), $oldLogical); + if (is_object($cmd)) { + if ($oldLogical == 'phoneBattery'){ + log::add('mobile', 'debug', '| Migrate Calcul Value Offset : #value# * 100'); + $cmd->setConfiguration('calculValueOffset', '#value# * 100'); + } + log::add('mobile', 'debug', '| Migrate logicalId ' . $oldLogical . ' to ' . $newLogical . ' for the command ' . $cmd->getHumanName()); + $cmd->setLogicalId($newLogical); + $cmd->save(); + } + } + } + + /* Delete old "menuCustom_" and "NoCut" save into config of plugin */ + foreach (config::searchKey('menuCustom_', 'mobile') as $configMenuCustom) { + config::remove($configMenuCustom['key'], 'mobile'); + } + foreach (config::searchKey('NoCut', 'mobile') as $iconNoCut) { + config::remove($iconNoCut['key'], 'mobile'); } - $oldFiles = [dirname(__FILE__) . '/../desktop/css/panel.css', - dirname(__FILE__) . '/../desktop/php/panelMenuCustom.php', - dirname(__FILE__) . '/../desktop/js/panelMenuCustom.js', - dirname(__FILE__) . '/../desktop/modal/health.php']; + + /* Delete old infos save into config of plugin */ + config::remove('previousMenus', 'mobile'); + config::remove('pluginPanelOutMobile', 'mobile'); + config::remove('checkdefaultID', 'mobile'); + + /* Delete old files of plugin */ + $oldFiles = [ + '/../desktop/css/panel.css', + '/../desktop/php/panelMenuCustom.php', + '/../desktop/php/panelWebApp.php', + '/../desktop/php/modalConfigPlugin.php', + '/../desktop/js/panelMenuCustom.js', + '/../desktop/modal/health.php', + '/../desktop/modal/modal.previousMenus.php', + '/../desktop/modal/plugin.php', + '/../desktop/modal/piece.php', + '/../desktop/modal/scenario.php', + '/../desktop/modal/info_app.mobile.php', + '/../desktop/modal/plugin.mobile.php', + '/../desktop/modal/object.mobile.php', + '/../desktop/modal/scenario.mobile.php', + '/../desktop/modal/update.mobile.php', + '/../desktop/modal/firstPage.php', + '/../desktop/modal/secPage.php', + '/../desktop/modal/thirdPage.php', + '/../desktop/modal/fourPage.php', + '/../desktop/modal/fivePage.php', + '/../desktop/modal/fiveModal.php', + '/../desktop/modal/sixPage.php', + '/../desktop/modal/wizard.php', + '/../core/data/wizard.json', + '/../core/class/bellaMobile.class.php', + //'/../data/mobile.json' + ]; foreach ($oldFiles as $oldFile) { - if (file_exists($oldFile)) { - shell_exec('rm ' . $oldFile); - } + if (file_exists(dirname(__FILE__) . $oldFile)) { + log::add('mobile', 'debug', '| Removing old file : ' . dirname(__FILE__) . $oldFile); + shell_exec('rm ' . dirname(__FILE__) . $oldFile); + } } - jeedom::getApiKey('mobile'); - foreach (eqLogic::byType('mobile') as $mobile) { - if ($mobile->getLogicalId() == null || $mobile->getLogicalId() == "") { - $mobile->remove(); + /* Delete the old images in "core" folder */ + $oldCoreImgs = [ + 'Button_Dashboard_icon@3x.png', + 'Button_Design_icon@3x.png', + 'Button_Synthese_icon@3x.png', + 'Button_URL_icon@3x.png', + 'IMG_0738.PNG', + 'android.png', + 'ios.png', + 'v22methods.jpeg', + 'v2ActualBoxFlouted.jpeg', + 'v2AddZone.jpeg', + 'v2ConnectBox.jpeg', + 'v2FullMenu.jpeg', + 'v2MenuBoxs.PNG', + 'v2MenuBoxs.jpeg', + 'v2ModalMenuCustom.png', + 'v2ModalQrCode.png', + 'v2ModifyBigRadius.jpeg', + 'v2ModifyLittleRadius.jpeg', + 'v2QRCodeConnect.PNG', + 'v2ZoneInactive.jpeg', + 'v2connectMarket.jpeg', + 'v2firstConnect.jpeg', + 'v2floutedBoxs.png', + 'v2greenBtnAdd.PNG', + 'mobile_icon.png', + 'v2app.png' + ]; + + foreach ($oldCoreImgs as $oldCoreImg) { + if (file_exists(dirname(__FILE__) . '/../core/img/' . $oldCoreImg)) { + log::add('mobile', 'debug', '| Removing old image : ' . dirname(__FILE__) . '/../core/img/' . $oldCoreImg); + shell_exec('rm ' . dirname(__FILE__) . '/../core/img/' . $oldCoreImg); } } - mobile::makeTemplateJson(); + if (file_exists(dirname(__FILE__) . '/../core/img') && !glob(dirname(__FILE__) . '/../core/img/' . '*')) { + log::add('mobile', 'debug', '| Deleting empty core/img folder'); + shell_exec('rm -rf ' . dirname(__FILE__) . '/../core/img'); + } + + /* cleaning 3rdparty folder */ + $old3rdpartyFolders = ['animate', 'css', 'js']; + foreach ($old3rdpartyFolders as $old3rdpartyFolder) { + if (file_exists(dirname(__FILE__) . '/../3rdparty/' . $old3rdpartyFolder)) { + log::add('mobile', 'debug', '| Deleting folder ' . dirname(__FILE__) . '/../3rdparty/' . $old3rdpartyFolder); + shell_exec('rm -rf ' . dirname(__FILE__) . '/../3rdparty/' . $old3rdpartyFolder); + } + } + + /* cleaning data folder AppV1 + $path = dirname(__FILE__) . '/../data/'; + foreach (scandir($path) as $file) { + if ($file != "." && $file != ".." && $file != ".htaccess" && $file != "images") { + if (is_dir($path . '/' . $file)) { + // delete dashboard.json and favdash.json if exists // + if (file_exists($path . $file . '/dashboard.json')) { + log::add('mobile', 'debug', '| Deleting ' . $path . $file . '/dashboard.json'); + shell_exec('rm ' . $path . $file . '/dashboard.json'); + } + if (file_exists($path . $file . '/favdash.json')) { + log::add('mobile', 'debug', '| Deleting ' . $path . $file . '/favdash.json'); + shell_exec('rm ' . $path . $file . '/favdash.json'); + } + // delete folder if empty // + if (!glob($path . $file . '/*')) { + log::add('mobile', 'debug', '| Deleting empty folder : ' . $path . $file); + shell_exec('rm -rf ' . $path . $file); + } + } + } + } + */ + /* Generate ApiKey if no exist */ + jeedom::getApiKey('mobile'); + + log::add('mobile', 'debug', '└───────────────────────────────────────────'); } diff --git a/core/img/v2app.png b/plugin_info/mobileV2_icon.png similarity index 100% rename from core/img/v2app.png rename to plugin_info/mobileV2_icon.png