diff --git a/.travis.yml b/.travis.yml index ff58bf37..c68279a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,17 @@ language: node_js node_js: - - 6 # node v6, to match jenkins + # make sure we work with a range of node versions. + # As of the time of writing: + # - 4.x is still in LTS (until April 2018), but some of our deps (notably + # extract-zip) don't work with it + # - 5.x has been EOLed for nearly a year. + # - 6.x is the current 'LTS' version + # - 7.x is the current 'current' version (until October 2017) + # + # see: https://github.com/nodejs/LTS/ + - 6.0 + - 6 + - 7 install: - scripts/fetch-develop.deps.sh - npm install diff --git a/README.md b/README.md index 4c5452e1..be3f3a8b 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,10 @@ Building From Source Riot is a modular webapp built with modern ES6 and requires a npm build system to build. -1. Install or update `node.js` so that your `npm` is at least at version `2.0.0` -1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git` -1. Switch to the riot-web directory: `cd riot-web` +1. Install or update `node.js` so that your `node` is at least v6.0.0 (and `npm` + is at least v3.8.6). +1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`. +1. Switch to the riot-web directory: `cd riot-web`. 1. If you're using the `develop` branch, install the develop versions of the dependencies, as the released ones will be too old: ``` @@ -65,7 +66,7 @@ to build. ``` Whenever you git pull on riot-web you will also probably need to force an update to these dependencies - the simplest way is to re-run the script, but you can also - manually update and reuild them: + manually update and rebuild them: ``` cd matrix-js-sdk git pull @@ -85,10 +86,10 @@ to build. up-to-date. Or just use https://riot.im/develop - the continuous integration release of the develop branch. (Note that we don't reference the develop versions in git directly due to - https://github.com/npm/npm/issues/3055) -1. Install the prerequisites: `npm install` + https://github.com/npm/npm/issues/3055.) +1. Install the prerequisites: `npm install`. 1. Configure the app by copying `config.sample.json` to `config.json` and - modifying it (see below for details) + modifying it (see below for details). 1. `npm run dist` to build a tarball to deploy. Untaring this file will give a version-specific directory containing all the files that need to go on your web server. diff --git a/config.sample.json b/config.sample.json index 405742ba..7f2c97f9 100644 --- a/config.sample.json +++ b/config.sample.json @@ -11,5 +11,9 @@ "matrix.org" ] }, - "welcomeUserId": "@riot-bot:matrix.org" + "welcomeUserId": "@riot-bot:matrix.org", + "piwik": { + "url": "https://piwik.riot.im/", + "siteId": 1 + } } diff --git a/electron_app/riot.im/config.json b/electron_app/riot.im/config.json index 80526f4a..1303985e 100644 --- a/electron_app/riot.im/config.json +++ b/electron_app/riot.im/config.json @@ -12,5 +12,9 @@ "servers": [ "matrix.org" ] + }, + "piwik": { + "url": "https://piwik.riot.im/", + "siteId": 1 } } diff --git a/src/components/structures/CompatibilityPage.js b/src/components/structures/CompatibilityPage.js index bae33803..88b01cb2 100644 --- a/src/components/structures/CompatibilityPage.js +++ b/src/components/structures/CompatibilityPage.js @@ -17,6 +17,7 @@ limitations under the License. 'use strict'; var React = require('react'); +import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler'; module.exports = React.createClass({ displayName: 'CompatibilityPage', @@ -39,23 +40,37 @@ module.exports = React.createClass({ return (
-

Sorry, your browser is not able to run Riot.

+

{ _tJsx("Sorry, your browser is not able to run Riot.", /(.*?)<\/b>/, (sub) => {sub}) }

- Riot uses many advanced browser features, some of which are not - available or experimental in your current browser. + { _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") }

- Please install Chrome or Firefox for - the best experience. Safari and Opera work too. + { _tJsx('Please install Chrome or Firefox for the best experience.', + [ + /(.*?)<\/a>/, + /(.*?)<\/a>/, + ], + [ + (sub) => {sub}, + (sub) => {sub}, + ] + )} + { _tJsx('Safari and Opera work too.', + [ + /(.*?)<\/a>/, + /(.*?)<\/a>/, + ], + [ + (sub) => {sub}, + (sub) => {sub}, + ] + )}

- With your current browser, the look and feel of the application may - be completely incorrect, and some or all features may not function. - If you want to try it anyway you can continue, but you are on your own - in terms of any issues you may encounter! + { _t("With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!") }

diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 7e2b8cb8..c2d92d13 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -22,6 +22,7 @@ import sdk from 'matrix-react-sdk'; import Matrix from "matrix-js-sdk"; import dis from 'matrix-react-sdk/lib/dispatcher'; import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg'; +import Analytics from 'matrix-react-sdk/lib/Analytics'; import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc'; import Modal from 'matrix-react-sdk/lib/Modal'; import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton'; @@ -61,24 +62,26 @@ module.exports = React.createClass({ return { phase: this.Phase.MemberInfo, member: member, - } - } - else { + }; + } else { return { phase: this.Phase.MemberList - } + }; } }, onMemberListButtonClick: function() { + Analytics.trackEvent('Right Panel', 'Member List Button', 'click'); this.setState({ phase: this.Phase.MemberList }); }, onFileListButtonClick: function() { + Analytics.trackEvent('Right Panel', 'File List Button', 'click'); this.setState({ phase: this.Phase.FilePanel }); }, onNotificationListButtonClick: function() { + Analytics.trackEvent('Right Panel', 'Notification List Button', 'click'); this.setState({ phase: this.Phase.NotificationPanel }); }, @@ -218,7 +221,7 @@ module.exports = React.createClass({ { notificationsHighlight } -
+
; diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index 313f5353..64a53d33 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -213,11 +213,11 @@ module.exports = React.createClass({ var Loader = sdk.getComponent("elements.Spinner"); var modal = Modal.createDialog(Loader); - var step = _t('remove %(name)s from the directory', {name: name}) + '.'; + var step = _t('remove %(name)s from the directory.', {name: name}); MatrixClientPeg.get().setRoomDirectoryVisibility(room.room_id, 'private').then(() => { if (!alias) return; - step = _t('delete the alias') + '.'; + step = _t('delete the alias.'); return MatrixClientPeg.get().deleteAlias(alias); }).done(() => { modal.close(); diff --git a/src/components/structures/SearchBox.js b/src/components/structures/SearchBox.js index faee0b5f..99c44866 100644 --- a/src/components/structures/SearchBox.js +++ b/src/components/structures/SearchBox.js @@ -100,13 +100,13 @@ module.exports = React.createClass({ if (this.props.collapsed) { toggleCollapse = - + } else { toggleCollapse = - + } diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index e1355572..5445fd4f 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -40,6 +40,31 @@ module.exports = React.createClass({ onFinished: React.PropTypes.func, }, + getInitialState: function() { + return { + canRedact: false, + }; + }, + + componentWillMount: function() { + MatrixClientPeg.get().on('RoomMember.powerLevel', this._checkCanRedact); + this._checkCanRedact(); + }, + + componentWillUnmount: function() { + const cli = MatrixClientPeg.get(); + if (cli) { + cli.removeListener('RoomMember.powerLevel', this._checkCanRedact); + } + }, + + _checkCanRedact: function() { + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(this.props.mxEvent.getRoomId()); + const canRedact = room.currentState.maySendRedactionForEvent(this.props.mxEvent, cli.credentials.userId); + this.setState({canRedact}); + }, + onResendClick: function() { Resend.resend(this.props.mxEvent); if (this.props.onFinished) this.props.onFinished(); @@ -136,10 +161,10 @@ module.exports = React.createClass({ ); } - if (!eventStatus && !this.props.mxEvent.isRedacted()) { // sent and not redacted + if (!eventStatus && this.state.canRedact) { redactButton = (
- { _t('Redact') } + { _t('Remove') }
); } @@ -206,7 +231,7 @@ module.exports = React.createClass({ externalURLButton = (
{ _t('Source URL') } + rel="noopener" target="_blank" onClick={ this.closeMenu }>{ _t('Source URL') }
); } diff --git a/src/components/views/globals/MatrixToolbar.js b/src/components/views/globals/MatrixToolbar.js index 6d47ad1b..488b5def 100644 --- a/src/components/views/globals/MatrixToolbar.js +++ b/src/components/views/globals/MatrixToolbar.js @@ -16,11 +16,10 @@ limitations under the License. 'use strict'; -var React = require('react'); +import React from 'react'; import { _t } from 'matrix-react-sdk/lib/languageHandler'; -var Notifier = require("matrix-react-sdk/lib/Notifier"); -var sdk = require('matrix-react-sdk') -var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton'); +import Notifier from 'matrix-react-sdk/lib/Notifier'; +import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton'; module.exports = React.createClass({ displayName: 'MatrixToolbar', @@ -43,5 +42,5 @@ module.exports = React.createClass({ ); - } + }, }); diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js index dacfad92..586ca94c 100644 --- a/src/components/views/messages/MessageTimestamp.js +++ b/src/components/views/messages/MessageTimestamp.js @@ -16,7 +16,6 @@ limitations under the License. 'use strict'; -import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore'; const React = require('react'); const DateUtils = require('matrix-react-sdk/lib/DateUtils'); @@ -30,7 +29,7 @@ module.exports = React.createClass({ render: function() { const date = new Date(this.props.ts); return ( - + { DateUtils.formatTime(date, this.props.showTwelveHour) } ); diff --git a/src/components/views/settings/Notifications.js b/src/components/views/settings/Notifications.js index 11948ace..1b8de52d 100644 --- a/src/components/views/settings/Notifications.js +++ b/src/components/views/settings/Notifications.js @@ -16,7 +16,7 @@ limitations under the License. 'use strict'; var React = require('react'); -import { _t } from 'matrix-react-sdk/lib/languageHandler'; +import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler'; var q = require("q"); var sdk = require('matrix-react-sdk'); var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); @@ -178,6 +178,7 @@ module.exports = React.createClass({ Modal.createDialog(TextInputDialog, { title: _t('Keywords'), description: _t('Enter keywords separated by a comma:'), + button: _t('OK'), value: keywords, onFinished: function onFinished(should_leave, newValue) { @@ -534,7 +535,16 @@ module.exports = React.createClass({ // it corresponds to all content push rules (stored in self.state.vectorContentRule) self.state.vectorPushRules.push({ "vectorRuleId": "_keywords", - "description" : (Messages containing keywords), + "description" : ( + + { _tJsx('Messages containing keywords', + /(.*?)<\/span>/, + (sub) => { + return {sub}; + } + )} + + ), "vectorState": self.state.vectorContentRules.vectorState }); } @@ -548,7 +558,7 @@ module.exports = React.createClass({ self.state.vectorPushRules.push({ "vectorRuleId": vectorRuleId, - "description" : ruleDefinition.description, + "description" : _t(ruleDefinition.description), // Text from VectorPushRulesDefinitions.js "rule": rule, "vectorState": vectorState, }); @@ -589,6 +599,7 @@ module.exports = React.createClass({ phase: self.phases.DISPLAY }); }, function(error) { + console.error(error); self.setState({ phase: self.phases.ERROR }); @@ -623,7 +634,7 @@ module.exports = React.createClass({ return ( - {title} + { title } diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d030e29d..32d0f815 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -5,15 +5,15 @@ "Files": "Dateien", "Notifications": "Benachrichtigungen", "Invite to this room": "In diesen Raum einladen", - "Filter room names": "Raum Namen filtern", + "Filter room names": "Raum-Namen filtern", "Start chat": "Neuen Chat starten", "Room directory": "Raum-Verzeichnis", "Create new room": "Neuen Raum erstellen", "Settings": "Einstellungen", - "powered by Matrix": "gebaut mit Matrix", - "Custom Server Options": "Optionen für eigenen Server", - "Dismiss": "ausblenden", - "Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokollliste vom Home Server", + "powered by Matrix": "betrieben mit Matrix", + "Custom Server Options": "Erweiterte Server-Optionen", + "Dismiss": "Ablehnen", + "Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokoll-Liste vom Home-Server", "The Home Server may be too old to support third party networks": "Der Home-Server ist eventuell zu alt, um Drittanbieter-Netzwerke zu unterstützen", "Directory": "Raum Verzeichnis", "#example:": "#beispiel:", @@ -21,31 +21,31 @@ "No rooms to show": "Keine Räume zum anzeigen", "World readable": "Jeder kann lesen", "Guests can join": "Gäste können beitreten", - "You are not receiving desktop notifications": "Du erhältst keine Desktop Benachrichtigungen", + "You are not receiving desktop notifications": "Du erhältst keine Desktop-Benachrichtigungen", "Enable them now": "Aktiviere diese jetzt", - "Add an email address above to configure email notifications": "Füge eine E-Mail Adresse hinzu um Benachrichtigungen via E-Mail zu erhalten", + "Add an email address above to configure email notifications": "Füge oben eine E-Mail-Adresse hinzu, um die E-Mail-Benachrichtigungseinstellungen zu konfigurieren", "All notifications are currently disabled for all targets.": "Im Moment sind alle Benachrichtigungen für alle Ziele deaktiviert.", - "An error occurred whilst saving your email notification preferences.": "Ein Fehler trat auf während deine E-Mail Einstellungen gespeichert wurden.", + "An error occurred whilst saving your email notification preferences.": "Beim Speichern deiner E-Mail-Benachrichtigungseinstellungen ist ein Fehler aufgetreten.", "and remove": "und entfernen", "Can't update user notification settings": "Kann Benutzerdefinierte Einstellungen nicht aktualisieren", - "Couldn't find a matching Matrix room": "Kann keinen entsprechenden Matrix Raum finden", + "Couldn't find a matching Matrix room": "Konnte keinen entsprechenden Matrix-Raum finden", "delete the alias": "Lösche den Alias", "Delete the room alias": "Lösche den Raum Alias", "Direct Chat": "Privater Chat", "Drop here to": "Hier ablegen", - "Enable audible notifications in web client": "Aktiviere Audio Benachrichtigungen", - "Enable desktop notifications": "Aktiviere Desktop Benachrichtigungen", + "Enable audible notifications in web client": "Audio-Benachrichtigungen im Web-Client aktivieren", + "Enable desktop notifications": "Desktop-Benachrichtigungen aktivieren", "Enable email notifications": "Aktiviere E-Mail Benachrichtigungen", "Enable notifications for this account": "Aktiviere Benachrichtigungen für diesen Benutzer", - "Enter keywords separated by a comma:": "Trage Schlagworte, mit Komma getrennt, ein", + "Enter keywords separated by a comma:": "Schlagworte kommagetrennt eingeben:", "Error": "Fehler", - "Error saving email notification preferences": "Fehler beim Speichern der E-Mail Benachrichtigungseinstellungen", + "Error saving email notification preferences": "Fehler beim Speichern der E-Mail-Benachrichtigungseinstellungen", "#example": "#Beispiel", "Failed to": "Konnte nicht", "Failed to add tag ": "Konnte Tag nicht hinzufügen ", "Failed to change settings": "Einstellungen konnten nicht geändert werden", "Failed to update keywords": "Konnte Suchbegriff nicht aktualisieren", - "Failed to get public room list": "Konnte keine öffentliche Raumliste laden", + "Failed to get public room list": "Die Liste der öffentlichen Räume konnte nicht geladen werden", "Failed to join the room": "Fehler beim Betreten des Raumes", "Failed to remove tag ": "Konnte Tag nicht entfernen ", "Failed to set Direct Message status of room": "Konnte den direkten Benachrichtigungsstatus nicht setzen", @@ -54,34 +54,34 @@ "Forget": "Lösche", "from the directory": "aus dem Verzeichnis", " from room": " aus dem Raum", - "Guest users can't invite users. Please register to invite": "Gastnutzer können keine Nutzer einladen. Bitte registriere dich um Nutzer einzuladen", - "Keywords": "Suchbegriff", + "Guest users can't invite users. Please register to invite": "Gastnutzer können keine Nutzer einladen. Bitte registriere dich, um Nutzer einzuladen", + "Keywords": "Schlüsselwörter", "Leave": "Verlassen", "Low Priority": "Niedrige Priorität", "Noisy": "Laut", - "Notification targets": "Benachrichtigungsziel", + "Notification targets": "Benachrichtigungsziele", "Notifications on the following keywords follow rules which can’t be displayed here:": "Benachrichtigungen zu folgenden Stichwörtern folgen Regeln, die hier nicht angezeigt werden können:", - "Notify for all other messages/rooms": "Benachrichtigung für alle anderen Mitteilungen/ Räume", + "Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren", "Operation failed": "Aktion fehlgeschlagen", "Reject": "ablehnen", - "Remove": "Entferne", + "Remove": "Entfernen", "remove": "Entferner", - "Remove from Directory": "Vom Raum Verzeichnis entfernen", + "Remove from Directory": "Aus dem Raum-Verzeichnis entfernen", "Riot does not know how to join a room on this network": "Riot weiß nicht, wie es einem Raum auf diesem Netzwerk beitreten soll", "Room not found": "Raum nicht gefunden", "There are advanced notifications which are not shown here": "Es existieren erweiterte Benachrichtigungen, welche hier nicht angezeigt werden", "The server may be unavailable or overloaded": "Der Server ist vermutlich nicht erreichbar oder überlastet", "This room is inaccessible to guests. You may be able to join if you register": "Dieser Raum ist nicht verfügbar für Gäste. Vermutlich klappt es wenn du dich anmeldest", - "Unable to fetch notification target list": "Nicht möglich die Zielliste für Benachrichtigungen zu erhalten", + "Unable to fetch notification target list": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden", "Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten", "unknown error code": "Unbekannter Fehlercode", "Unnamed room": "Unbenannter Raum", "Notify me for anything else": "Benachrichtige mich für alles andere", "Off": "Aus", "On": "An", - "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Client als Riot konfiguriert. Sie sind in Riot nicht anpassbar gelten aber trotzdem", + "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Client als Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem", " to room": " an Raum", - "Drop here %(toAction)s": "%(toAction)s hierher ziehen", + "Drop here %(toAction)s": "Hierher ziehen: %(toAction)s", "All messages": "Alle Nachrichten", "All messages (loud)": "Alle Nachrichten (laut)", "Cancel Sending": "Senden abbrechen", @@ -91,7 +91,7 @@ "Failed to add tag %(tagName)s to room": "Das Hinzufügen des Tags %(tagName)s für den Raum ist fehlgeschlagen", "Failed to forget room %(errCode)s": "Das Entfernen des Raums %(errCode)s aus deiner Liste ist fehlgeschlagen", "Failed to remove tag %(tagName)s from room": "Das Entfernen des Tags %(tagName)s für den Raum ist fehlgeschlagen", - "Failed to set direct chat tag": "Fehler beim setzen der Direct Chat Kennzeichnung", + "Failed to set direct chat tag": "Fehler beim Setzen der \"Direkter Chat\"-Kennzeichnung", "Mentions only": "Nur, wenn du erwähnt wirst", "Mute": "Stummschalten", "Permalink": "Permanenter Link", @@ -99,7 +99,7 @@ "Redact": "Redaktionell entfernen", "Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?", "remove %(name)s from the directory": "entferne %(name)s aus dem Verzeichnis", - "Resend": "Erneut Senden", + "Resend": "Erneut senden", "Source URL": "Quell-URL", "Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen", "Unhide Preview": "Vorschau wieder anzeigen", @@ -107,7 +107,7 @@ "View Decrypted Source": "Entschlüsselten Quellcode ansehen", "View Source": "Quellcode ansehen", "You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)", - "You cannot delete this message. (%(code)s)": "Die Nachricht kann nicht gelöscht werden. (%(code)s)", + "You cannot delete this message. (%(code)s)": "Diese Nachricht kann nicht gelöscht werden. (%(code)s)", "Today": "Heute", "Wednesday": "Mittwoch", "Thursday": "Donnerstag", @@ -122,10 +122,10 @@ "Call invitation": "Anruf-Einladung", "Messages containing my display name": "Nachrichten, die meinen Anzeigenamen enthalten", "Messages containing my user name": "Nachrichten, die meinen Nutzernamen enthalten", - "Messages in group chats": "Nachrichten in Chat-Gruppen", + "Messages in group chats": "Nachrichten in Gruppen-Chats", "Messages in one-to-one chats": "Nachrichten in Eins-zu-Eins-Chats", "Messages sent by bot": "Nachrichten von Bots", "more": "mehr", "When I'm invited to a room": "Wenn ich in einen Raum eingeladen werde", - "customServer_text": "Du kannst die erweiterten Server-Optioen nutzen um dich an anderen Matrix-Servern mittels anderer Heimserver-URL anzumelden.
Dies erlaubt dir Riot mit einem existierendem Konto auf einem anderen Heimserver zu nutzen.

Du kannst auch einen benutzerdefinierten Identitäts-Server setzen, aber du wirst dann nicht in der Lage sein, Nutzer per E-Mail-Adresse einzuladen oder selbst mit E-Mail-Adresse eingeladen zu werden." + "customServer_text": "Du kannst die erweiterten Server-Optionen nutzen, um dich auf anderen Matrix-Servern anzumelden, indem du eine andere Heimserver-URL eingibst.
Dies ermöglicht es dir, Riot mit einem bereits existierenden Matrix-Konto auf einem anderen Heimserver zu nutzen.

Du kannst auch einen benutzerdefinierten Identitäts-Server eingeben, allerdings wirst du dann nicht in der Lage sein, andere Benutzer per E-Mail-Adresse einzuladen oder selbst Einladungen per E-Mail-Adresse zu erhalten." } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 039f5b76..adf0800d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1,4 +1,5 @@ { + "Safari and Opera work too.": "Safari and Opera work too.", "Add an email address above to configure email notifications": "Add an email address above to configure email notifications", "Advanced notification settings": "Advanced notification settings", "All messages": "All messages", @@ -9,6 +10,7 @@ "Cancel Sending": "Cancel Sending", "Can't update user notification settings": "Can't update user notification settings", "Close": "Close", + "Collapse panel": "Collapse panel", "Create new room": "Create new room", "Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room", "Custom Server Options": "Custom Server Options", @@ -29,6 +31,7 @@ "Error": "Error", "Error saving email notification preferences": "Error saving email notification preferences", "#example": "#example", + "Expand panel": "Expand panel", "Failed to": "Failed to", "Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room", "Failed to change settings": "Failed to change settings", @@ -48,6 +51,7 @@ " from room": " from room", "Guests can join": "Guests can join", "Guest users can't invite users. Please register to invite": "Guest users can't invite users. Please register to invite", + "I understand the risks and wish to continue": "I understand the risks and wish to continue", "Invite to this room": "Invite to this room", "Keywords": "Keywords", "Leave": "Leave", @@ -55,6 +59,7 @@ "Members": "Members", "Mentions only": "Mentions only", "Messages containing my display name": "Messages containing my display name", + "Messages containing keywords": "Messages containing keywords", "Messages containing my user name": "Messages containing my user name", "Messages in group chats": "Messages in group chats", "Messages in one-to-one chats": "Messages in one-to-one chats", @@ -72,6 +77,7 @@ "On": "On", "Operation failed": "Operation failed", "Permalink": "Permalink", + "Please install Chrome or Firefox for the best experience.": "Please install Chrome or Firefox for the best experience.", "Please Register": "Please Register", "powered by Matrix": "powered by Matrix", "Quote": "Quote", @@ -83,11 +89,13 @@ "Remove from Directory": "Remove from Directory", "Resend": "Resend", "Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network", + "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", "Room directory": "Room directory", "Room not found": "Room not found", "Search for a room": "Search for a room", "Settings": "Settings", "Source URL": "Source URL", + "Sorry, your browser is not able to run Riot.": "Sorry, your browser is not able to run Riot.", "Start chat": "Start chat", "The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks", "There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here", @@ -118,5 +126,6 @@ "Saturday": "Saturday", "Today": "Today", "Yesterday": "Yesterday", - "Welcome page": "Welcome page" + "Welcome page": "Welcome page", + "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!" } diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index beef27c1..616d628d 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -13,10 +13,10 @@ "customServer_text": "Puedes utilizar las opciones de servidor personalizadas para iniciar sesión en otros servidores Matrix especificando una URL de Home server distinta.
Esto te permite usar Riot con una cuenta Matrix existente en un Home server distinto.

También puedes configurar un servidor de identidad personalizado, pero no podrás invitar usuarios por dirección de email, ni ser invitado por email por ti mismo.", "delete the alias": "borrar el alias", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "¿Borrar la sala alias %(alias)s y retirar %(name)s del directorio?", - "Direct Chat": "Chat Directo", + "Direct Chat": "Conversación directa", "Directory": "Directorio", "Download this file": "Descargar este archivo", - "Drop here %(toAction)s": "Soltar aquí %(toAction)s", + "Drop here %(toAction)s": "Suelta aquí para %(toAction)s", "Enable audible notifications in web client": "Habilitar notificaciones audibles en el cliente web", "Enable desktop notifications": "Habilitar notificaciones de escritorio", "Enable email notifications": "Habilitar notificaciones por email", @@ -28,11 +28,11 @@ "#example": "#ejemplo", "Failed to add tag %(tagName)s to room": "Error al añadir la etiqueta %(tagName)s a la sala", "Failed to change settings": "Error al cambiar la configuración", - "Failed to forget room %(errCode)s": "No se pudo olvidar la habitación %(errCode)s", + "Failed to forget room %(errCode)s": "Falló al olvidar la sala %(errCode)s", "Failed to update keywords": "Error al actualizar las palabras clave", "Failed to get protocol list from Home Server": "Error al obtener la lista de protocolos de Home Server", "Failed to get public room list": "No se pudo obtener la lista de salas públicas", - "Failed to join the room": "No se puede unir a la habitación", + "Failed to join the room": "Falló al unirse a la sala", "Failed to remove tag %(tagName)s from room": "Error al eliminar la etiqueta %(tagName)s de la sala", "Failed to set direct chat tag": "Error al establecer la etiqueta de chat directo", "Failed to set Direct Message status of room": "No se pudo establecer el estado de Mensaje Directo de la sala", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index dfd38e86..08d578a5 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -3,7 +3,7 @@ "All messages": "Tous les messages", "All messages (loud)": "Tous les messages (fort)", "All notifications are currently disabled for all targets.": "Toutes les notifications sont désactivées pour tous les appareils.", - "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notifications par e-mail", + "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notifications mail.", "Cancel Sending": "Annuler l'envoi", "Can't update user notification settings": "Impossible de mettre à jour les notifications utilisateur", "Close": "Fermer", @@ -67,10 +67,10 @@ "Failed to set Direct Message status of room": "Échec de la configuration de l'état de Message Direct du salon", "Fetching third party location failed": "Échec de la récupération de la localisation tierce", "Files": "Fichiers", - "Filter room names": "Filtrer les noms des salons", + "Filter room names": "Filtrer les salons par nom", "Forget": "Oublier", " from room": " du salon", - "Guest users can't invite users. Please register to invite": "Les invités ne peuvent démarrer une discussion. Merci de vous enregistrer pour pouvoir démarrer une discussion", + "Guest users can't invite users. Please register to invite": "Les visiteurs ne peuvent démarrer une discussion. Merci de vous enregistrer pour pouvoir démarrer une discussion", "Invite to this room": "Inviter dans ce salon", "Keywords": "Mots-clés", "Leave": "Quitter", @@ -83,7 +83,7 @@ "Messages in one-to-one chats": "Messages dans les conversations directes", "Messages sent by bot": "Messages envoyés par des robots", "more": "plus", - "Mute": "Muet", + "Mute": "Couper le son", "No rooms to show": "Aucun salon à afficher", "Noisy": "Sonore", "Notification targets": "Appareils recevant les notifications", @@ -104,7 +104,7 @@ "The Home Server may be too old to support third party networks": "Le Home Server semble trop ancien pour supporter des réseaux tiers", "There are advanced notifications which are not shown here": "Il existe une configuration avancée des notifications qui ne peut être affichée ici", "The server may be unavailable or overloaded": "Le serveur est indisponible ou surchargé", - "This room is inaccessible to guests. You may be able to join if you register": "Ce salon n'est pas ouvert aux invités. Vous pourrez peut-être le rejoindre si vous vous enregistrez", + "This room is inaccessible to guests. You may be able to join if you register": "Ce salon n'est pas ouvert aux visiteurs. Vous pourrez peut-être le rejoindre si vous vous enregistrez", "Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications", "Unable to join network": "Impossible de rejoindre le réseau", "Unable to look up room ID from server": "Impossible de récupérer l'ID du salon sur le serveur", @@ -115,10 +115,9 @@ "When I'm invited to a room": "Quand je suis invité dans un salon", "World readable": "Visible par tout le monde", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vous les avez probablement configurées dans un autre client que Riot. Vous ne pouvez pas les configurer dans Riot mais elles s'appliquent quand même", - "Guests can join": "Ouvert aux invités", + "Guests can join": "Ouvert aux visiteurs", " to room": " au salon", "Advanced notification settings": "Paramètres de notifications avancés", - "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notifications mail.", - "customServer_text": "Vous pouvez utiliser l'option de serveur personnalisé pour vous connectez à d'autres serveurs Matrix, en spécifiant une adresse différente pour Home serveur.
Cela permet d'utiliser Riot avec un compte existant sur un Home serveur différent.

Vous pouvez aussi indiquer un serveur d'identité personnel mais vous ne pourrez plus inviter des utilisateurs par email, ou être invité par email.", + "customServer_text": "Vous pouvez utiliser l'option de serveur personnalisé pour vous connectez à d'autres serveurs Matrix, en spécifiant une adresse de homerserver différente.
Cela permet d'utiliser Riot avec un compte existant sur un homeserverdifférent.

Vous pouvez aussi indiquer un serveur d'identité personnel mais vous ne pourrez plus inviter des utilisateurs par email, ou être invité par email.", "Notifications on the following keywords follow rules which can’t be displayed here:": "Les notifications pour les mots clés suivant répondent à des critères qui ne peuvent pas être affichés ici :" } diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index f535bf0e..7687d4c4 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -115,8 +115,9 @@ "Saturday": "Sábado", "Today": "Hoje", "Yesterday": "Ontem", - "All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os destinatários.", "#example": "#exemplo", "Failed to remove tag %(tagName)s from room": "Não foi possível remover a marcação %(tagName)s desta sala", - "Welcome page": "Página de boas vindas" + "Welcome page": "Página de boas vindas", + "Advanced notification settings": "Configurações avançadas de notificação", + "customServer_text": "Você pode usar as opções de servidor personalizado para entrar em outros servidores Matrix, especificando uma URL de outro Servidor de Base. Isso permite que você use Riot com uma conta Matrix que exista em outro Servidor de Base. Você também pode configurar um servidor de Identidade personalizado, mas neste caso não poderá convidar usuárias(os) pelo endereço de e-mail, ou ser convidado(a) pelo seu endereço de e-mail." } diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/i18n/strings/te.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/i18n/strings/uk.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/notifications/VectorPushRulesDefinitions.js b/src/notifications/VectorPushRulesDefinitions.js index d696451d..df6db6c3 100644 --- a/src/notifications/VectorPushRulesDefinitions.js +++ b/src/notifications/VectorPushRulesDefinitions.js @@ -65,7 +65,7 @@ module.exports = { // Messages containing user's display name ".m.rule.contains_display_name": new VectorPushRuleDefinition({ kind: "override", - description: "Messages containing my display name", + description: "Messages containing my display name", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND, @@ -76,7 +76,7 @@ module.exports = { // Messages containing user's username (localpart/MXID) ".m.rule.contains_user_name": new VectorPushRuleDefinition({ kind: "override", - description: "Messages containing my user name", + description: "Messages containing my user name", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // The actions for each vector state, or null to disable the rule. on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND, @@ -87,7 +87,7 @@ module.exports = { // Messages just sent to the user in a 1:1 room ".m.rule.room_one_to_one": new VectorPushRuleDefinition({ kind: "underride", - description: "Messages in one-to-one chats", + description: "Messages in one-to-one chats", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, @@ -100,7 +100,7 @@ module.exports = { // By opposition, all other room messages are from group chat rooms. ".m.rule.message": new VectorPushRuleDefinition({ kind: "underride", - description: "Messages in group chats", + description: "Messages in group chats", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, @@ -111,7 +111,7 @@ module.exports = { // Invitation for the user ".m.rule.invite_for_me": new VectorPushRuleDefinition({ kind: "underride", - description: "When I'm invited to a room", + description: "When I'm invited to a room", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND, @@ -122,7 +122,7 @@ module.exports = { // Incoming call ".m.rule.call": new VectorPushRuleDefinition({ kind: "underride", - description: "Call invitation", + description: "Call invitation", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { on: StandardActions.ACTION_NOTIFY, loud: StandardActions.ACTION_NOTIFY_RING_SOUND, @@ -133,7 +133,7 @@ module.exports = { // Notifications from bots ".m.rule.suppress_notices": new VectorPushRuleDefinition({ kind: "override", - description: "Messages sent by bot", + description: "Messages sent by bot", // passed through _t() translation in src/components/views/settings/Notifications.js vectorStateToActions: { // .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI on: StandardActions.ACTION_DISABLED, diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss index 9d970ad4..d853f939 100644 --- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss +++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss @@ -62,7 +62,7 @@ limitations under the License. visibility: hidden; white-space: nowrap; color: $event-timestamp-color; - font-size: 11px; + font-size: 10px; left: 8px; position: absolute; } diff --git a/src/vector/index.js b/src/vector/index.js index 14f8bb4b..432710fb 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -56,7 +56,7 @@ if (process.env.NODE_ENV !== 'production') { var RunModernizrTests = require("./modernizr"); // this side-effects a global var ReactDOM = require("react-dom"); var sdk = require("matrix-react-sdk"); -var PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg"); +const PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg"); sdk.loadSkin(require('../component-index')); var VectorConferenceHandler = require('../VectorConferenceHandler'); var UpdateChecker = require("./updater"); @@ -143,7 +143,7 @@ var onNewScreen = function(screen) { var hash = '#/' + screen; lastLocationHashSet = hash; window.location.hash = hash; -} +}; // We use this to work out what URL the SDK should // pass through when registering to allow the user to @@ -295,8 +295,7 @@ async function loadApp() { />, document.getElementById('matrixchat') ); - } - else { + } else { console.error("Browser is missing required features."); // take to a different landing page to AWOOOOOGA at the user var CompatibilityPage = sdk.getComponent("structures.CompatibilityPage"); diff --git a/src/vector/platform/ElectronPlatform.js b/src/vector/platform/ElectronPlatform.js index bf930a67..13604cda 100644 --- a/src/vector/platform/ElectronPlatform.js +++ b/src/vector/platform/ElectronPlatform.js @@ -67,6 +67,10 @@ export default class ElectronPlatform extends VectorBasePlatform { dis.register(_onAction); } + getHumanReadableName(): string { + return 'Electron Platform'; + } + setNotificationCount(count: number) { if (this.notificationCount === count) return; super.setNotificationCount(count); diff --git a/src/vector/platform/VectorBasePlatform.js b/src/vector/platform/VectorBasePlatform.js index 00c9c47c..04caecdc 100644 --- a/src/vector/platform/VectorBasePlatform.js +++ b/src/vector/platform/VectorBasePlatform.js @@ -35,6 +35,10 @@ export default class VectorBasePlatform extends BasePlatform { this._updateFavicon(); } + getHumanReadableName(): string { + return 'Vector Base Platform'; + } + _updateFavicon() { try { // This needs to be in in a try block as it will throw diff --git a/src/vector/platform/WebPlatform.js b/src/vector/platform/WebPlatform.js index cdff7344..1a3c46fb 100644 --- a/src/vector/platform/WebPlatform.js +++ b/src/vector/platform/WebPlatform.js @@ -31,6 +31,10 @@ export default class WebPlatform extends VectorBasePlatform { this.runningVersion = null; } + getHumanReadableName(): string { + return 'Web Platform'; + } + /** * Returns true if the platform supports displaying * notifications, otherwise false.