diff --git a/.circleci/config.yml b/.circleci/config.yml index 9f1a7a0973..26d1edc012 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,6 +94,9 @@ jobs: - run: name: Run eslint command: npm run eslint + - run: + name: Run integration comparison + command: npm run compare-translations build-front: working_directory: ~/gladys-build docker: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 24299de436..a45227727c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,6 +6,7 @@ To ensure your Pull Request can be accepted as fast as possible, make sure to re - [ ] Are tests passing? (`npm test` on both front/server) - [ ] Is the linter passing? (`npm run eslint` on both front/server) - [ ] Did you run prettier? (`npm run prettier` on both front/server) +- [ ] If you are adding a new features/services, did you run integration comparator? (`npm run compare-translations` on front) - [ ] If your changes modify the API (REST or Node.js), did you modify the API documentation? (Documentation is based on comments in code) - [ ] If you are adding a new features/services which needs explanation, did you modify the user documentation? See [the GitHub repo](https://github.com/GladysAssistant/gladys-4-docs) and the [website](https://documentation.gladysassistant.com). - [ ] Did you add fake requests data for the demo mode (`front/src/config/demo.json`) so that the demo website is working without a backend? (if needed) See [https://demo.gladysassistant.com](https://demo.gladysassistant.com). diff --git a/front/.eslintrc.json b/front/.eslintrc.json index b4aef2d8d5..efe29bf76e 100644 --- a/front/.eslintrc.json +++ b/front/.eslintrc.json @@ -2,7 +2,39 @@ "extends": ["eslint-config-synacor", "prettier"], "rules": { "react/jsx-indent-props": ["enabled", 2], - "brace-style": ["error", "1tbs"] + "brace-style": ["error", "1tbs"], + "preact-i18n/no-missing-template-field": "error", + "preact-i18n/no-text-as-attribute": "error", + "preact-i18n/no-text-as-children": "error", + "preact-i18n/no-unknown-key": "error" }, - "plugins": ["json"] + "plugins": ["json", "preact-i18n"], + "parserOptions": { + "ecmaFeatures": { + "jsx": true + } + }, + "settings": { + "preact-i18n": { + "languageFiles": [ + { + "name": "en", + "path": "src/config/i18n/en.json" + }, + { + "name": "fr", + "path": "src/config/i18n/fr.json" + } + ], + "textComponents": [ + { "nameRegex": "^(?:Alt)?Text$" }, + { "nameRegex": "^Dialog$", "id": "title", "plural": "count", "fields": "data" } + ], + "markupTextComponents": [ + { "nameRegex": "^MarkupText$" }, + { "nameRegex": "^DialogMarkup$", "id": "title", "plural": "count", "fields": "data" } + ], + "withTextRegex": "^withText(?:Alias)?$" + } + } } diff --git a/front/package-lock.json b/front/package-lock.json index 22fa722e56..150be5ad66 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -3427,6 +3427,228 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/compare-json/-/compare-json-0.4.0.tgz", + "integrity": "sha512-DSXzNQQa6J7VyuJmpeETgL3LaTgDgvltUE50AX1hsZCprjrZe1A9yVyDzng5md6YYOyMaThewRxc8yZm13UjYQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -5299,6 +5521,15 @@ "ramda": "^0.25.0" } }, + "eslint-plugin-preact-i18n": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-preact-i18n/-/eslint-plugin-preact-i18n-1.0.1.tgz", + "integrity": "sha512-xFinuAbSHf54d5Ch6ogV4G53ynQwaVGUYo12Sx3qff0tN3BCGY+Gpn3hg01EoiElDmHxTjVhJjTt3+HCx80b3Q==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, "eslint-plugin-react": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", @@ -9700,6 +9931,15 @@ "tmpl": "1.0.x" } }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -10601,6 +10841,12 @@ "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-event": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", diff --git a/front/package.json b/front/package.json index 42d3c5a368..69b0e67a6d 100644 --- a/front/package.json +++ b/front/package.json @@ -8,16 +8,24 @@ "serve": "npm run build && preact serve", "dev": "preact watch -p 1444 --template src/template.html", "eslint": "eslint src --ext .json --ext .js --ext .jsx", + "compare-translations": "npm run compare-i18n && npm run compare-device-integrations && npm run compare-communication-integrations && npm run compare-weather-integrations && npm run compare-calendar-integrations", + "compare-i18n": "comparejson -e ./src/config/i18n/*.json", + "compare-device-integrations": "comparejson -e ./src/config/integrations/device.*.json", + "compare-communication-integrations": "comparejson -e ./src/config/integrations/communication.*.json", + "compare-weather-integrations": "comparejson -e ./src/config/integrations/weather.*.json", + "compare-calendar-integrations": "comparejson -e ./src/config/integrations/calendar.*.json", "prettier-check": "prettier --check '**/*.js' '**/*.jsx' '**/*.json'", "prettier": "prettier --write '**/*.js' '**/*.jsx' '**/*.json'", "test": "jest --coverage" }, "devDependencies": { + "compare-json": "^0.4.0", "cross-env": "^5.2.0", "eslint": "^4.19.1", "eslint-config-prettier": "^4.0.0", "eslint-config-synacor": "^2.0.2", "eslint-plugin-json": "^1.4.0", + "eslint-plugin-preact-i18n": "^1.0.1", "identity-obj-proxy": "^3.0.0", "jest": "^21.2.1", "per-env": "^1.0.2", diff --git a/front/src/actions/signup/signupCreateLocalAccount.js b/front/src/actions/signup/signupCreateLocalAccount.js index 05e1a2272e..69cc32baf9 100644 --- a/front/src/actions/signup/signupCreateLocalAccount.js +++ b/front/src/actions/signup/signupCreateLocalAccount.js @@ -22,7 +22,7 @@ function createActions(store) { lastname: '', email: '', role: 'admin', - language: 'en', + language: navigator.language === 'fr' ? 'fr' : 'en', password: '', passwordRepeat: '' }, diff --git a/front/src/components/app.jsx b/front/src/components/app.jsx index 60fb7a9540..9109679a68 100644 --- a/front/src/components/app.jsx +++ b/front/src/components/app.jsx @@ -4,6 +4,7 @@ import createStore from 'unistore'; import config from '../../config'; import { Provider, connect } from 'unistore/preact'; import { IntlProvider } from 'preact-i18n'; +import translationFr from '../config/i18n/fr.json'; import translationEn from '../config/i18n/en.json'; import actions from '../actions/main'; @@ -45,7 +46,6 @@ import TriggerPage from '../routes/trigger'; import ProfilePage from '../routes/profile'; import SettingsSessionPage from '../routes/settings/settings-session'; import SettingsHousePage from '../routes/settings/settings-house'; -import SettingsAdvancedPage from '../routes/settings/settings-advanced'; import SettingsSystemPage from '../routes/settings/settings-system'; import SettingsGateway from '../routes/settings/settings-gateway'; import SettingsBackup from '../routes/settings/settings-backup'; @@ -186,7 +186,6 @@ const AppRouter = connect( - @@ -196,22 +195,25 @@ const AppRouter = connect( )); -@connect('', actions) +@connect('user', actions) class MainApp extends Component { componentWillMount() { this.props.checkSession(); } - render({}, {}) { - return ; + render({ user }, {}) { + const translationDefinition = user && user.language && user.language === 'fr' ? translationFr : translationEn; + return ( + + + + ); } } const App = () => ( - - - + ); diff --git a/front/src/components/boxs/camera/EditCamera.jsx b/front/src/components/boxs/camera/EditCamera.jsx index a90ab339ca..5ac487dee3 100644 --- a/front/src/components/boxs/camera/EditCamera.jsx +++ b/front/src/components/boxs/camera/EditCamera.jsx @@ -11,7 +11,9 @@ const EditCameraBox = ({ children, ...props }) => ( +
diff --git a/front/src/config/i18n/en.json b/front/src/config/i18n/en.json index d85c5e6e65..41407d5fab 100644 --- a/front/src/config/i18n/en.json +++ b/front/src/config/i18n/en.json @@ -1,13 +1,39 @@ { "global": { + "logoAlt": "Gladys logo", "needHelpText": "Need help? Join us on Gladys Community.", "new": "New", "orderDirAsc": "A - Z", "orderDirDesc": "Z - A", - "emptySelectOption": "---------" + "emptySelectOption": "---------", + "backButton": "◀️️ Back", + "requiredField": "*", + "listItem": "{{index}}.", + "percentValue": "{{value}}%", + "degreeValue": "{{value}}°", + "workInProgress": "Work in progress..." + }, + "calendar": { + "allDay": "All Day", + "previous": "Previous", + "next": "Next", + "today": "Today", + "month": "Month", + "week": "Week", + "day": "Day", + "agenda": "Agenda", + "date": "Date", + "time": "Time", + "event": "Event", + "noEventsInRange": "There are no events in this range." }, "login": { "title": "Gladys Assistant", + "welcome": "Welcome", + "createAccountStep": "Create account", + "preferencesStep": "Your preferences", + "houseStep": "Configure house", + "success": "Success!", "cardTitle": "Login to your account", "loginWithGladysGatewayButton": "Login with Gladys Gateway", "emailLabel": "Email Address", @@ -33,7 +59,6 @@ }, "createLocalAccount": { "title": "Create your local Gladys account", - "backButton": "Back", "description": "All informations entered here are only saved locally in Gladys database. You can update them later at any time.", "firstnameLabel": "Firstname", "firstnamePlaceHolder": "Enter your Firstname", @@ -100,7 +125,13 @@ "distanceUnit": "Distance unit", "distanceUnitMeter": "SI (Meter)", "distanceUnitUs": "Imperial/US (Miles)", - "deviceStateHistoryDuration": "Keep Device State History", + "deviceStateHistoryDuration": { + "title": "Keep Device State History", + "durationOneWeek": "1 week", + "durationOneMonth": "1 month", + "durationThreeMonth": "3 months", + "unlimited": "Forever" + }, "saveSettingsButton": "Save settings" }, "configureHouse": { @@ -146,6 +177,8 @@ "devices-in-room": "Devices in room" }, "boxes": { + "column": "Column {{index}}", + "dragAndDrop": "Drag and drop me here", "deleteButton": "Delete", "weather": { "editHouseLabel": "Select a house. I will use its latitude/longitude to get the weather.", @@ -157,7 +190,9 @@ }, "devicesInRoom": { "editRoomLabel": "Select the room you want to display here.", - "noValue": "No value recorded" + "noValue": "No value recorded", + "deviceTitle": "{{name}} - {{type}}", + "noDevices": "Looks you don't have any devices in your house!
Define your device in the integration page." }, "temperatureInRoom": { "editRoomLabel": "Select the room you want to display here.", @@ -165,7 +200,7 @@ }, "userPresence": { "description": "Display who's at home and who is not.", - "left": "Left", + "left": "Left ({{since}})", "atHome": "At Home", "neverSeenAtHome": "Never Seen At Home", "error": "There was a network error fetching the list of user. Please refresh.", @@ -182,6 +217,10 @@ "integration": { "root": { "title": "Integrations", + "subtitle": "1 - {{length}} of {{total}} integrations", + "searchPlaceholder": "Search integrations", + "restartButton": "Restart", + "stopButton": "Stop", "menu": { "device": "Devices", "communication": "Communication", @@ -197,7 +236,9 @@ "introduction": "To connect Gladys to Telegram, you first need to create a Telegram bot using the Botfather. Send a /newbot message to the @BotFather in Telegram. Then, enter the API key he gave you below.", "link": "ACTION REQUIRED: To talk to Gladys in Telegram, click on this link. Don't speak in Telegram directly to your bot before having click on this link, otherwise your bot won't be able to know that it's you who are sending a message.", "note": "This link is unique to your account, do not send it to other users.", - "configurationError": "We were not able to configure your account. Are you sure this token is valid?" + "configurationError": "We were not able to configure your account. Are you sure this token is valid?", + "apiKey": "Telegram Bot API Key", + "saveButton": "Save" }, "philipsHue": { "title": "Philips Hue", @@ -219,6 +260,7 @@ "deviceOnNetworkTitle": "Devices detected on network", "connectButton": "Connect/Reconnect", "search": "Search devices", + "noDevices": "No Philips Hue device added yet.", "deviceNotHandled": "Device not handled yet, please contact us to help us connect it in Gladys!", "noDevicesFound": "No devices found. Make sure you have connected one Philips Hue bridge in the setup tab." } @@ -352,7 +394,7 @@ "darkSky": { "title": "DarkSky API", "introduction": "This integration helps you integrate with DarkSky API to get the weather in Gladys.", - "instructions": "You first need to create an account on DarkSky API website:", + "instructions": "You first need to create an account on DarkSky API website: https://darksky.net/dev.", "apiKeyLabel": "Then, enter your API key here:", "apiKeyPlaceholder": "Enter DarkSky API key", "saveButton": "Save", @@ -405,7 +447,7 @@ "mqttTopicExampleLabel": "MQTT Topic", "copyMqttTopic": "Copy MQTT Topic", "copied": "Copied!", - "copiedFailed": "Fail to copy", + "copyFailed": "Fail to copy", "deleteLabel": "Delete feature" }, "setup": { @@ -435,7 +477,8 @@ "featuresLabel": "Features", "saveButton": "Save", "deleteButton": "Delete", - "editButton": "Edit details" + "editButton": "Edit details", + "noFeatures": "No features" }, "setup": { "title": "Xiaomi devices not in Gladys", @@ -456,6 +499,7 @@ "caldav": { "title": "CalDAV", "introduction": "To sync Gladys calendar using CalDAV, you first need an external compatible calendar. Then enter the configuration below.", + "hostLabel": "CalDAV host", "hostInfo": "Choose your calendar host to be helped during configuration.", "services": { "apple": { @@ -497,9 +541,9 @@ } }, "editScene": { - "backButton": "Back", "startButton": "Start", "saveButton": "Save", + "runButton": "Run", "deleteButton": "Delete", "triggersTitle": "Triggers", "newTrigger": "New trigger", @@ -514,6 +558,11 @@ "actionsDescription": "All actions in this block will run in parallel. To make a sequence of actions, add actions to the next block.", "addNewTriggerButton": "Add trigger", "saveSceneError": "There was an error saving your scene. Please check that all actions/triggers are filled and correct.", + "triggerCard": { + "title": "Triggers", + "searchPlaceholder": "Search triggers", + "leavingHomeTitle": "Leaving home" + }, "actionsCard": { "delay": { "label": " This block will wait the specified duration.", @@ -544,7 +593,7 @@ "valueLabel": "Value", "removeLabel": "Remove", "orText": "OR", - "orButton": "OR" + "orButton": "+ OR" } }, "actions": { @@ -598,6 +647,7 @@ "off": "Off" }, "scheduledTrigger": { + "typeLabel": "Type", "everyMonth": "Every month", "everyWeek": "Every week", "everyDay": "Every day", @@ -633,6 +683,8 @@ "editYourProfileTitle": "Edit your profile", "userRole": "User", "adminRole": "Administrator", + "invitationPending": "Pending", + "invitationSuccess": "Accepted", "firstnameLabel": "Firstname", "firstnamePlaceholder": "Enter your firstname", "lastnameLabel": "Lastname", @@ -648,7 +700,6 @@ "emailLabel": "Email", "emailPlaceholder": "Enter your email", "languageLabel": "Language", - "frenchComingSoon": "(French coming soon for release)", "english": "English", "french": "Français", "passwordLabel": "Password (min 8 characters)", @@ -669,6 +720,7 @@ "unknownError": "An unknown error occured. Please try again or contact Gladys community." }, "settings": { + "title": "Settings", "housesTab": "Houses", "sessionsTab": "Sessions", "systemTab": "System", @@ -687,7 +739,7 @@ "noHouseFound": "No houses found." }, "sessionsSettings": { - "registered": "Registered", + "registered": "Registered:", "session": "Session", "revoke": "Revoke", "device": "Device", @@ -697,6 +749,7 @@ "title": "Gladys Assistant", "cardTitle": "Recover your password", "emailLabel": "Email", + "backToLogin": "Back to login", "emailPlaceholder": "Enter your email", "button": "Recover my password", "wrongEmailError": "This is not a valid email", @@ -704,7 +757,13 @@ "unknownError": "An unknown error occured. Please try again or contact Gladys community.", "success": "Success! You should see a reset password link in Gladys logs.", "userNotFound": "There is no account linked to this email.", - "rateLimitError": "You have tried this form too many time. Please retry in 30 minutes or restart your Gladys instance now." + "rateLimitError": "You have tried this form too many time. Please retry in 30 minutes or restart your Gladys instance now.", + "invalidEmail": "We are unable to verify your email address.", + "validationLinkConfirmation": "Are you sure you clicked/copied the link correctly?", + "contactUs": "If it still not working, please contact us on Twitter or on Gladys Community.", + "emailConfirmed": "Email Confirmed", + "signIn": "Sign in", + "confirmationInProgress": "Confirmation in progress..." }, "resetPassword": { "title": "Gladys Assistant", @@ -719,7 +778,9 @@ "resetTokenNotFound": "Reset token not found", "success": "Password reset with success.", "clickHereToLogin": "Click here to login", - "generateLinkAgain": "Generate new forgot password link" + "generateLinkAgain": "Generate new forgot password link", + "resetSuccess": "Password reset with success! Click here to login.", + "alreadyHaveAccount": "Already have account? Sign in" }, "httpErrors": { "rateLimitError": "You have tried this form too many time. Please retry in 30 minutes or restart your Gladys instance now.", @@ -728,10 +789,11 @@ }, "systemSettings": { "connected": "Connected", - "ping": "ping", + "ping": "{{time}} ms ping", "disk": "Disk", "uptime": "Uptime", "gladysVersion": "Version", + "gladysVersionValue": "Gladys {{version}}", "operations": "Operations", "upToDate": "Gladys is up to date", "newUpgradeAvailable": "New upgrade available", @@ -764,6 +826,7 @@ "sceneAlreadyExist": "A scene with that name already exist." }, "scene": { + "title": "Scenes", "emptySceneSentenceTop": "Can't find any scenes.", "orderDirAsc": "A - Z", "orderDirDesc": "Z - A", @@ -787,8 +850,8 @@ "usersListTitle": "Remote users", "userColumn": "User", "statusColumn": "Status", - "userRsaKey": "RSA key", - "userEcdsaKey": "ECDSA key", + "userRsaKey": "RSA key:", + "userEcdsaKey": "ECDSA key:", "usersListDescription": "To ensure that your local instance remains secure, you need to manually grant access to each users in this list.", "disconnectTitle": "Disconnect your Plus account", "disconnectButton": "Disconnect", @@ -831,7 +894,8 @@ "unknownError": "An unknown error occurred. Please contact us for more informations.", "twoFactorCodeLabel": "Two Factor code", "twoFactorCodePlaceholder": "6 digits code", - "loginTwoFactorButtonText": "Finalize Login" + "loginTwoFactorButtonText": "Finalize Login", + "invalidTwoFactorCode": "Two Factor code is invalid." }, "gatewayBackup": { "title": "Backups", @@ -954,13 +1018,16 @@ }, "chat": { "whatCanYouAsk": "What can I ask?", - "whatsTheWeatherLike": "What's the weather like?", - "whatsTheTemperatureKitchen": "What's the temperature in the kitchen?", - "showCameraImage": "Show me camera image in the kitchen", "emptyStateMessage": "Send me a message!", "messagePlaceholder": "Type your message...", "sendingInProgress": "Sending...", - "typingInProgress": "Typing..." + "typingInProgress": "Typing...", + "gladysAlt": "Gladys", + "examples": { + "whatsTheWeatherLike": "\"What's the weather like?\"", + "whatsTheTemperatureKitchen": "\"What's the temperature in the kitchen?\"", + "showCameraImage": "\"Show me camera image in the kitchen\"" + } }, "header": { "gladysAssistant": "Gladys Assistant", @@ -979,25 +1046,33 @@ "gatewayLinkUser": { "title": "Configure Gladys Plus", "label": "Select you Gladys user", - "description": " Before selecting your user here, please make sure that this user is accepted locally in your Gladys instance (In \"Settings\" => \"Gladys Plus\" => \"Users\").", + "description": "Before selecting your user here, please make sure that this user is accepted locally in your Gladys instance (In \"Settings\" => \"Gladys Plus\" => \"Users\").", "noInstanceFound": "Your Gladys instance is not connected to the Gladys Gateway. Did you connect to your Gladys Plus account in your Gladys installation?", "error": "An error occurred. Is your user accepted locally in your Gladys instance ?", "saveButton": "Save", - "manageBilling": "To manage your billing, click ", - "here": "here" + "manageBilling": "To manage your billing, click ." }, "editDeviceForm": { - "returnButton": "Return back", "noName": "No name", "nameLabel": "Name", "roomLabel": "Room", "featuresLabel": "Features", + "noFeatures": "No features", "namePlaceholder": "Enter name", "externalIdLabel": "External ID", "externalIdPlaceholder": "Enter external ID", "unitLabel": "Unit", "saveButton": "Save", - "externalIdMessage": "The feature external ID is an unique ID which helps you identify this feature outside of Gladys, for example when calling the API." + "externalIdMessage": "The feature external ID is an unique ID which helps you identify this feature outside of Gladys, for example when calling the API.", + "minLabel": "Minimum value", + "minPlaceholder": "Enter feature minimum value", + "maxLabel": "Maximum value", + "maxPlaceholder": "Enter feature maximum value", + "addButton": "Add feature", + "deleteLabel": "Delete feature", + "saveError": "Error saving or deleting device", + "saveConflictError": "Conflict: Are you sure all device feature external IDs are unique ?", + "notFound": "Requested device not found." }, "gatewaySignup": { "title": "Gladys Assistant", @@ -1016,8 +1091,9 @@ "emailAddress": "Email Address", "emailAddressPlaceholder": "Enter Email", "cardInformations": "Card Informations", - "paymentSecuredBy": "Payment Secured by", + "paymentSecuredByStripe": "🔒 Payment Secured by Stripe", "subscribeButton": "Subscribe (9.99€/month)", + "priceButton": "9.99€/month", "invalidEmailAddress": "Invalid Email Adress", "emailAlreadyExist": "An account with this email address already exist!", "paymentFailed": "Payment failed. Please try again or try with a different card.", @@ -1035,17 +1111,90 @@ }, "gatewayResetPassword": { "pageTitle": "Gladys Assistant", - "formTitle": "Gladys Plus - Reset Password" + "formTitle": "Gladys Plus - Reset Password", + "incompatibleBrowserLabel": "Sorry, your browser is not compatible with the Gladys Gateway. Your browser should support the WebCrypto API as well as IndexedDB database.", + "errorLinkLabel": "We cannot retrieve your reset password link. Maybe it was already used or has expired!", + "passwordNotMatchingLabel": "Password are not matching.", + "passwordLabel": "Password (min 8 characters)", + "passwordPlaceholder": "Password", + "passwordInvalid": "Password should be 8 characters", + "repeatPasswordLabel": "Repeat Password", + "twoFactorCodeLabel": "Two factor code", + "twoFactorCodePlaceholder": "6 digits two factor code", + "resetPasswordButton": "Reset Password" }, "gatewayOpenApi": { "title": "Open API", "description": "The Open API allows you to send informations to Gladys outside of your network. For now, it allows you to send Owntracks data only.", - "moreInformations": "More informations.", + "moreInformations": "More informations.", "warningKeyDisappear": "Warning: You'll see the key only once. Copy paste your key and save it somewhere.", "keyName": "Name", "keyLastUsed": "Last used", "revoke": "Revoke", "generateButton": "Generate", - "registered": "Registered" + "registered": "Registered", + "keyNameLabel": "Name:", + "registeredLabel": "Registered:", + "neverUsed": "Never" + }, + "gatewayTwoFactorAuth": { + "title": "Gladys Gateway", + "configureTitle": "Configure Two-Factor Authentication", + "securityIsImportant": "The security of your Gladys Gateway account is really important to us.", + "securityApps": "To ensure that your account remains secure, please enable two-factor authentication using a two-factor app like Authy on iOS or Android.", + "invalidCode": "The 2FA code you provided is not valid.", + "confirmCode": "Confirm Two Factor", + "enterCode": "Enter 6 digits code", + "enable": "Enable Two-Factor Authentication", + "app": { + "open": "Open your 2FA app", + "addAccount": "Click on \"Add Account\"", + "scanQRCode": "Scan the QR Code below" + } + }, + "gatewaySignUp": { + "generatingKey": "Generating your public/private keys...", + "complete": "Done! Please check your emails.", + "done": "Done! You can now login here.", + "usernameLabel": "Name", + "usernamePlaceholder": "Enter name", + "usernameInvalid": "Name should be between 2 and 30 characters", + "emailLabel": "Email address", + "emailPlaceholder": "Enter email", + "emailInvalid": "Email is not valid", + "passwordLabel": "Password (min 8 characters)", + "passwordPlaceholder": "Password", + "passwordInvalid": "Password should be 8 characters", + "createAccountButton": "Create new account" + }, + "gatewayUsers": { + "managerUsersLabel": "Manage your users", + "revokeError": "You cannot revoke this user.", + "columnName": "Name", + "columnRole": "Role", + "columnStatus": "Status", + "columnAddDate": "Added at", + "columnRevoke": "Revoke", + "emailPlaceholder": "Email", + "roleAdmin": "Administrator", + "roleUser": "User", + "inviteUserButton": "Invite User" + }, + "gatewayBilling": { + "title": "Billing", + "informationTitle": "Your billing informations", + "stripeDescription": "Billing is handled by Stripe. We never see you credit card.", + "cardTypeLabel": "Type", + "cardLastDigitsLabel": "Last 4 digits", + "cardExpirationLabel": "Expiration date", + "updateInformationTitle": "Update Card Informations", + "updateInformationDescription": "If your card has expired, or you want to change credit card, you can update here your card information.", + "cancelSubscriptionTitle": "Cancel subscription", + "cancelSubscriptionError": "Warning: There was an error while trying to cancel your account. Please retry again later.", + "cancelSubscriptionSuccess": "Your subscription was canceled with success!", + "cancelSubscriptionDescription": "If you want to cancel your account, click here:", + "cancelSubscriptionButton": "Cancel subscription", + "accountCancelled": "Your account was cancelled on {{date}}", + "subscriptionButton": "Subscribe again" } } diff --git a/front/src/config/i18n/fr.json b/front/src/config/i18n/fr.json index 742b26a447..c1b61e640b 100644 --- a/front/src/config/i18n/fr.json +++ b/front/src/config/i18n/fr.json @@ -1,20 +1,240 @@ { - "gatewaySubscribe": { - "registerGladysPlus": "Rejoignez la communauté Gladys", - "emailAddress": "Adresse email", - "emailAddressPlaceholder": "Entrez votre adresse email", - "cardInformations": "Informations de paiement", - "paymentSecuredBy": "Paiement sécurisé par", - "subscribeButton": "Rejoindre (9.99€/mois)", - "invalidEmailAddress": "Adresse email invalide", - "emailAlreadyExist": "Une adresse avec ce compte existe déjà", - "paymentFailed": "Le paiement a échoué. Merci de réessayer ou de tenter avec une autre carte.", - "paymentSuccess": "Merci pour ton inscription au package communauté Gladys! Tu as du recevoir un email pour accéder au Slack et au Gladys Gateway. Encore merci pour ton soutien." + "global": { + "logoAlt": "Logo Gladys", + "needHelpText": "Besoin d'aide ? Rejoignez-nous sur Gladys Community.", + "new": "Nouveau", + "orderDirAsc": "A - Z", + "orderDirDesc": "Z - A", + "emptySelectOption": "---------", + "backButton": "◀️️ Retour", + "requiredField": "*", + "listItem": "{{index}}.", + "percentValue": "{{value}}%", + "degreeValue": "{{value}}°", + "workInProgress": "Travail en cours..." + }, + "calendar": { + "allDay": "Toute la journée", + "previous": "précédent", + "next": "suivant", + "today": "aujourd'hui", + "month": "mois", + "week": "semaine", + "day": "jour", + "agenda": "Agenda", + "date": "date", + "time": "heure", + "event": "événement", + "noEventsInRange": "Aucuns évènements trouvés dans cette période." + }, + "login": { + "title": "Gladys Assistant", + "welcome": "Bienvenue", + "createAccountStep": "Créer un compte", + "preferencesStep": "Vos préférences", + "houseStep": "Configurer votre maison", + "success": "Succès !", + "cardTitle": "Connexion", + "loginWithGladysGatewayButton": "Identification avec Gladys Gateway", + "emailLabel": "Adresse e-mail", + "emailPlaceholder": "Entrez votre e-mail", + "passwordLabel": "Mot de passe", + "forgotPasswordLabel": "J’ai oublié mon mot de passe", + "passwordPlaceholder": "Entrez votre mot de passe", + "loginButtonText": "Connexion", + "wrongCredentials": "Adresse e-mail ou mot de passe invalide", + "invalidEmail": "E-mail invalide", + "needHelpText": "Besoin d'aide ? Rejoignez-nous sur Gladys Community." + }, + "signup": { + "welcome": { + "title": "Bienvenue dans Gladys 🙋", + "introSentence": "Tout d'abord, merci de m'avoir choisie. Je suis Gladys, une assistante à domicile respectueuse de la vie privée de votre maison.", + "introTimeToCreateAccount": "Il est temps de créer un compte local pour votre installation Gladys.", + "introDontWorryLocal": "Ne vous inquiétez pas : Gladys est entièrement auto-hébergé et toutes les informations que vous saisirez sont simplement enregistrées dans la base de données locale de Gladys.", + "introInCaseOfIssues": "Si vous rencontrez des problèmes lors de l'installation de Gladys, consultez notre documentation ou posez une question sur Gladys community .", + "introReadMoreGladysGateway": "En savoir plus sur Gladys Plus. ", + "buttonCreateAccountGladysGateway": "Restaurer une sauvegarde Gladys Plus", + "buttonCreateAccountWithEmail": "Créer un compte local avec votre e-mail" + }, + "createLocalAccount": { + "title": "Créer votre compte local Gladys", + "description": "Toutes les informations saisies ici ne sont enregistrées que localement dans la base de données Gladys. Vous pouvez les mettre à jour ultérieurement à tout moment.", + "firstnameLabel": "Prénom", + "firstnamePlaceHolder": "Entrez votre prénom", + "lastnameLabel": "Nom de famille", + "lastnamePlaceHolder": "Entrez votre nom de famille", + "languageLabel": "Langue", + "english": "English", + "french": "Français", + "birthdateLabel": "Date de naissance", + "birthdatePlaceHolder": "Entrez votre date de naissance", + "january": "Janvier", + "february": "Février", + "march": "Mars", + "april": "Avril", + "may": "Mai", + "june": "Juin", + "july": "Juillet", + "august": "Août", + "september": "Septembre", + "october": "Octobre", + "november": "Novembre", + "december": "Décembre", + "emailLabel": "E-mail", + "emailPlaceHolder": "Entrez votre e-mail", + "passwordLabel": "Mot de passe (min 8 caractères)", + "passwordPlaceHolder": "Entrez un mot de passe", + "passwordRepeatLabel": "Répétez votre mot de passe", + "passwordRepeatPlaceHolder": "Répétez votre mot de passe", + "firstnameError": "Le prénom requis.", + "lastnameError": "Le nom de famille requis.", + "emailError": "L'e-mail n'est pas une adresse valide", + "passwordError": "Le mot de passe doit contenir au moins 8 caractères.", + "passwordRepeatError": "Le mot de passe ne correspond pas.", + "birthdateError": "La date de naissance est requise.", + "networkError": "Erreur réseau : nous n'avons pas réussi à contacter votre instance Gladys. Êtes-vous connecté au réseau ? Votre instance Gladys est-elle en cours d'exécution ?", + "emailAlreadyExistError": "Un utilisateur avec cet e-mail existe déjà.", + "selectorAlreadyExistError": "Un utilisateur avec ce prénom existe déjà.", + "createAccountButton": "Créer un compte" + }, + "restoreBackupSetBackupKey": { + "title": "Clé de restauration", + "description": "Les sauvegardes Gladys Plus sont entièrement chiffrées, c'est pour cela que nous avons besoin de votre clé de restauration.", + "backupKeyLabel": "Clé de restauration", + "backupKeyPlaceholder": "Saississez votre clé de restauration", + "cancelButton": "Annuler", + "saveButton": "Enregistrer" + }, + "restoreBackupInProgress": { + "title": "Restauration en cours...", + "description": "A la fin du processus de restauration, Gladys redémarrera automatiquement.", + "errored": "La restauration a échoué, la clé de restauration n'est peut-être pas valide", + "updateRestoreKeyButton": "Mettre à jour la clé de restauration" + }, + "gatewayBackup": { + "title": "Sélectionnez votre sauvegarde", + "description": "Sélectionnez dans la liste la sauvegarde que vous souhaitez restaurer." + }, + "preferences": { + "title": "Vos préférences", + "description": "Vous pouvez modifier ces paramètres à tout moment ultérieurement.", + "temperatureUnitsLabel": "Unité de température", + "temperatureUnitsCelsius": "Celsius (°C)", + "temperatureUnitsFahrenheit": "Fahrenheit (°F)", + "distanceUnit": "Unité de distance", + "distanceUnitMeter": "SI (Mètre)", + "distanceUnitUs": "Imperial/US (Miles)", + "deviceStateHistoryDuration": { + "title": "Conserver l'historique des états des appareils", + "durationOneWeek": "1 semaine", + "durationOneMonth": "1 mois", + "durationThreeMonth": "3 mois", + "unlimited": "Illimité" + }, + "saveSettingsButton": "Sauvegarder les paramètres" + }, + "configureHouse": { + "title": "Configurez votre maison", + "description": "Toutes ces informations sont enregistrées uniquement dans la base de données locale de Gladys. Si vous avez plusieurs maisons, vous pourrez les configurer plus tard dans Gladys.", + "houseNameLabel": "Nom", + "houseNamePlaceHolder": "Entrez le nom de votre maison", + "houseNameError": "Le nom de la maison est requis", + "houseLocationLabel": "Sélectionnez l'emplacement de votre maison", + "roomsLabel": "Ajoutez toutes les pièces de votre maison", + "roomNamePlaceHolder": "Entrez une nouvelle pièce pour l'ajouter", + "addRoomButton": "Ajouter", + "saveHouse": "Sauvegarder la maison", + "deleteHouse": "Supprimer la maison", + "confirmDeleteHouse": "Confirmer la suppression de la maison", + "cancelDeleteHouse": "Annuler", + "conflictError": "Une maison avec le même non existe déjà.", + "roomConflictError": "Une pièce avec le même non existe déjà.", + "validationError": "Erreur de validation : une maison ne peut pas avoir un nom vide.", + "validationErrorRoom": "Erreur de validation : le nom d'une pièce doit être entre 1 et 40 caractères." + }, + "success": { + "title": "Merci 🙏", + "introduction": "Je m'appelle Pierre-Gilles Leymarie , et j'ai fondé Gladys Assistant en 2013.", + "thanksForChoosingOpenSource": "Je voudrais vous remercier d'avoir choisi Gladys 🙌 J'espère que vous apprécierez utiliser ce logiciel.", + "ifYouWantToSupportThisSotware": "Gladys étant mon activité principale, je compte sur vos contributions pour rendre ce projet durable. Si vous souhaitez accéder à des fonctionnalités supplémentaires et supporter ce projet open-source, rendez-vous sur Gladys Plus .", + "goToDashboardButton": "Accéder au tableau de bord" + } + }, + "dashboard": { + "title": "Tableau de bord", + "editDashboardButton": "Editer", + "editDashboardCancelButton": "Annuler", + "editDashboardSaveButton": "Sauvegarder", + "emptyDashboardSentenceTop": "Votre tableau de bord n'est pas encore configuré.", + "emptyDashboardSentenceBottom": "Cliquez sur le bouton \"Editer\" pour le compléter.", + "gatewayInstanceNotFoundError": "Votre instance Gladys n'est pas connectée à Gladys Plus.", + "boxTitle": { + "weather": "Météo", + "temperature-in-room": "Température de la pièce", + "user-presence": "Utilisateurs présent", + "camera": "Caméra", + "devices-in-room": "Appareils de la pièce" + }, + "boxes": { + "column": "Colonne {{index}}", + "dragAndDrop": "Glissez et déposez moi ici", + "deleteButton": "Supprimer", + "weather": { + "editHouseLabel": "Sélectionnez une maison. J'utiliserais les latitude/longitude pour obtenir la météo.", + "houseHasNoCoordinates": "Les coordonnées de votre maison ne sont pas définies. Accédez aux paramètres Gladys pour définir la position de votre maison.", + "serviceNotConfigured": "Le service DarkSky n'est pas configuré. Veuillez accéder à l'onglet «Intégrations» et configurer le service DarkSky.", + "requestToThirdPartyFailed": "La requête à l'API DarkSKy a échouée. Votre instance Gladys est-elle connectée à Internet? Veuillez vous rendre dans le panneau de configuration de DarkSky pour résoudre ce problème.", + "clickHere": "Cliquez ici pour accéder au panneau de configuration de DarkSky.", + "unknownError": "Nous ne pouvons pas obtenir la météo pour cette maison. Avez-vous défini une maison pour cette box ?" + }, + "devicesInRoom": { + "editRoomLabel": "Sélectionnez la pièce que vous souhaitez afficher ici.", + "noValue": "Aucune valeur n'a encore été enregistrée.", + "deviceTitle": "{{name}} - {{type}}", + "noDevices": "Vous n'avez pas d'appareil dans votre maison !
Définissez votre appareil dans la page de l'intégration." + }, + "temperatureInRoom": { + "editRoomLabel": "Sélectionnez la pièce que vous souhaitez afficher ici.", + "noTemperatureRecorded": "Aucune température enregistrée récemment." + }, + "userPresence": { + "description": "Cette box affiche qui est à la maison et qui ne l'est pas.", + "left": "Absent ({{since}})", + "atHome": "A la maison", + "neverSeenAtHome": "Jamais vu à la maison", + "error": "Une erreur réseau s'est produite lors de la récupération de la liste des utilisateurs. Merci de rafraîchir la page.", + "emptyText": "Il n'y a aucun utilisateurs à afficher ici. Vous pouvez ajouter des utilisateurs dans les paramètres Gladys." + }, + "camera": { + "editCameraLabel": "Sélectionnez la caméra que vous souhaitez afficher ici.", + "noImageToShow": "Aucune image à afficher", + "editBoxNameLabel": "Entrez le nom que vous souhaitez donner à la box :", + "editBoxNamePlaceholder": "Nom de la box" + } + } }, "integration": { + "root": { + "title": "Intégrations", + "subtitle": "1 - {{length}} de {{total}} intégrations", + "searchPlaceholder": "Chercher une intégration", + "restartButton": "Redémarrer", + "stopButton": "Arrêter", + "menu": { + "device": "Appareils", + "communication": "Communication", + "calendar": "Calendrier", + "music": "Musique", + "health": "Santé", + "weather": "Météo", + "navigation": "Navigation" + } + }, "caldav": { "title": "CalDAV", - "introduction": "Pour synchroniser Gladys calendar en utilisant CalDAV, vous devez avoir un calendrier compatible et entrer la configuration ci-dessous.", + "introduction": "Pour synchroniser Gladys avec un calendrier CalDAV, vous devez avoir un calendrier compatible et entrer la configuration ci-dessous.", + "hostLabel": "Hébergement CalDAV", "hostInfo": "Choisissez le type de calendrier que vous utilisez pour être aidé pendant la configuration.", "services": { "apple": { @@ -51,25 +271,930 @@ "synchronizationRequestChangesError": "Impossible de récupérer les changements, vérifiez la configuration et l'état du serveur CalDAV.", "synchronizationRequestEventsError": "Impossible de récupérer les détails des évènements, vérifiez la configuration et l'état du serveur CalDAV.", "buttonSave": "Sauvegarder", - "buttonCleanUp": "Reset", + "buttonCleanUp": "Remettre à zéro", "buttonSync": "Synchroniser" + }, + "telegram": { + "title": "Telegram", + "introduction": "Pour connecter Gladys à Telegram, vous devez d'abord créer un bot Telegram à l'aide du Botfather. Envoyez une commande /newbot au @BotFather dans Telegram. Ensuite, entrez la clé API qu'il vous a donné ci-dessous.", + "link": "ACTION REQUISE : Pour parler à Gladys dans Telegram, cliquez sur ce lien . Ne parlez pas à votre bot dans Telegram directement avant d'avoir cliqué sur ce lien, sinon votre bot ne pourra pas savoir que c'est vous qui envoyez un message.", + "note": "Ce lien est unique à votre compte, ne l'envoyez pas à d'autres utilisateurs.", + "configurationError": "Nous n'avons pas pu configurer votre compte. Êtes-vous sûr que ce token (jeton) est valide?", + "apiKey": "Clé API du Bot Telegram", + "saveButton": "Sauvegarder" + }, + "philipsHue": { + "title": "Philips Hue", + "deviceTab": "Appareils", + "setupTab": "Configuration des Ponts", + "setup": { + "connectedBridgesTitle": "Ponts connectés", + "disconnectButton": "Déconnexion", + "bridgesOnNetwork": "Ponts sur le réseau", + "connectButton": "Connecter/Reconnecter", + "scanButton": "Recherche sur le réseau", + "bridgeButtonNotPressed": "Le bouton du pont n'a pas été appuyé : veuillez appuyer sur le bouton de votre pont Philips Hue et réessayer.", + "unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer ou contacter Gladys community .", + "noBridgesConnected": "Aucun pont connecté", + "noBridgesFound": "Nous n'avons trouvé aucun pont Philips Hue sur votre réseau. Êtes-vous sûr que vous êtes connecté au même réseau que votre pont et que celui-ci est sous tension?" + }, + "device": { + "title": "Appareils dans Gladys", + "deviceOnNetworkTitle": "Appareils détectés sur le réseau", + "connectButton": "Connecter/Reconnecter", + "search": "Recherche d'appareils", + "noDevices": "Aucun appareil Philips Hue ajouté.", + "deviceNotHandled": "L'appareil n'est pas encore géré, veuillez nous contacter pour nous aider à le connecter dans Gladys !", + "noDevicesFound": "Aucun appareil trouvé. Assurez-vous d'avoir connecté un pont Philips Hue dans l'onglet de configuration." + } + }, + "rtspCamera": { + "title": "Caméras", + "search": "Chercher une caméra", + "new": "Nouveau", + "nameLabel": "Nom de la caméra", + "namePlaceholder": "Entrez le nom de votre caméra", + "roomLabel": "Pièce", + "pollFrequencyLabel": "Fréquence de rafraîchissement", + "everyMinutes": "Toutes les minutes (recommandé)", + "every30Seconds": "Toutes les 30 secondes", + "every10Seconds": "Toutes les 10 secondes", + "every2Seconds": "Toutes les 2 secondes", + "every1Seconds": "Chaque seconde (à vos risques et périls)", + "urlLabel": "Flux RTSP/HTTP de la caméra", + "urlPlaceholder": "Ex: rtsp://[identifiant]:[mot-de-passe]@[adresse-ip-camera]:554/media", + "noCameraFound": "Aucune caméra trouvée", + "testConnectionButton": "Tester", + "saveButton": "Sauvegarder", + "deleteButton": "Supprimer", + "saveError": "Une erreur s'est produite lors de l'enregistrement de la caméra.", + "testConnectionError": "Une erreur s'est produite lors de l'obtention du flux RTSP. Êtes-vous sûr que l'URL fournie est correcte et accessible à partir de l'instance Gladys ?" + }, + "tasmota": { + "title": "Tasmota", + "deviceTab": "Appareils", + "discoverTab": "Découverte MQTT", + "discoverDeviceDescr": "Scanner automatiquement les appareils MQTT", + "device": { + "title": "Appareils Tasmota dans Gladys", + "search": "Chercher un appareil", + "editButton": "Modifier", + "noDeviceFound": "Aucun appareil Tasmota trouvé. Vous pouvez ajouter des appareils avec les actions suivantes :", + "featuresLabel": "Fonctionnalités" + }, + "discover": { + "title": "Découverte des appareils Tasmota sur MQTT", + "description": "Les appareils Tasmota configurés sont automatiquement découverts sur le réseau MQTT.", + "error": "Erreur lors de la découverte des appareils Tasmota.", + "noDeviceFound": "Aucun appareil Tasmota découvert.", + "documentation": "Documentation Tasmota", + "scan": "Scanner" + }, + "nameLabel": "Nom de l'appareil", + "namePlaceholder": "Entrez le nom de votre appareil", + "roomLabel": "Pièce", + "topicLabel": "Topic (%topic% Tasmota MQTT)", + "saveButton": "Sauvegarder", + "updateButton": "Mettre à jour", + "alreadyCreatedButton": "Déjà créé", + "deleteButton": "Supprimer", + "unmanagedModelButton": "Modèle non pris en charge", + "error": { + "defaultError": "Une erreur s'est produite lors de l'enregistrement de l'appareil.", + "defaultDeletionError": "Une erreur s'est produite lors de la suppression de l'appareil.", + "conflictError": "Le topic actuel est déjà utilisé." + } + }, + "zwave": { + "title": "Z-Wave", + "deviceTab": "Appareils", + "networkTab": "Réseau", + "settingsTab": "Paramètres", + "setupTab": "Configuration", + "device": { + "title": "Appareils Z-Wave", + "search": "Chercher un appareil", + "noDevices": "Aucun appareil Z-Wave n'a encore été ajouté.", + "scanButton": "Rechercher", + "nameLabel": "Nom", + "roomLabel": "Pièce", + "featuresLabel": "Fonctionnalités", + "noFeatures": "Pas de fonctionnalités", + "saveButton": "Sauvegarder", + "deleteButton": "Supprimer", + "editButton": "Editer", + "mostRecentValueAt": "Dernière valeur reçue {{mostRecentValueAt}}.", + "noValueReceived": "Aucune valeur reçue." + }, + "setup": { + "title": "Appareils Z-Wave", + "addNodeButton": "Ajouter", + "addNodeSecureButton": "Ajout sécurisé", + "healNetworkButton": "Régler", + "removeNode": "Supprimer", + "scanButton": "Recherche", + "noZwaveDevices": "Aucun appareil Z-Wave trouvé. Avez-vous sélectionné le port USB de votre dongle dans les paramètres ?", + "manufacturer": "Fabricant", + "name": "Nom", + "type": "Type", + "scanInProgressText": "Recherche en cours...", + "createDeviceInGladys": "Connecter dans Gladys", + "features": "Fonctionnalités", + "params": "Paramètre", + "noFeatures": "Aucune fonctionnalité", + "nodeId": "Noeud", + "zwaveNotConfiguredError": "Ce service Z-wave n'est pas configuré. Veuillez sélectionner le port USB où votre clé Z-Wave est branchée dans les paramètres.", + "createDeviceError": "Une erreur s'est produite lors de la création de cet appareil dans Gladys.", + "conflictError": "Un appareil avec ce nom existe déjà, merci de renommer cet appareil ou de supprimer l'existant.", + "deviceCreatedSuccess": "L'appareil a été ajouté avec succès." + }, + "network": { + "title": "Réseau Z-Wave" + }, + "settings": { + "title": "Paramètres Z-Wave", + "description": "Pour utiliser le Z-Wave dans Gladys, vous devez avoir une clé USB Z-Wave connectée à votre instance Gladys.", + "zwaveUsbDriverPathLabel": "Sélectionnez le port USB auquel votre clé Z-Wave est connectée", + "connectButton": "Connecter", + "disconnectButton": "Déconnecter", + "refreshButton": "Rafraîchir la liste USB", + "notConnected": "Gladys n'est connectée à aucune clé USB Z-Wave.", + "connectedWithSuccess": "Clé USB Z-Wave connectée avec succès.", + "connecting": "Tentative de connexion à la clé USB Z-Wave...", + "driverFailedError": "Une erreur s'est produite lors de la tentative de connexion à la clé USB Z-Wave." + }, + "nodeOperation": { + "addNodeInstructions": "Vous pouvez maintenant inclure votre appareil en suivant les instructions du manuel de celui-ci.", + "removeNodeInstructions": "Vous pouvez désormais exclure votre appareil en suivant les instructions du manuel de celui-ci.", + "addNodeTitle": "Mode d'inclusion", + "removeNodeTitle": "Mode d'exclusion", + "seconds": "secondes restantes", + "cancelButton": "Annuler", + "nodeAddedTitle": "Un nouveau nœud a été trouvé", + "nodeAddedDescription": "Attendez quelques secondes pendant que nous obtenons toutes les informations de ce nœud..." + } + }, + "darkSky": { + "title": "API DarkSky", + "introduction": "Cette intégration vous aide à intégrer l'API DarkSky pour obtenir la météo dans Gladys.", + "instructions": "Vous devez d'abord créer un compte sur le site Web de l'API DarkSky : https://darksky.net/dev.", + "apiKeyLabel": "Saisissez ensuite votre clé API ici :", + "apiKeyPlaceholder": "Entrer la clé API DarkSky", + "saveButton": "Sauvegarder", + "instructionsToUse": "Pour utiliser cette intégration, accédez au tableau de bord et créez une box météo." + }, + "mqtt": { + "title": "MQTT", + "deviceTab": "Appareils", + "setupTab": "Configuration", + "status": { + "notConfigured": "Le service MQTT n'est pas configuré, veuillez vous rendre sur la ", + "notConnected": "Le service MQTT n'a pas réussi à se connecter au réseau, veuillez accéder à ", + "setupPageLink": "page de configuration du service MQTT." + }, + "device": { + "title": "Appareils MQTT", + "search": "Chercher un appareil", + "noDevices": "Aucun appareil MQTT n'a encore été ajouté.", + "noNameLabel": "Pas de nom", + "nameLabel": "Nom", + "externalIdLabel": "ID externe", + "roomLabel": "Pièce", + "featuresLabel": "Fonctionnalités", + "noFeatures": "Aucune fonctionnalité", + "saveButton": "Sauvegarder", + "deleteButton": "Supprimer", + "returnButton": "Retour", + "editButton": "Editer les détails", + "notFound": "Appareil introuvable.", + "backToList": "Retour à la liste des appareils", + "saveError": "Erreur lors de l'enregistrement ou de la suppression de l'appareil", + "saveConflictError": "Conflit : êtes-vous sûr que tous les IDs externes des fonctionnalités de l'appareil sont uniques ?", + "mostRecentValueAt": "Dernière valeur reçue {{mostRecentValueAt}}.", + "noValueReceived": "Aucune valeur reçue." + }, + "feature": { + "nameLabel": "Nom", + "namePlaceholder": "Entrez un nom de fonctionnalité", + "externalIdLabel": "ID externe de la fonctionnalité", + "externalIdMessage": "L'ID externe d'une fonctionnalité est un ID unique qui vous aide à identifier cette fonctionnalité en dehors de Gladys lors de l'envoi d'un message MQTT. Il doit commencer par \"mqtt:\". Pour en savoir plus, rendez-vous sur la documentation de l'API MQTT de Gladys ici .", + "externalIdPlaceholder": "Message clé de la fonctionnalité MQTT", + "unitLabel": "Unité", + "minLabel": "Valeur minimum", + "minPlaceholder": "Entrez la valeur minimum de la fonctionnalité", + "maxLabel": "Valeur maximum", + "maxPlaceholder": "Entrez la valeur maximum de la fonctionnalité", + "readOnlyLabel": "Est-ce un capteur ?", + "readOnlyButton": "Oui, ce capteur ne fait qu'envoyer des données à Gladys.", + "addButton": "Ajouter une fonctionnalité", + "mqttTopicExampleLabel": "Topic MQTT", + "copyMqttTopic": "Copier le topic MQTT", + "copied": "Copié !", + "copyFailed": "Erreur lors de la copie", + "deleteLabel": "Supprimer fonctionnalité" + }, + "setup": { + "title": "Configuration MQTT", + "mqttDescription": "Vous pouvez connecter Gladys à un broker (courtier) MQTT pour envoyer et recevoir des messages MQTT. En savoir plus sur l'API Gladys MQTT ici .", + "urlLabel": "URL du broker", + "urlPlaceholder": "Ex: mqtt://[adresse-broker-mqtt]:[port]", + "userLabel": "Nom d'utilisateur", + "userPlaceholder": "Entrez le nom d'utilisateur du broker MQTT", + "passwordLabel": "Mot de passe", + "passwordPlaceholder": "Entrez le mot de passe du broker MQTT", + "saveLabel": "Sauvegarder la configuration", + "error": "Une erreur s'est produite lors de l'enregistrement de la configuration.", + "connecting": "Configuration enregistrée. Maintenant, connectez-vous à votre broker MQTT...", + "connected": "Connecté au broker MQTT avec succès !", + "connectionError": "Erreur lors de la connexion, veuillez vérifier votre configuration." + } + }, + "xiaomi": { + "device": { + "title": "Appareils Xiaomi dans Gladys", + "noDevices": "Aucun appareil Xiaomi n'a encore été ajouté.", + "searchPlaceholder": "Chercher un appareil", + "sidLabel": "SID Xiaomi", + "ipLabel": "Adresse IP", + "roomLabel": "Pièce", + "featuresLabel": "Fonctionnalités", + "saveButton": "Sauvegarder", + "deleteButton": "Supprimer", + "editButton": "Editer les détails", + "noFeatures": "Aucune fonctionnalité" + }, + "setup": { + "title": "Aucun appareil Xiaomi dans Gladys", + "description": "Les appareils détectés par la passerelle Xiaomi seront ajoutés ici lorsqu'ils enverront des données. Votre passerelle Xiaomi doit être en mode développeur. En savoir plus ici .", + "createDeviceInGladys": "Connexion à Gladys", + "createDeviceError": "Une erreur s'est produite lors de la création de cet appareil dans Gladys. ", + "deviceCreatedSuccess": "L'appareil a été ajouté avec succès." + }, + "models": { + "motion": "Capteur de mouvement", + "temperature": "Capteur de température", + "switch": "Commutateur", + "cube": "Contrôleur", + "leak": "Capteur de fuite", + "magnet": "Capteur magnétique" + } } }, - "calendar": { - "date": "Date", - "time": "Heure", - "event": "Évènement", - "allDay": "Journée entière", - "week": "Semaine", - "work_week": "Semaine de travail", - "day": "Jour", + "editScene": { + "startButton": "Démarrer", + "saveButton": "Sauvegarder", + "runButton": "Jouer", + "deleteButton": "Supprimer", + "triggersTitle": "Déclencheurs", + "newTrigger": "Nouveau déclencheur", + "addTriggerButton": "Ajouter déclencheur", + "selectTriggerLabel": "Sélectionnez un type de déclencheur", + "newAction": "Nouvelle action", + "selectActionType": "Sélectionnez un type d'action", + "addActionButton": "Ajouter une nouvelle action", + "noTriggersYet": "Aucun déclencheur n'a encore été ajouté. Il n'est pas obligatoire d'avoir un déclencheur dans une scène.", + "noActionsYet": "Aucune action n'a encore été ajoutée. Cliquez sur le bouton + pour ajouter une action à cette scène.", + "triggersDescription": "Chaque déclencheur est indépendant. Lorsque l'un de ces déclencheurs est déclenché, la scène s'exécute.", + "actionsDescription": "Toutes les actions de ce bloc s'exécuteront en parallèle. Pour effectuer une séquence d'actions, ajoutez des actions au bloc suivant.", + "addNewTriggerButton": "Ajouter un nouveau déclencheur", + "saveSceneError": "Une erreur s'est produite lors de l'enregistrement de votre scène. Veuillez vérifier que toutes les actions / déclencheurs sont remplis et corrects.", + "triggerCard": { + "title": "Déclencheurs", + "searchPlaceholder": "Chercher un déclencheur", + "leavingHomeTitle": "Départ la maison" + }, + "actionsCard": { + "delay": { + "label": " Ce bloc attendra la durée spécifiée.", + "inputPlaceholder": "Durée", + "milliseconds": "millisecondes", + "seconds": "secondes", + "minutes": "minutes", + "hours": "heures" + }, + "messageSend": { + "userLabel": "Utilisateur", + "textLabel": "Message", + "textPlaceholder": "Texte du message" + }, + "turnOnLights": { + "label": "Sélectionnez les lumière que vous souhaitez allumer" + }, + "turnOffLights": { + "label": "Sélectionnez les lumière que vous souhaitez éteindre" + }, + "deviceGetValue": { + "description": "La scène récupèrera le dernier état de l'appareil sélectionné, vous pourrez l'utiliser plus tard dans celle-ci.", + "deviceLabel": "Sélectionnez un appareil" + }, + "onlyContinueIf": { + "variableLabel": "Variable", + "operatorLabel": "Opérateur", + "valueLabel": "Valeur", + "removeLabel": "Effacer", + "orText": "OU", + "orButton": "+ OU" + } + }, + "actions": { + "device": { + "get-value": "Chercher le dernier état" + }, + "message": { + "send": "Envoyer un message" + }, + "delay": "Attendre", + "light": { + "turn-on": "Allumer la lumière", + "turn-off": "Eteindre les lumières" + }, + "scene": { + "start": "Démarrer la scène" + }, + "service": { + "start": "Démarrer le service", + "stop": "Arrêter le service" + }, + "condition": { + "only-continue-if": "Continuer seulement si" + } + }, + "variables": { + "device": { + "get-value": { + "last_value": "Dernière valeur de l'appareil" + } + } + }, + "triggers": { + "device": { + "new-state": "Changement d'état de l'appareil" + }, + "time": { + "changed": "Déclenchement programmé" + } + }, + "triggersCard": { + "newState": { + "equal": "égal", + "superior": "supérieur", + "superiorOrEqual": "supérieur ou égal", + "less": "inférieur", + "lessOrEqual": "inférieur ou égal", + "different": "différent", + "valuePlaceholder": "Valeur", + "on": "On", + "off": "Off" + }, + "scheduledTrigger": { + "typeLabel": "Type", + "everyMonth": "Tous les mois", + "everyWeek": "Toutes les semaines", + "everyDay": "Tous les jours", + "interval": "Intervalle", + "customTime": "Un jour spécifique", + "dateLabel": "Date", + "timeLabel": "Heure", + "unitLabel": "Unité", + "intervalLabel": "Intervalle", + "daysOfTheWeekLabel": "Jour de la semaine", + "dayOfTheMonthLabel": "Jour du mois", + "dateFormat": "MM-dd-yyyy", + "timeCaption": "Heure", + "units": { + "second": "seconde(s)", + "minute": "minute(s)", + "hour": "heure(s)" + }, + "daysOfTheWeek": { + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche" + } + } + } + }, + "profile": { + "title": "Profil", + "editYourProfileTitle": "Editez votre profil", + "userRole": "Utilisateur", + "adminRole": "Administrateur", + "invitationPending": "En attente", + "invitationSuccess": "Acceptée", + "firstnameLabel": "Prénom", + "firstnamePlaceholder": "Entrez votre prénom", + "lastnameLabel": "Nom de famille", + "lastnamePlaceholder": "Entrez votre nom de famille", + "selectorLabel": "Sélecteur", + "birthdateLabel": "Date de naissance", + "year": "Année", "month": "Mois", - "previous": "Avant", - "next": "Après", - "yesterday": "Hier", - "tomorrow": "Demain", - "today": "Aujourd'hui", - "agenda": "Agenda", - "noEventsInRange": "Pas d'évènements sur cette période." + "day": "Jour", + "selectorText": "Le sélecteur est l'identifiant unique de votre utilisateur. Il peut être utilisé dans l'API.", + "profilePictureLabel": "Photo de profil", + "chooseFileLabel": "Choisir un fichier", + "emailLabel": "E-mail", + "emailPlaceholder": "Entrez votre e-mail", + "languageLabel": "Langue", + "english": "English", + "french": "Français", + "passwordLabel": "Mot de passe (min 8 caractères)", + "passwordPlaceholder": "Entrez votre mot de passe", + "passwordRepeatLabel": "Répétez votre mot de passe", + "passwordRepeatPlaceholder": "Répétez votre mot de passe", + "saveButton": "Sauvegarder votre profil", + "firstnameError": "Le prénom est requis.", + "lastnameError": "Le nom de famille est requis.", + "emailError": "L'e-mail n'est pas un e-mail valide", + "passwordError": "Le mot de passe doit contenir au moins 8 caractères.", + "passwordRepeatError": "Le mot de passe ne correspond pas.", + "birthdateError": "La date de naissance est requise.", + "networkError": "Erreur réseau : nous n'avons pas réussi à contacter votre instance Gladys. Êtes-vous connecté au réseau ? Votre instance Gladys est-elle en cours d'exécution ?", + "emailAlreadyExistError": "Un utilisateur avec cet e-mail existe déjà.", + "selectorAlreadyExistError": "Un utilisateur portant ce prénom existe déjà.", + "instanceAlreadyConfiguredError": "Cette instance est déjà configurée. Vous ne pouvez pas créer un autre compte.", + "unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer ou contacter Gladys community." + }, + "settings": { + "title": "Réglages", + "housesTab": "Maisons", + "sessionsTab": "Sessions", + "systemTab": "Système", + "gatewayTab": "Gladys Plus", + "backupTab": "Sauvegardes", + "billingTab": "Facturation", + "gatewayUsersTab": "Utilisateurs", + "gatewayOpenApiTab": "Open API" + }, + "housesSettings": { + "searchPlaceholder": "Chercher une maison", + "newButton": "Nouveau", + "orderDirAsc": "A - Z", + "orderDirDesc": "Z - A", + "defaultNewHouseName": "Nouvelle Maison", + "noHouseFound": "Aucune maison trouvée" + }, + "sessionsSettings": { + "registered": "Connexion", + "session": "Session", + "revoke": "Révoquer", + "device": "Appareil", + "apiKey": "Clé API" + }, + "forgotPassword": { + "title": "Gladys Assistant", + "cardTitle": "Récupérez votre mot de passe", + "emailLabel": "E-mail", + "backToLogin": "Retour à la connexion", + "emailPlaceholder": "Entrez votre e-mail", + "button": "Récupérez votre mot de passe", + "wrongEmailError": "Ce n'est pas un e-mail valide", + "networkError": "Erreur réseau : nous n'avons pas réussi à contacter votre instance Gladys. Êtes-vous connecté au réseau ? Votre instance Gladys est-elle en cours d'exécution ?", + "unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer ou poster un message sur Gladys community.", + "success": "Succès ! Vous devriez voir un lien de réinitialisation de mot de passe dans les logs de Gladys.", + "userNotFound": "Aucun compte n'est lié à cet e-mail.", + "rateLimitError": "Vous avez essayé ce formulaire trop de fois. Veuillez réessayer dans 30 minutes ou redémarrer votre instance Gladys maintenant.", + "invalidEmail": "Nous n'avons pas pu vérifier votre adresse e-mail.", + "validationLinkConfirmation": "Êtes-vous sûr d'avoir cliqué/copié correctement le lien ?", + "contactUs": "Si cela ne fonctionne toujours pas, veuillez nous contacter sur la communauté Gladys.", + "emailConfirmed": "E-mail confirmé", + "signIn": "Connexion", + "confirmationInProgress": "Confirmation en cours ..." + }, + "resetPassword": { + "title": "Gladys Assistant", + "cardTitle": "Réinitialisez votre mot de passe", + "passwordLabel": "Mot de passe (min 8 caractères)", + "passwordPlaceholder": "Entrez votre mot de passe", + "passwordRepeatLabel": "Répétez votre mot de passe", + "passwordRepeatPlaceholder": "Répétez votre mot de passe", + "button": "Réinitialisez votre mot de passe", + "passwordTooShort": "Le mot de passe est trop court", + "passwordRepeatError": "Le mot de passe ne correspond pas.", + "resetTokenNotFound": "Token (Jeton) de réinitialisation non trouvé", + "success": "Mot de passe réinitialisé avec succès.", + "clickHereToLogin": "Cliquez ici pour vous connecter", + "generateLinkAgain": "Générer un nouveau lien de mot de passe oublié", + "resetSuccess": "Réinitialisation du mot de passe réussie ! Cliquez ici pour vous connecter.", + "alreadyHaveAccount": "Vous avez déjà un compte ? Connectez-vous" + }, + "httpErrors": { + "rateLimitError": "Vous avez essayé ce formulaire trop de fois. Veuillez réessayer dans 30 minutes ou redémarrer votre instance Gladys maintenant.", + "unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer ou contacter Gladys community.", + "networkError": "Erreur réseau : nous n'avons pas réussi à contacter votre instance Gladys. Êtes-vous connecté au réseau ? Votre instance Gladys est-elle en cours d'exécution ?" + }, + "systemSettings": { + "connected": "Connecté", + "ping": "{{time}} ms ping", + "disk": "Disque", + "uptime": " Démarré", + "gladysVersion": "Version", + "gladysVersionValue": "Gladys {{version}}", + "operations": "Opérations", + "upToDate": "Gladys est à jour", + "newUpgradeAvailable": "Mise à jour disponible", + "download": "Télécharger", + "notAvailable": "Indisponible sur l'installation personnalisée.", + "containers": "Conteneurs", + "containerName": "Nom", + "containerCreated": "Créé", + "containerStatus": "État", + "downloadFinished": "Téléchargement terminé", + "restartingGladys": "Redémarrage de Gladys ...", + "containerState": { + "created": "Créé", + "restarting": "Redémarrage", + "running": "Démarré", + "removing": "Supprimé", + "paused": "En Pause", + "exited": "Arrêté", + "dead": "Mort" + } + }, + "newScene": { + "cardTitle": "Nouvelle scène", + "nameLabel": "Nom", + "namePlaceholder": "Entrez le nom de votre scène", + "iconLabel": "Sélectionnez une icône pour votre scène", + "createSceneButton": "Créer une scène", + "invalidName": "Le nom est requis", + "invalidIcon": "L'icône est requise", + "sceneAlreadyExist": "Une scène avec le même nom existe déjà." + }, + "scene": { + "title": "Scènes", + "emptySceneSentenceTop": "Impossible de trouver des scènes.", + "orderDirAsc": "A - Z", + "orderDirDesc": "Z - A", + "newButton": "Nouveau", + "editButton": "Editer", + "startButton": "Démarrer", + "searchPlaceholder": "Chercher une scène" + }, + "gateway": { + "instanceConfiguredTitle": "Gladys Plus", + "yourGatewayIsConfigured": "Votre compte Gladys Plus est configuré.", + "yourGatewayIsConnected": "Votre instance Gladys est connectée à la passerelle distante.", + "yourGatewayIsNotConnected": "Votre instance Gladys n'est pas connectée à la passerelle distante.", + "instanceRsaKey": "Empreinte de la clé RSA de l'instance", + "instanceEcdsaKey": "Empreinte de la clé ECDSA de l'instance", + "backupKeyTitle": "Clé de sauvegarde", + "backupKeyDescription": "Votre clé de sauvegarde est utilisée pour chiffrer vos sauvegardes Gladys. Veuillez enregistrer cette clé quelque part en dehors de Gladys pour pouvoir restaurer Gladys. Nous vous recommandons d'utiliser un gestionnaire de mots de passe pour cela.", + "backupKeyLabel": "Votre clé de sauvegarde", + "backupKeyPlaceholder": "Entrez / restaurez une clé de sauvegarde", + "saveBackupKeyButton": "Sauvegarder", + "usersListTitle": "Utilisateurs distants", + "userColumn": "Utilisateur", + "statusColumn": "Etat", + "userRsaKey": "Clé RSA", + "userEcdsaKey": "Clé ECDSA", + "usersListDescription": "Pour garantir la sécurité de votre instance locale, vous devez accorder manuellement l'accès à chaque utilisateur de cette liste.", + "disconnectTitle": "Déconnectez votre compte Gladys Plus", + "disconnectButton": "Déconnecter", + "gatewayConnectedSuccessTitle": "Gladys Plus est connecté avec succès !", + "gatewayConnectedSuccessDescription": "Votre instance de Gladys s'est connectée avec succès.", + "gatewayConnectedSuccessBackupKey": "Une sauvegarde sera faite chaque jour, encodée avec la clé suivante. Ainsi vous pourrez restaurer votre instance plus tard, merci d'enregistrer cette clé de cryptage quelque part, en dehors de Gladys. Sans cette clé, il vous sera impossible de restaurer Gladys.", + "gatewayConnectedSuccessButton": "J'ai enregistré la clé de sauvegarde !" + }, + "gatewayPricing": { + "pricingTitle": "Tarification", + "pricingSentence": "Gladys Assistant est gratuit à utiliser, mais vous pouvez vous abonner à Gladys Plus pour des fonctionnalités supplémentaires !", + "free": "Gratuit", + "gladysPlus": "Gladys Plus", + "currentPlan": "Choix actuel", + "subscribeButton": "Abonnez-vous (9,99 € / mois)", + "alreadyGladysPlusSubscriber": "Déjà abonné Gladys Plus ? Cliquez ici pour vous identifier.", + "openSourceSoftware": "Logiciel Open-Source", + "endToEndEncryptedRemoteAccess": "Accès à distance chiffré de bout en bout", + "dailyEncryptedBackups": "Sauvegardes chiffrées quotidiennes", + "oneClickRestore": "Restauration en un clic", + "remoteWebhooks": "Webhooks à distance", + "ownTracksApiServer": "Serveur API Owntracks", + "privateSlackCommunity": "Communauté Slack privée", + "supportOpenSourceSoftware": "Support logiciel Open-Source" + }, + "gatewayLogin": { + "cardTitle": "Connexion à Gladys Plus", + "emailLabel": "Adresse e-mail", + "emailPlaceholder": "Entrez votre e-mail", + "passwordLabel": "Mot de passe", + "forgotPasswordLabel": "J’ai oublié mon mot de passe", + "passwordPlaceholder": "Entrez votre mot de passe", + "loginButtonText": "Connexion", + "wrongCredentials": "E-mail / mot de passe incorrect.", + "invalidEmail": "E-mail invalide", + "networkError": "Erreur réseau: êtes-vous sûr que votre instance Gladys est connectée à Internet ?", + "userNotAcceptedLocally": "Votre utilisateur n'est pas accepté localement, veuillez revenir à votre instance Gladys et autoriser l'accès à cet utilisateur dans les paramètres.", + "gatewayNoInstanceFound": "Aucune instance connectée à Gladys Plus. Vous devez d'abord connecter votre instance Gladys à Gladys Plus avant de pouvoir l'utiliser ici.", + "gatewayAccessBilling": "Pour accéder à la facturation, cliquez ici.", + "unknownError": "Une erreur inconnue est survenue. Veuillez nous contacter pour plus d'informations.", + "twoFactorCodeLabel": "Code 2FA", + "twoFactorCodePlaceholder": "Code à 6 chiffres", + "loginTwoFactorButtonText": "Finaliser la connexion", + "invalidTwoFactorCode": "Le code 2FA n'est pas valide." + }, + "gatewayBackup": { + "title": "Sauvegardes", + "description": "Si vous êtes abonné à Gladys Plus, Gladys crée une sauvegarde chiffrée de votre instance toutes les 24 heures. Vous seul pouvez déchiffrer les sauvegardes. Vous pouvez restaurer ces sauvegardes en un seul clic dans cette installation, ou toute nouvelle configuration.", + "createdAtColumn": "Date", + "sizeColumn": "Taille", + "restoreColumn": "Restaurer", + "restoreButton": "Restaurer", + "confirmRestore": "Confirmer", + "cancelRestore": "Annuler", + "restoreInProgressTitle": "Restauration de la sauvegarde en cours ...", + "backupNowButton": "Sauvegarder maintenant", + "backupStarted": "Début de la sauvegarde...", + "notConfigured": "Gladys Plus doit être configuré pour activer les sauvegardes. Accédez à l'onglet Gladys Plus pour le configurer." + }, + "deviceFeatureUnit": { + "celsius": "Celsius (°C)", + "fahrenheit": "Fahrenheit (°F)", + "percent": "%", + "ppm": "ppm" + }, + "deviceFeatureUnitShort": { + "celsius": "°C", + "fahrenheit": "°F", + "percent": "%", + "ppm": "ppm" + }, + "deviceFeatureCategory": { + "light": { + "binary": "Eclairage On/Off", + "brightness": "Luminosité éclairage", + "hue": "Teinte éclairage", + "color": "Couleur éclairage", + "saturation": "Saturation éclairage", + "temperature": "Température éclairage", + "power": "Puissance consommée éclairage", + "effect-mode": "Effet", + "effect-speed": "Vitesse de l'effet" + }, + "battery": { + "integer": "Batterie" + }, + "temperature-sensor": { + "decimal": "Valeur température" + }, + "motion-sensor": { + "push": "Détecteur de mouvement", + "binary": "Détection mouvement Oui/Non" + }, + "light-sensor": { + "integer": "Capteur de luminosité - Oui/Non", + "decimal": "Luminosité apparente" + }, + "sismic-sensor": { + "decimal": "Valeur sismique" + }, + "camera": { + "image": "Caméra" + }, + "counter-sensor": { + "integer": "Compteur" + }, + "access-control": { + "mode": "Mode de contrôle d'accès" + }, + "smoke-sensor": { + "binary": "Capteur de fumée - Oui/Non", + "decimal": "Valeur feeeumée détectée" + }, + "co2-sensor": { + "decimal": "CO2" + }, + "switch": { + "voltage": "Tension moyenne", + "current": "Intensité consommée", + "binary": "Commutateur", + "dimmer": "Variateur", + "burglar": "Antivol", + "power": "Puissance consommée", + "energy": "Energie consommée" + }, + "siren": { + "binary": "Sirène On/Off" + }, + "cube": { + "mode": "Mode", + "rotation": "Rotation" + }, + "button": { + "click": "Clic bouton - Oui/Non" + }, + "pressure-sensor": { + "decimal": "Valeur pression" + }, + "leak-sensor": { + "binary": "Fuite" + }, + "opening-sensor": { + "binary": "Ouverture" + }, + "humidity-sensor": { + "decimal": "Humidité" + }, + "vibration-sensor": { + "status": "Etat", + "tilt-angle": "Angle d'inclinaison", + "acceleration-x": "Accélération X", + "acceleration-y": "Accélération Y", + "acceleration-z": "Accélération Z", + "bed-activity": "Activité Lit" + }, + "unknown": { + "unknown": "Inconnu" + } + }, + "errorPage": { + "title": "Oups... Cette page n'existe pas.", + "description": "Si vous pensez qu'il s'agit d'un bug de Gladys Assistant, veuillez le signaler à notre équipe!", + "goBack": "Retour" + }, + "chat": { + "whatCanYouAsk": "Demandez moi...", + "emptyStateMessage": "Envoie-moi un message !", + "messagePlaceholder": "Ecrivez votre message...", + "sendingInProgress": "Envoi en cours ...", + "typingInProgress": "Ecrit...", + "gladysAlt": "Gladys", + "examples": { + "whatsTheWeatherLike": "\"Quel temps fait-il ?\"", + "whatsTheTemperatureKitchen": "\"Quelle est la température dans la cuisine ?\"", + "showCameraImage": "\"Montre moi la caméra de la cuisine\"" + } + }, + "header": { + "gladysAssistant": "Gladys Assistant", + "home": "Accueil", + "chat": "Discussion", + "devices": "Appareils", + "integrations": "Intégrations", + "calendar": "Calendrier", + "maps": "Plans", + "scenes": "Scènes", + "profile": "Profil", + "settings": "Paramètres", + "needHelp": "Besoin d'aide", + "signOut": "Déconnexion" + }, + "gatewayLinkUser": { + "title": "Configurer Gladys Plus", + "label": "Sélectionnez votre utilisateur Gladys", + "description": "Avant de sélectionner votre utilisateur ici, vérifiez que celui-ci soit bien accepté locallement sur votre instance Gladys (dans \"Paramètres\" => \"Gladys Plus\" => \"Utilisateurs\").", + "noInstanceFound": "Votre instance Gladys n'est pas connectée à la passerelle Gladys. Vous êtes-vous connecté à votre compte Gladys Plus dans votre installation Gladys ?", + "error": "Une erreur est survenue. Votre utilisateur est-il autorisé localement dans votre instance Gladys ?", + "saveButton": "Sauvegarder", + "manageBilling": "Pour gérer votre facturation, cliquez " + }, + "editDeviceForm": { + "noName": "Pas de nom", + "nameLabel": "Nom", + "roomLabel": "Pièce", + "featuresLabel": "Fonctionnalités", + "noFeatures": "Aucune fonctionnalité", + "namePlaceholder": "Entrez un nom", + "externalIdLabel": "ID externe", + "externalIdPlaceholder": "Entrez une ID externe", + "unitLabel": "Unité", + "saveButton": "Sauvegarder", + "externalIdMessage": "L'ID externe de la fonctionnalité est un ID unique qui vous aide à identifier cette fonctionnalité en dehors de Gladys, par exemple lors de l'appel de l'API.", + "minLabel": "Valeur minimum", + "minPlaceholder": "Entrez la valeur minimum de la fonctionnalité", + "maxLabel": "Valeur maximum", + "maxPlaceholder": "Entrez la valeur maximum de la fonctionnalité", + "addButton": "Ajouter fonctionnalité", + "deleteLabel": "Supprimer fonctionnalité", + "saveError": "Erreur de sauvegarde ou de suppression de l'appareil", + "saveConflictError": "Conflit : Êtes-vous certains que toutes les fonctionnalités ont un ID externe unique ?", + "notFound": "Appareil recherché introuvable." + }, + "gatewaySignup": { + "title": "Gladys Assistant", + "alreadyHaveAccount": "Avez-vous déjà un compte ?", + "signin": "Se connecter", + "supportText": "Support à hello@gladysassistant.com", + "createAccount": "Créez votre compte Gladys Plus", + "emailAlreadyExistError": "Un compte avec cet e-mail existe déjà", + "browserNotCompatibleError": " Désolé, votre navigateur n'est pas compatible avec la passerelle Gladys. Votre navigateur doit prendre en charge l'API WebCrypto.", + "tokenError": "Vous devez d'abord vous abonner au pack Gladys Community sur le site Web de Gladys !", + "unknownError": "Une erreur inconnue s'est produite. Veuillez réessayer plus tard ou me contacter à hello@gladysassistant.com pour comprendre ce qui s'est passé.", + "invalidInvitationError": "Nous ne pouvons pas récupérer votre invitation. Peut-être qu'il était déjà utilisé ou a expiré ! Veuillez nous contacter à hello@gladysassistant.com." + }, + "gatewaySubscribe": { + "registerGladysPlus": "S'inscrire à Gladys Plus", + "emailAddress": "Adresse e-mail", + "emailAddressPlaceholder": "Entrez un e-mail", + "cardInformations": "Informations de la carte", + "paymentSecuredByStripe": "🔒 Paiement sécurisé par Stripe", + "subscribeButton": "Souscription (9.99€/mois)", + "priceButton": "9.99€/mois", + "invalidEmailAddress": "Adresse e-mail invalide", + "emailAlreadyExist": "Un compte avec cette adresse e-mail existe déjà !", + "paymentFailed": "Paiement échoué. Veuillez réessayer ou essayer avec une autre carte.", + "paymentSuccess": "Félicitations, vous venez de vous abonner à Gladys Plus. Vérifiez votre boîte de réception mail pour accéder au Slack et à la passerelle Gladys. Merci pour votre aide !" + }, + "gatewayForgotPassword": { + "pageTitle": "Gladys Assistant", + "formTitle": "Gladys Plus - Mot de passe oublié", + "success": "Si ce compte existe, vous avez reçu un e-mail avec un lien de réinitialisation de mot de passe.", + "emailAddress": "Adresse e-mail", + "sendEmailButton": "Réinitialiser mon mot de passe", + "emailAddressPlaceholder": "Entrez un e-mail", + "dontHaveAccount": "Vous n'avez pas encore de compte ?", + "signupLink": "S'inscrire" + }, + "gatewayResetPassword": { + "pageTitle": "Gladys Assistant", + "formTitle": "Gladys Plus - Réinitialiser le mot de passe", + "incompatibleBrowserLabel": "Désolé, votre navigateur n'est pas compatible avec la passerelle Gladys. Votre navigateur doit prendre en charge l'API WebCrypto ainsi que la base de données IndexedDB.", + "errorLinkLabel": "Nous ne pouvons pas récupérer votre lien pour la réinitialisation de votre mot de passe. Peut-être qu'il a déjà été utilisé ou a expiré !", + "passwordNotMatchingLabel": "Le mot de passe ne correspond pas.", + "passwordLabel": "Mot de passe (min 8 caractères)", + "passwordPlaceholder": "Mot de passe", + "passwordInvalid": "Le mot de passe doit contenir 8 caractères", + "repeatPasswordLabel": "Répéter le mot de passe", + "twoFactorCodeLabel": "Code à deux facteurs (\"2FA\")", + "twoFactorCodePlaceholder": "Code 2FA à 6 chiffres", + "resetPasswordButton": "Réinitialiser le mot de passe" + }, + "gatewayOpenApi": { + "title": "Open API", + "description": "L'Open API vous permet d'envoyer des informations à Gladys en dehors de votre réseau. Pour l'instant, il vous permet d'envoyer uniquement des données Owntracks.", + "moreInformations": "Plus d'informations.", + "warningKeyDisappear": "Avertissement: vous ne verrez la clé qu'une seule fois. Copiez/collez votre clé et enregistrez-la quelque part.", + "keyName": "Nom", + "keyLastUsed": "Dernière utilisation", + "revoke": "Révoquer", + "generateButton": "Générer", + "registered": "Enregistré le", + "keyNameLabel": "Clé :", + "registeredLabel": "Enregistré le :", + "neverUsed": "Jamais" + }, + "gatewayTwoFactorAuth": { + "title": "Gladys Gateway", + "configureTitle": "Configurer l'authentification Two-Factor (\"2FA\")", + "securityIsImportant": "La sécurité de votre compte Gladys Gateway est vraiment importante pour nous.", + "securityApps": "Pour garantir la sécurité de votre compte, veuillez activer l'authentification à deux facteurs (\"2FA\") à l'aide d'une application à deux facteurs comme Authy sur iOS ou Android.", + "invalidCode": "Le code 2FA que vous avez fourni n'est pas valide.", + "confirmCode": "Confirmer 2FA", + "enterCode": "Entrez le code à 6 chiffres", + "enable": "Activer l'authentification 2FA", + "app": { + "open": "Ouvrez votre application 2FA", + "addAccount": "Cliquez sur \"Ajouter un compte\"", + "scanQRCode": "Scannez le QR Code ci-dessous" + } + }, + "gatewaySignUp": { + "generatingKey": "Génération de vos clés publiques/privées...", + "complete": "Terminé ! Veuillez vérifier votre e-mail.", + "done": "Terminé ! Vous pouvez maintenant vous connecter ici.", + "usernameLabel": "Nom", + "usernamePlaceholder": "Entez votre nom", + "usernameInvalid": "Le nom doit comprendre entre 2 et 30 caractères", + "emailLabel": "Adresse e-mail", + "emailPlaceholder": "Entrez votre adresse e-mail", + "emailInvalid": "L'e-mail n'est pas valide", + "passwordLabel": "Mot de passe (min 8 caractères)", + "passwordPlaceholder": "Mot de passe", + "passwordInvalid": "Le mot de passe doit contenir 8 caractères", + "createAccountButton": "Créer un nouveau compte" + }, + "gatewayUsers": { + "managerUsersLabel": "Gérez vos utilisateurs", + "revokeError": "Vous ne pouvez pas révoquer cet utilisateur.", + "columnName": "Nom", + "columnRole": "Rôle", + "columnStatus": "Statut", + "columnAddDate": "Ajouté le", + "columnRevoke": "Révoquer", + "emailPlaceholder": "E-mail", + "roleAdmin": "Administrateur", + "roleUser": "Utilisateur", + "inviteUserButton": "Inviter Utilisateur" + }, + "gatewayBilling": { + "title": "Facturation", + "informationTitle": "Vos informations de paiement", + "stripeDescription": "Le paiement est géré par Stripe. Nous ne voyons jamais votre carte de crédit.", + "cardTypeLabel": "Type", + "cardLastDigitsLabel": "4 derniers chiffres", + "cardExpirationLabel": "Date d'expiration", + "updateInformationTitle": "Mettre à jour les informations de la carte", + "updateInformationDescription": "Si votre carte a expirée, ou si vous souhaitez changer de carte de crédit, vous pouvez mettre à jour ici les informations de votre carte.", + "cancelSubscriptionTitle": "Annuler l'abonnement", + "cancelSubscriptionError": "Avertissement : une erreur s'est produite lors de la tentative d'annulation de votre compte. Veuillez réessayer ultérieurement.", + "cancelSubscriptionSuccess": "Votre abonnement a été annulé avec succès !", + "cancelSubscriptionDescription": "Si vous souhaitez annuler votre abonnement, cliquez ici :", + "cancelSubscriptionButton": "Annuler l'abonnement", + "accountCancelled": "Votre abonnement a été annulé le {{date}}", + "subscriptionButton": "S'abonner à nouveau" } } diff --git a/front/src/config/integrations/calendar.en.json b/front/src/config/integrations/calendar.en.json index 7d9fba8d57..28ada67f02 100644 --- a/front/src/config/integrations/calendar.en.json +++ b/front/src/config/integrations/calendar.en.json @@ -2,7 +2,7 @@ { "key": "caldav", "name": "CalDAV", - "description": "Sync your Gladys calendar using CalDAV.", + "description": "Sync your CalDAV calendars.", "img": "/assets/integrations/cover/caldav.jpg" } ] diff --git a/front/src/config/integrations/calendar.fr.json b/front/src/config/integrations/calendar.fr.json new file mode 100644 index 0000000000..b244b669e9 --- /dev/null +++ b/front/src/config/integrations/calendar.fr.json @@ -0,0 +1,8 @@ +[ + { + "key": "caldav", + "name": "CalDAV", + "description": "Synchonisez vos calendriers CalDAV.", + "img": "/assets/integrations/cover/caldav.jpg" + } +] diff --git a/front/src/config/integrations/communication.fr.json b/front/src/config/integrations/communication.fr.json new file mode 100644 index 0000000000..2dce322a26 --- /dev/null +++ b/front/src/config/integrations/communication.fr.json @@ -0,0 +1,8 @@ +[ + { + "key": "telegram", + "name": "Telegram", + "description": "Parlez à Gladys grâce à Telegram.", + "img": "/assets/integrations/cover/telegram.jpg" + } +] diff --git a/front/src/config/integrations/device.fr.json b/front/src/config/integrations/device.fr.json new file mode 100644 index 0000000000..219f5cf936 --- /dev/null +++ b/front/src/config/integrations/device.fr.json @@ -0,0 +1,38 @@ +[ + { + "key": "zwave", + "name": "Z-Wave", + "description": "Contrôlez vos appareils Z-Wave.", + "img": "/assets/integrations/cover/zwave.jpg" + }, + { + "key": "rtsp-camera", + "name": "Camera", + "description": "Affichez vos caméras HTTP/RTSP.", + "img": "/assets/integrations/cover/rtsp-camera.jpg" + }, + { + "key": "xiaomi", + "name": "Xiaomi Home", + "description": "Gérez les appareils Xiaomi.", + "img": "/assets/integrations/cover/xiaomi.jpg" + }, + { + "key": "mqtt", + "name": "MQTT", + "description": "Connexion à un serveur MQTT.", + "img": "/assets/integrations/cover/mqtt.jpg" + }, + { + "key": "philips-hue", + "name": "Philips Hue", + "description": "Contrôler les lumières Philips Hue.", + "img": "/assets/integrations/cover/philips-hue.jpg" + }, + { + "key": "tasmota", + "name": "Tasmota", + "description": "Contrôler vos appareils Tasmota.", + "img": "/assets/integrations/cover/tasmota.jpg" + } +] diff --git a/front/src/config/integrations/index.js b/front/src/config/integrations/index.js index afbf90c59d..4db67c0927 100644 --- a/front/src/config/integrations/index.js +++ b/front/src/config/integrations/index.js @@ -3,6 +3,11 @@ import communicationEn from './communication.en.json'; import calendarEn from './calendar.en.json'; import weatherEn from './weather.en.json'; +import deviceFr from './device.fr.json'; +import communicationFr from './communication.fr.json'; +import calendarFr from './calendar.fr.json'; +import weatherFr from './weather.fr.json'; + const integrations = { en: { totalSize: deviceEn.length + communicationEn.length + weatherEn.length + calendarEn.length, @@ -10,6 +15,13 @@ const integrations = { communication: communicationEn, calendar: calendarEn, weather: weatherEn + }, + fr: { + totalSize: deviceFr.length + communicationFr.length + weatherFr.length + calendarFr.length, + device: deviceFr, + communication: communicationFr, + calendar: calendarFr, + weather: weatherFr } }; diff --git a/front/src/config/integrations/weather.fr.json b/front/src/config/integrations/weather.fr.json new file mode 100644 index 0000000000..302cce1bf5 --- /dev/null +++ b/front/src/config/integrations/weather.fr.json @@ -0,0 +1,8 @@ +[ + { + "key": "darksky", + "name": "DarkSky", + "description": "Récupérer la météo dans Gladys.", + "img": "/assets/integrations/cover/darksky.jpg" + } +] diff --git a/front/src/routes/calendar/index.js b/front/src/routes/calendar/index.js index b814ad7d3d..27dc1438b7 100644 --- a/front/src/routes/calendar/index.js +++ b/front/src/routes/calendar/index.js @@ -9,7 +9,7 @@ import 'react-big-calendar/lib/css/react-big-calendar.css'; const localizer = momentLocalizer(moment); -@connect('eventsFormated', actions, moment) +@connect('eventsFormated,user', actions, moment) class Map extends Component { onRangeChange = range => { let from, to; @@ -62,7 +62,7 @@ class Map extends Component { }} onRangeChange={this.onRangeChange} defaultView="week" - culture={navigator.language} + culture={props.user.language} messages={this.context.intl.dictionary.calendar} scrollToTime={moment().subtract(2, 'hours')} /> diff --git a/front/src/routes/chat/ChatItems.js b/front/src/routes/chat/ChatItems.js index 19acae73a1..f9d428a2ba 100644 --- a/front/src/routes/chat/ChatItems.js +++ b/front/src/routes/chat/ChatItems.js @@ -1,4 +1,4 @@ -import { Text } from 'preact-i18n'; +import { Text, Localizer } from 'preact-i18n'; import style from './style.css'; import dayjs from 'dayjs'; @@ -10,7 +10,9 @@ const IncomingMessage = ({ children, ...props }) => (
{' '} - sunil{' '} + + {<Text} />{' '} +
diff --git a/front/src/routes/chat/ChatPage.js b/front/src/routes/chat/ChatPage.js index 2c30824627..d29b50b8f6 100644 --- a/front/src/routes/chat/ChatPage.js +++ b/front/src/routes/chat/ChatPage.js @@ -78,13 +78,13 @@ const IntegrationPage = connect(
  • - "" +
  • - "" +
  • - "" +
diff --git a/front/src/routes/dashboard/DashboardPage.jsx b/front/src/routes/dashboard/DashboardPage.jsx index 376e23e436..f8e99457d8 100644 --- a/front/src/routes/dashboard/DashboardPage.jsx +++ b/front/src/routes/dashboard/DashboardPage.jsx @@ -9,26 +9,28 @@ const DashboardPage = ({ children, ...props }) => (