From 52cdf609540f1883abfec9bb3998f330fa2e5bf0 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 26 May 2018 20:27:48 -0600 Subject: [PATCH 01/85] Add options to pin unread/mentioned rooms to the top of the room list Fixes https://github.com/vector-im/riot-web/issues/6604 Fixes https://github.com/vector-im/riot-web/issues/732 Fixes https://github.com/vector-im/riot-web/issues/1104 Signed-off-by: Travis Ralston --- src/components/structures/RoomSubList.js | 21 ++++++++++++++++++++- src/components/structures/UserSettings.js | 2 ++ src/i18n/strings/en_EN.json | 2 ++ src/settings/Settings.js | 10 ++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index fb82ee067b..b3c9d5f1b6 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -17,6 +17,8 @@ limitations under the License. 'use strict'; +import SettingsStore from "../../settings/SettingsStore"; + var React = require('react'); var ReactDOM = require('react-dom'); var classNames = require('classnames'); @@ -98,8 +100,10 @@ var RoomSubList = React.createClass({ componentWillReceiveProps: function(newProps) { // order the room list appropriately before we re-render //if (debug) console.log("received new props, list = " + newProps.list); + const filteredRooms = this.applySearchFilter(newProps.list, newProps.searchFilter); + const sortedRooms = newProps.order === "recent" ? this.applyPinnedTileRules(filteredRooms) : filteredRooms; this.setState({ - sortedList: this.applySearchFilter(newProps.list, newProps.searchFilter), + sortedList: sortedRooms, }); }, @@ -110,6 +114,21 @@ var RoomSubList = React.createClass({ }); }, + applyPinnedTileRules: function(list) { + const pinUnread = SettingsStore.getValue("pinUnreadRooms"); + const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); + if (!pinUnread && !pinMentioned) { + return list; // Nothing to sort + } + + const mentioned = !pinMentioned ? [] : list.filter(room => room.getUnreadNotificationCount("highlight") > 0); + const unread = !pinUnread ? [] : list.filter(room => Unread.doesRoomHaveUnreadMessages(room)); + + return mentioned + .concat(unread.filter(room => !mentioned.find(other => other === room))) + .concat(list.filter(room => !unread.find(other => other === room))); + }, + // The header is collapsable if it is hidden or not stuck // The dataset elements are added in the RoomList _initAndPositionStickyHeaders method isCollapsableOnClick: function() { diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index c8ce79905d..3695e0cf9f 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -81,6 +81,8 @@ const SIMPLE_SETTINGS = [ { id: "VideoView.flipVideoHorizontally" }, { id: "TagPanel.disableTagPanel" }, { id: "enableWidgetScreenshots" }, + { id: "pinMentionedRooms" }, + { id: "pinUnreadRooms" }, ]; // These settings must be defined in SettingsStore diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bf9e395bee..1b378c34d3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -218,6 +218,8 @@ "Enable URL previews for this room (only affects you)": "Enable URL previews for this room (only affects you)", "Enable URL previews by default for participants in this room": "Enable URL previews by default for participants in this room", "Room Colour": "Room Colour", + "Pin unread rooms to the top of the room list": "Pin unread rooms to the top of the room list", + "Pin rooms I'm mentioned in to the top of the room list": "Pin rooms I'm mentioned in to the top of the room list", "Enable widget screenshots on supported widgets": "Enable widget screenshots on supported widgets", "Collecting app version information": "Collecting app version information", "Collecting logs": "Collecting logs", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index b1bc4161fd..1665a59dfd 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -269,6 +269,16 @@ export const SETTINGS = { default: true, controller: new AudioNotificationsEnabledController(), }, + "pinMentionedRooms": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td("Pin rooms I'm mentioned in to the top of the room list"), + default: false, + }, + "pinUnreadRooms": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td("Pin unread rooms to the top of the room list"), + default: false, + }, "enableWidgetScreenshots": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td('Enable widget screenshots on supported widgets'), From 3d8f0adf56d0bd0607d6ad553c47cf915a87cf95 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 12 Oct 2018 14:35:54 -0600 Subject: [PATCH 02/85] Move pinned rooms check to the RoomListStore --- src/components/structures/RoomSubList.js | 20 +------------------ src/stores/RoomListStore.js | 25 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js index 6aaa875e48..d798070659 100644 --- a/src/components/structures/RoomSubList.js +++ b/src/components/structures/RoomSubList.js @@ -19,7 +19,6 @@ limitations under the License. import React from 'react'; import classNames from 'classnames'; import sdk from '../../index'; -import SettingsStore from "../../settings/SettingsStore"; import { Droppable } from 'react-beautiful-dnd'; import { _t } from '../../languageHandler'; import dis from '../../dispatcher'; @@ -100,10 +99,8 @@ const RoomSubList = React.createClass({ componentWillReceiveProps: function(newProps) { // order the room list appropriately before we re-render //if (debug) console.log("received new props, list = " + newProps.list); - const filteredRooms = this.applySearchFilter(newProps.list, newProps.searchFilter); - const sortedRooms = newProps.order === "recent" ? this.applyPinnedTileRules(filteredRooms) : filteredRooms; this.setState({ - sortedList: sortedRooms, + sortedList: this.applySearchFilter(newProps.list, newProps.searchFilter), }); }, @@ -116,21 +113,6 @@ const RoomSubList = React.createClass({ (filter[0] === '#' && room.getAliases().some((alias) => alias.toLowerCase().startsWith(lcFilter)))); }, - applyPinnedTileRules: function(list) { - const pinUnread = SettingsStore.getValue("pinUnreadRooms"); - const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); - if (!pinUnread && !pinMentioned) { - return list; // Nothing to sort - } - - const mentioned = !pinMentioned ? [] : list.filter(room => room.getUnreadNotificationCount("highlight") > 0); - const unread = !pinUnread ? [] : list.filter(room => Unread.doesRoomHaveUnreadMessages(room)); - - return mentioned - .concat(unread.filter(room => !mentioned.find(other => other === room))) - .concat(list.filter(room => !unread.find(other => other === room))); - }, - // The header is collapsable if it is hidden or not stuck // The dataset elements are added in the RoomList _initAndPositionStickyHeaders method isCollapsableOnClick: function() { diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 67c0c13be7..4c3e10e77f 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -17,6 +17,7 @@ import {Store} from 'flux/utils'; import dis from '../dispatcher'; import DMRoomMap from '../utils/DMRoomMap'; import Unread from '../Unread'; +import SettingsStore from "../settings/SettingsStore"; /** * A class for storing application state for categorising rooms in @@ -263,6 +264,30 @@ class RoomListStore extends Store { } _recentsComparator(roomA, roomB) { + const pinUnread = SettingsStore.getValue("pinUnreadRooms"); + const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); + + // We try and set the ordering to be Mentioned > Unread > Recent + // assuming the user has the right settings, of course + + if (pinMentioned) { + const mentionsA = roomA.getUnreadNotificationCount("highlight") > 0; + const mentionsB = roomB.getUnreadNotificationCount("highlight") > 0; + if (mentionsA && !mentionsB) return -1; + if (!mentionsA && mentionsB) return 1; + if (mentionsA && mentionsB) return 0; + // If neither have mentions, fall through to remaining checks + } + + if (pinUnread) { + const unreadA = Unread.doesRoomHaveUnreadMessages(roomA); + const unreadB = Unread.doesRoomHaveUnreadMessages(roomB); + if (unreadA && !unreadB) return -1; + if (!unreadA && unreadB) return 1; + if (unreadA && unreadB) return 0; + // If neither have unread messages, fall through to remaining checks + } + // XXX: We could use a cache here and update it when we see new // events that trigger a reorder return this._tsOfNewestEvent(roomB) - this._tsOfNewestEvent(roomA); From 54f9231582bd4581fd739ef8afd19dd169eb9ab5 Mon Sep 17 00:00:00 2001 From: Maxwell Kepler Date: Mon, 22 Oct 2018 20:57:58 +0100 Subject: [PATCH 03/85] Added badge to GIFs (https://github.com/vector-im/riot-web/issues/7344) --- res/css/views/messages/_MImageBody.scss | 11 +++++++++++ res/themes/dark/css/_dark.scss | 3 +++ res/themes/light/css/_base.scss | 3 +++ src/components/views/messages/MImageBody.js | 9 +++++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 4c763c5991..8752da117d 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -46,3 +46,14 @@ limitations under the License. .mx_MImageBody_thumbnail_spinner > * { transform: translate(-50%, -50%); } + +.mx_MImageBody_GIFlabel { + position: absolute; + display: block; + top: 0px; + left: 14px; + padding: 5px; + border-radius: 5px; + background: $imagebody-giflabel; + border: 2px solid $imagebody-giflabel-border; +} diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 8ab338790e..ce334e3710 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -143,6 +143,9 @@ $lightbox-bg-color: #454545; $lightbox-fg-color: #ffffff; $lightbox-border-color: #ffffff; +$imagebody-giflabel: rgba(1, 1, 1, 0.7); +$imagebody-giflabel-border: rgba(1, 1, 1, 0.2); + // unused? $progressbar-color: #000; diff --git a/res/themes/light/css/_base.scss b/res/themes/light/css/_base.scss index c7fd38259c..65cdcce209 100644 --- a/res/themes/light/css/_base.scss +++ b/res/themes/light/css/_base.scss @@ -148,6 +148,9 @@ $lightbox-bg-color: #454545; $lightbox-fg-color: #ffffff; $lightbox-border-color: #ffffff; +$imagebody-giflabel: rgba(0, 0, 0, 0.7); +$imagebody-giflabel-border: rgba(0, 0, 0, 0.2); + // unused? $progressbar-color: #000; diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 787285d932..69cff6691c 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -278,6 +278,7 @@ export default class MImageBody extends React.Component { let img = null; let placeholder = null; + let giflabel = null; // e2e image hasn't been decrypted yet if (content.file !== undefined && this.state.decryptedUrl === null) { @@ -292,7 +293,7 @@ export default class MImageBody extends React.Component { if (thumbUrl && !this.state.imgError) { // Restrict the width of the thumbnail here, otherwise it will fill the container // which has the same width as the timeline - // mx_MImageBody_thumbnail resizes img to exactly container size + // mx_MImageBody_ resizes img to exactly container size img = {content.body}; } + if (this._isGif() && !SettingsStore.getValue("autoplayGifsAndVideos") && !this.state.hover) { + giflabel =

GIF

; + } + const thumbnail = (
{ /* Calculate aspect ratio, using %padding will size _container correctly */ }
- { showPlaceholder &&
{ img } + { giflabel }
{ this.state.hover && this.getTooltip() } From 5e9db3647ab25c1a31274c950b5e73648966660a Mon Sep 17 00:00:00 2001 From: Maxwell Kepler Date: Mon, 22 Oct 2018 21:03:39 +0100 Subject: [PATCH 04/85] Fixed minor typo in comment --- src/components/views/messages/MImageBody.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 69cff6691c..6cabd9bc76 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -293,7 +293,7 @@ export default class MImageBody extends React.Component { if (thumbUrl && !this.state.imgError) { // Restrict the width of the thumbnail here, otherwise it will fill the container // which has the same width as the timeline - // mx_MImageBody_ resizes img to exactly container size + // mx_MImageBody_thumbnail resizes img to exactly container size img = {content.body} Date: Wed, 24 Oct 2018 19:06:48 +0100 Subject: [PATCH 05/85] Changed letter case. --- res/css/views/messages/_MImageBody.scss | 2 +- src/components/views/messages/MImageBody.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 8752da117d..a5a1e66a3b 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -47,7 +47,7 @@ limitations under the License. transform: translate(-50%, -50%); } -.mx_MImageBody_GIFlabel { +.mx_MImageBody_gifLabel { position: absolute; display: block; top: 0px; diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index 6cabd9bc76..dc891b86ff 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -278,7 +278,7 @@ export default class MImageBody extends React.Component { let img = null; let placeholder = null; - let giflabel = null; + let gifLabel = null; // e2e image hasn't been decrypted yet if (content.file !== undefined && this.state.decryptedUrl === null) { @@ -304,7 +304,7 @@ export default class MImageBody extends React.Component { } if (this._isGif() && !SettingsStore.getValue("autoplayGifsAndVideos") && !this.state.hover) { - giflabel =

GIF

; + gifLabel =

GIF

; } const thumbnail = ( @@ -324,7 +324,7 @@ export default class MImageBody extends React.Component {
{ img } - { giflabel } + { gifLabel }
{ this.state.hover && this.getTooltip() } From 2707fcc575e8daec081584961bc27abac16b8f71 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 24 Oct 2018 18:17:10 +0000 Subject: [PATCH 06/85] Translated using Weblate (Hungarian) Currently translated at 100.0% (1272 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 05dc1d479c..ce1cb211f3 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1295,5 +1295,8 @@ "Please accept all of the policies": "Kérlek fogadd el a felhasználói feltételeket", "Please review and accept the policies of this homeserver:": "Kérlek nézd át és fogadd el a Matrix szerver felhasználói feltételeit:", "Add some now": "Adj hozzá párat", - "Joining room...": "Belépés a szobába.." + "Joining room...": "Belépés a szobába..", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Te vagy ennek a közösségnek az adminisztrátora. Egy másik adminisztrátortól kapott meghívó nélkül nem tudsz majd újra csatlakozni.", + "Open Devtools": "Fejlesztői eszközök megnyitása", + "Show developer tools": "Fejlesztői eszközök megjelenítése" } From 4e5ed99fec858c1fbe5d7f98fff111e956a8ec3d Mon Sep 17 00:00:00 2001 From: Jessica Wan Date: Thu, 25 Oct 2018 12:19:41 +0000 Subject: [PATCH 07/85] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.6% (1255 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 90c162e39b..e062663cad 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -155,7 +155,7 @@ "New password": "新密码", "Add a topic": "添加主题", "Admin": "管理员", - "Admin Tools": "管理工具", + "Admin Tools": "管理员工具", "VoIP": "IP 电话", "Missing Media Permissions, click here to request.": "没有媒体存储权限,点此获取。", "No Microphones detected": "未检测到麦克风", @@ -424,7 +424,7 @@ "Unable to capture screen": "无法录制屏幕", "Unable to enable Notifications": "无法启用通知", "Unable to load device list": "无法加载设备列表", - "Undecryptable": "无法解密的", + "Undecryptable": "无法解密", "Unencrypted room": "未加密的聊天室", "unencrypted": "未加密的", "Unencrypted message": "未加密消息", @@ -498,7 +498,7 @@ "Use with caution": "谨慎使用", "User Interface": "用户界面", "User name": "用户名", - "(no answer)": "(无响应)", + "(no answer)": "(无回复)", "(warning: cannot be disabled again!)": "(警告:无法再被禁用!)", "WARNING: Device already verified, but keys do NOT MATCH!": "警告:设备已验证,但密钥不匹配!", "Who can access this room?": "谁有权访问此聊天室?", @@ -807,7 +807,7 @@ "Re-request encryption keys from your other devices.": "从其他设备上 重新请求密钥。", "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "如果您是房间中最后一位有权限的用户,在您降低自己的权限等级后将无法撤回此修改,因为你将无法重新获得权限。", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "您将无法撤回此修改,因为您正在将此用户的滥权等级提升至与你相同。", - "No devices with registered encryption keys": "没有设备有已注册的加密密钥", + "No devices with registered encryption keys": "没有已注册加密密钥的设备", "Unmute": "取消静音", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s(滥权等级 %(powerLevelNumber)s)", "Hide Stickers": "隐藏贴图", @@ -817,15 +817,15 @@ "%(duration)sh": "%(duration)s 小时", "%(duration)sd": "%(duration)s 天", "Online for %(duration)s": "已上线 %(duration)s", - "Idle for %(duration)s": "已 idle %(duration)s", + "Idle for %(duration)s": "已闲置%(duration)s", "Offline for %(duration)s": "已离线 %(duration)s", - "Unknown for %(duration)s": "在线状态未知 %(duration)s", + "Unknown for %(duration)s": "未知状态 %(duration)s", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) 在 %(dateTime)s 看到这里", "Remove avatar": "移除头像", "Drop here to favourite": "拖动到这里以加入收藏", "Drop here to tag direct chat": "拖动到这里以加入私聊", "Drop here to restore": "拖动到这里以还原", - "Drop here to demote": "拖动到这里以加入低优先级", + "Drop here to demote": "拖动到这里以降低优先级", "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "无法确定此邀请发送给的邮件地址是否与您帐户所关联的邮件地址相匹配。", "You have been kicked from this room by %(userName)s.": "您已被 %(userName)s 从此聊天室中移除。", "'%(groupId)s' is not a valid community ID": "“%(groupId)s” 不是有效的社区 ID", @@ -885,7 +885,7 @@ "To change the room's avatar, you must be a": "无法修改此聊天室的头像,因为您不是此聊天室的", "To change the room's name, you must be a": "无法修改此聊天室的名称,因为您不是此聊天室的", "To change the room's main address, you must be a": "无法修改此聊天室的主地址,因为您不是此聊天室的", - "To change the room's history visibility, you must be a": "无法修改此聊天室的历史聊天记录可见性,因为您不是此聊天室的", + "To change the room's history visibility, you must be a": "无法更改本聊天室历史记录的可见性,您必须为", "To change the permissions in the room, you must be a": "无法修改此聊天室中的权限情况,因为您不是此聊天室的", "Showing flair for these communities:": "为这些社区显示 flair:", "This room is not showing flair for any communities": "此聊天室没有对任何社区显示 flair", @@ -1150,7 +1150,7 @@ "A call is currently being placed!": "已发起一次通话!", "Permission Required": "需要权限", "You do not have permission to start a conference call in this room": "您没有在此聊天室发起通话会议的权限", - "Show empty room list headings": "为空的聊天室列表显示 heading", + "Show empty room list headings": "为空的聊天室列表显示标题", "This event could not be displayed": "无法显示此事件", "Share Link to User": "分享链接给其他用户", "deleted": "删除线", From 694f04b6cb1f0aa2db70856cc151b58d99f3a51c Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Thu, 25 Oct 2018 07:34:39 +0000 Subject: [PATCH 08/85] Translated using Weblate (Polish) Currently translated at 92.7% (1180 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 977b94c718..148392117c 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1180,5 +1180,18 @@ "Show empty room list headings": "Pokaż nagłówki z pustym pokojem", "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "W zaszyfrowanych pokojach, takich jak ten, podgląd adresów URL jest domyślnie wyłączony, aby upewnić się, że serwer (w którym generowane są podglądy) nie może zbierać informacji o linkach widocznych w tym pokoju.", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Gdy ktoś umieści URL w wiadomości, można wyświetlić podgląd adresu URL, aby podać więcej informacji o tym łączu, takich jak tytuł, opis i obraz ze strony internetowej.", - "This event could not be displayed": "Ten event nie może zostać wyświetlony" + "This event could not be displayed": "Ten event nie może zostać wyświetlony", + "This room has been replaced and is no longer active.": "Ten pokój został zamieniony i nie jest już aktywny.", + "The conversation continues here.": "Konwersacja jest kontynuowana tutaj.", + "System Alerts": "Alerty systemowe", + "You don't currently have any stickerpacks enabled": "Nie masz obecnie włączonych żadnych pakietów naklejek", + "Stickerpack": "Pakiet naklejek", + "This room is a continuation of another conversation.": "Ten pokój jest kontynuacją innej rozmowy.", + "Click here to see older messages.": "Kliknij tutaj, aby zobaczyć starsze wiadomości.", + "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.": "Ten serwer osiągnął miesięczny limit aktywnych użytkowników, więc niektórzy użytkownicy nie będą mogli się zalogować.", + "This homeserver has exceeded one of its resource limits so some users will not be able to log in.": "Ten serwer przekroczył jeden z limitów, więc niektórzy użytkownicy nie będą mogli się zalogować.", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s dołączyli(-ły) %(count)s razy", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s dołączył(a) %(count)s razy", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s dołączył(a)", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s wyszli(-ły)" } From 4eb93633484665acfe66a8c909c2a5f5e3783f61 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Thu, 25 Oct 2018 15:33:28 +0000 Subject: [PATCH 09/85] Translated using Weblate (Basque) Currently translated at 100.0% (1272 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 5adbe476e7..0d25b988ad 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1292,5 +1292,9 @@ "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Rioten beste bertsioa oraindik beste fitxat batean irekita badago, itxi ezazu zerbitzari bera aldi berean karga alferra gaituta eta desgaituta erabiltzeak arazoak sor ditzakeelako.", "Incompatible local cache": "Katxe lokal bateraezina", "Clear cache and resync": "Garbitu katxea eta sinkronizatu berriro", - "Add some now": "Gehitu batzuk orain" + "Add some now": "Gehitu batzuk orain", + "Joining room...": "Gelara elkartzen...", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Komunitate honen administratzailea zara. Ezin izango duzu berriro elkartu ez bazaitu beste administratzaile batek gonbidatzen.", + "Open Devtools": "Ireki garapen tresnak", + "Show developer tools": "Erakutsi garapen tresnak" } From 2bdff52937af2b66447256754d2e57b69b31b423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 26 Oct 2018 06:57:09 +0000 Subject: [PATCH 10/85] Translated using Weblate (French) Currently translated at 100.0% (1272 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 125ac49b79..1a936270e6 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1294,5 +1294,9 @@ "Clear cache and resync": "Vider le cache et resynchroniser", "Please accept all of the policies": "Veuillez accepter toutes les politiques", "Please review and accept the policies of this homeserver:": "Veuillez lire et accepter les politiques de ce serveur d'accueil :", - "Add some now": "En ajouter maintenant" + "Add some now": "En ajouter maintenant", + "Joining room...": "Adhésion au salon…", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Vous êtes administrateur de cette communauté. Vous ne pourrez pas revenir sans une invitation d'un autre administrateur.", + "Open Devtools": "Ouvrir les outils développeur", + "Show developer tools": "Afficher les outils de développeur" } From ff1552c2f0b073e25cd6e1c9e44754b396c61acc Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Thu, 25 Oct 2018 21:21:39 +0000 Subject: [PATCH 11/85] Translated using Weblate (Polish) Currently translated at 93.3% (1188 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 148392117c..9c6f7fba5d 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1193,5 +1193,13 @@ "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s dołączyli(-ły) %(count)s razy", "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s dołączył(a) %(count)s razy", "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s dołączył(a)", - "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s wyszli(-ły)" + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s wyszli(-ły)", + "Internal room ID: ": "Wewnętrzny identyfikator pokoju ", + "were invited %(count)s times|one": "zostali(-ły) zaproszeni(-one)", + "Show developer tools": "Pokaż narzędzia deweloperskie", + "An email address is required to register on this homeserver.": "Adres e-mail jest wymagany do rejestracji na tym serwerze domowym.", + "A phone number is required to register on this homeserver.": "Numer telefonu jest wymagany do rejestracji na tym serwerze domowym.", + "Updating Riot": "Aktualizowanie Riot", + "Submit Debug Logs": "Wyślij dzienniki błędów", + "Please contact your service administrator to continue using this service.": "Proszę, skontaktuj się z administratorem aby korzystać dalej z funkcji." } From ac669e824b469906b24198f15004cb9ed427edd6 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Sun, 28 Oct 2018 19:58:21 +0000 Subject: [PATCH 12/85] Translated using Weblate (Polish) Currently translated at 93.4% (1189 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 9c6f7fba5d..3e5fb0a47e 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -548,8 +548,8 @@ "code": "kod", "quote": "cytat", "Create": "Utwórz", - "Online": "Dostępny", - "Offline": "Niedostępny", + "Online": "Dostępny(-a)", + "Offline": "Niedostępny(-a)", "Add an Integration": "Dodaj integrację", "Token incorrect": "Niepoprawny token", "To link to a room it must have an address.": "Aby móc stworzyć link do pokoju musi on mieć swój adres.", @@ -1201,5 +1201,6 @@ "A phone number is required to register on this homeserver.": "Numer telefonu jest wymagany do rejestracji na tym serwerze domowym.", "Updating Riot": "Aktualizowanie Riot", "Submit Debug Logs": "Wyślij dzienniki błędów", - "Please contact your service administrator to continue using this service.": "Proszę, skontaktuj się z administratorem aby korzystać dalej z funkcji." + "Please contact your service administrator to continue using this service.": "Proszę, skontaktuj się z administratorem aby korzystać dalej z funkcji.", + "Only room administrators will see this warning": "Tylko administratorzy pokojów widzą to ostrzeżenie" } From 8fc8c5e7807c821f5f96160a7866fd5d817f150f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=B0=AA=E0=B0=B5=E0=B0=BF?= Date: Sun, 28 Oct 2018 15:14:00 +0000 Subject: [PATCH 13/85] Translated using Weblate (Telugu) Currently translated at 22.7% (290 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/te/ --- src/i18n/strings/te.json | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/te.json b/src/i18n/strings/te.json index b6102a5eb5..9dc5221223 100644 --- a/src/i18n/strings/te.json +++ b/src/i18n/strings/te.json @@ -53,10 +53,10 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s గది పేరు తొలగించబడింది.", "Changes to who can read history will only apply to future messages in this room": "చరిత్ర చదివేవారికి మార్పులు ఈ గదిలో భవిష్య సందేశాలకు మాత్రమే వర్తిస్తాయి", "Changes your display nickname": "మీ ప్రదర్శన మారుపేరుని మారుస్తుంది", - "You cannot place a call with yourself.": "మీరు మీతో కాల్ చేయలేరు.", + "You cannot place a call with yourself.": "మీకు మీరే కాల్ చేయలేరు.", "You are already in a call.": "మీరు ఇప్పటికే కాల్లో ఉన్నారు.", "You are trying to access %(roomName)s.": "మీరు %(roomName)s లను యాక్సెస్ చేయడానికి ప్రయత్నిస్తున్నారు.", - "You cannot place VoIP calls in this browser.": "మీరు ఈ బ్రౌజర్లో VoIP కాల్లను ఉంచలేరు.", + "You cannot place VoIP calls in this browser.": "మీరు ఈ బ్రౌజర్లో కాల్లను చేయలేరు.", "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device": "మీరు అన్ని పరికరాల నుండి లాగ్ అవుట్ అయ్యారు మరియు ఇకపై పుష్ ఉండదు.\nప్రకటనలను నోటిఫికేషన్లను పునఃప్రారంభించడానికి, ప్రతి పరికరంలో మళ్లీ సైన్ ఇన్ చేయండి", "You have no visible notifications": "మీకు కనిపించే నోటిఫికేషన్లు లేవు", "You need to be able to invite users to do that.": "మీరు దీన్ని చేయడానికి వినియోగదారులను ఆహ్వానించగలరు.", @@ -275,5 +275,26 @@ "#example": "#ఉదాహరణ", "Collapse panel": "ప్యానెల్ కుదించు", "Checking for an update...": "నవీకరణ కోసం చూస్తోంది...", - "Saturday": "శనివారం" + "Saturday": "శనివారం", + "This email address is already in use": "ఈ ఇమెయిల్ అడ్రస్ ఇప్పటికే వాడుకం లో ఉంది", + "This phone number is already in use": "ఈ ఫోన్ నంబర్ ఇప్పటికే వాడుకం లో ఉంది", + "Failed to verify email address: make sure you clicked the link in the email": "ఇమెయిల్ అడ్రస్ ని నిరూపించలేక పోయాము. ఈమెయిల్ లో వచ్చిన లింక్ ని నొక్కారా", + "The platform you're on": "మీరు ఉన్న ప్లాట్ఫార్మ్", + "The version of Riot.im": "రయట్.ఐఎమ్ యొక్క వెర్సన్", + "Your homeserver's URL": "మీ హోమ్ సర్వర్ యొక్క URL", + "Your identity server's URL": "మీ ఐడెంటిటి సర్వర్ యొక్క URL", + "e.g. %(exampleValue)s": "ఉ.దా. %(exampleValue)s 1", + "Every page you use in the app": "ఆప్ లో మీరు వాడే ప్రతి పేజి", + "e.g. ": "ఉ.దా. ", + "Your User Agent": "మీ యీసర్ ఏజెంట్", + "Call Failed": "కాల్ విఫలమయింది", + "Review Devices": "పరికరాలని ఒక మారు చూసుకో", + "Call": "కాల్", + "Answer": "ఎత్తు", + "The remote side failed to pick up": "అటు వైపు ఎత్తలేకపోయారు", + "Unable to capture screen": "తెరని చూపలేకపోతున్నారు", + "Existing Call": "నజుస్తున్న కాల్", + "VoIP is unsupported": "కాల్ చేయుట ఈ పరికరం పోషించలేదు", + "A conference call could not be started because the intgrations server is not available": "ఇంటిగ్రేషన్ సర్వర్ లేనప్పుడు కాన్ఫరెన్స్ కాల్ మొదలుపెట్టలేరు", + "Call in Progress": "నడుస్తున్న కాల్" } From 8a0818018729bab18feb010c601f629ece6c86b9 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Wed, 31 Oct 2018 15:39:45 +0100 Subject: [PATCH 14/85] only run e2e tests on prs targeted on develop --- .travis-test-riot.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis-test-riot.sh b/.travis-test-riot.sh index 6cd073a1f8..88b3719b3a 100755 --- a/.travis-test-riot.sh +++ b/.travis-test-riot.sh @@ -27,7 +27,7 @@ npm run build npm run test popd -if [ "$TRAVIS_BRANCH" != "experimental" ] +if [ "$TRAVIS_BRANCH" = "develop" ] then # run end to end tests git clone https://github.com/matrix-org/matrix-react-end-to-end-tests.git --branch master From 873133458a16a8b51e950cfd0857879e19eba591 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 31 Oct 2018 13:06:57 -0600 Subject: [PATCH 15/85] Remove the request-only stuff we don't need anymore This was introduced in https://github.com/matrix-org/matrix-react-sdk/pull/2250 but can be pulled out due to https://github.com/matrix-org/matrix-js-sdk/pull/770. See https://github.com/vector-im/riot-web/issues/7634 for more information about the future. --- karma.conf.js | 13 ------------- package.json | 1 - 2 files changed, 14 deletions(-) diff --git a/karma.conf.js b/karma.conf.js index 41ddbdf249..4d699599cb 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -199,25 +199,12 @@ module.exports = function (config) { 'matrix-react-sdk': path.resolve('test/skinned-sdk.js'), 'sinon': 'sinon/pkg/sinon.js', - - // To make webpack happy - // Related: https://github.com/request/request/issues/1529 - // (there's no mock available for fs, so we fake a mock by using - // an in-memory version of fs) - "fs": "memfs", }, modules: [ path.resolve('./test'), "node_modules" ], }, - node: { - // Because webpack is made of fail - // https://github.com/request/request/issues/1529 - // Note: 'mock' is the new 'empty' - net: 'mock', - tls: 'mock' - }, devtool: 'inline-source-map', externals: { // Don't try to bundle electron: leave it as a commonjs dependency diff --git a/package.json b/package.json index b72080cd36..8a51c0877d 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "lodash": "^4.13.1", "lolex": "2.3.2", "matrix-js-sdk": "matrix-org/matrix-js-sdk#develop", - "memfs": "^2.10.1", "optimist": "^0.6.1", "pako": "^1.0.5", "prop-types": "^15.5.8", From c6854c0811c5ef5de698672f02aa1475f19317ec Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Thu, 1 Nov 2018 09:29:04 +0000 Subject: [PATCH 16/85] Translated using Weblate (Japanese) Currently translated at 29.9% (381 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 142 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 741de4b551..25e18cb11f 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -240,5 +240,145 @@ "Checking for an update...": "アップデートを確認しています…", "There are advanced notifications which are not shown here": "ここに表示されない詳細な通知があります", "Call": "通話", - "Answer": "応答" + "Answer": "応答", + "e.g. ": "凡例: ", + "Your device resolution": "デバイスの解像度", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "このページに部屋、ユーザー、グループIDなどの識別可能な情報が含まれている場合、そのデータはサーバーに送信される前に削除されます。", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "この部屋には未知の装置があります。確認せずに進むと、誰かがあなたの呼び出しを盗聴する可能性があります。", + "Answer Anyway": "とにかく応答", + "Call Anyway": "とにかく通話", + "Call Timeout": "通話タイムアウト", + "The remote side failed to pick up": "相手が応答しなかった", + "Unable to capture screen": "画面をキャプチャできません", + "Existing Call": "既存の通話", + "You are already in a call.": "すでに通話中です。", + "VoIP is unsupported": "VoIPはサポートされていません", + "You cannot place VoIP calls in this browser.": "このブラウザにはVoIP通話はできません。", + "You cannot place a call with yourself.": "自分で電話をかけることはできません。", + "Could not connect to the integration server": "統合サーバーに接続できません", + "A conference call could not be started because the intgrations server is not available": "統合サーバーが使用できないため、会議通話を開始できませんでした", + "Call in Progress": "発信中", + "A call is currently being placed!": "現在発信中です!", + "A call is already in progress!": "既に発信しています!", + "Permission Required": "権限必要", + "You do not have permission to start a conference call in this room": "この部屋で電話会議を開始する権限がありません", + "The file '%(fileName)s' failed to upload": "'%(fileName)s' ファイルのアップロードに失敗しました", + "The file '%(fileName)s' exceeds this home server's size limit for uploads": "'%(fileName)s' ファイルは、このホームサーバーのアップロードのサイズ制限を超えています", + "Upload Failed": "アップロードに失敗しました", + "Sun": "日", + "Mon": "月", + "Tue": "火", + "Wed": "水", + "Thu": "木", + "Fri": "金", + "Sat": "土", + "Jan": "1月", + "Feb": "2月", + "Mar": "3月", + "Apr": "4月", + "May": "5月", + "Jun": "6月", + "Jul": "7月", + "Aug": "8月", + "Sep": "9月", + "Oct": "10月", + "Nov": "11月", + "Dec": "12月", + "PM": "午後", + "AM": "午前", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(monthName)s %(day)s日 %(weekDayName)s曜日 %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s年 %(monthName)s %(day)s日 (%(weekDayName)s)", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(fullYear)s年 %(monthName)s %(day)s日 %(weekDayName)s曜日 %(time)s", + "Who would you like to add to this community?": "このコミュニティに誰を追加しますか?", + "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "警告:あなたがコミュニティに追加する人は誰でも、コミュニティIDを知っている人には公開されます", + "Invite new community members": "新しいコミュニティメンバーを招待する", + "Name or matrix ID": "名前または matrix ID", + "Invite to Community": "コミュニティに招待", + "Which rooms would you like to add to this community?": "このコミュニティに追加したい部屋はどれですか?", + "Show these rooms to non-members on the community page and room list?": "コミュニティページとルームリストのメンバー以外にこれらの部屋を公開しますか?", + "Add rooms to the community": "コミュニティに部屋を追加します", + "Room name or alias": "部屋名またはエイリアス", + "Add to community": "コミュニティに追加", + "Failed to invite the following users to %(groupId)s:": "次のユーザーを %(groupId)s に招待できませんでした:", + "Failed to invite users to community": "ユーザーをコミュニティに招待できませんでした", + "Failed to invite users to %(groupId)s": "ユーザーを %(groupId)s に招待できませんでした", + "Failed to add the following rooms to %(groupId)s:": "次の部屋を %(groupId)s に追加できませんでした:", + "Riot does not have permission to send you notifications - please check your browser settings": "Riotに通知を送信する権限がありません - ブラウザの設定を確認してください", + "Riot was not given permission to send notifications - please try again": "Riotに通知を送信する権限がありませんでした。もう一度お試しください", + "Unable to enable Notifications": "通知を有効にできません", + "This email address was not found": "このメールアドレスが見つかりませんでした", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "あなたのメールアドレスは、このホームサーバー上のマトリックスIDと関連付けられていないようです。", + "Registration Required": "登録が必要です", + "You need to register to do this. Would you like to register now?": "これを行うには登録する必要があります。 今すぐ登録しますか?", + "Default": "既定値", + "Restricted": "制限", + "Moderator": "仲裁者", + "Admin": "管理者", + "Start a chat": "チャットを開始する", + "Who would you like to communicate with?": "誰と通信しますか?", + "Email, name or matrix ID": "メールアドレス、名前、またはマトリックスID", + "Invite new room members": "新しい部屋のメンバーを招待します", + "Who would you like to add to this room?": "誰をこの部屋に追加しますか?", + "Send Invites": "招待状を送る", + "Failed to invite user": "ユーザーを招待できませんでした", + "Failed to invite": "招待できませんでした", + "Failed to invite the following users to the %(roomName)s room:": "次のユーザーを %(roomName)s の部屋に招待できませんでした:", + "You need to be logged in.": "ログインする必要があります。", + "You need to be able to invite users to do that.": "それをするためにユーザーを招待できる必要があります。", + "Unable to create widget.": "ウィジェットを作成できません。", + "Missing roomId.": "roomIdがありません。", + "Failed to send request.": "リクエストの送信に失敗しました。", + "This room is not recognised.": "この部屋は認識されません。", + "Power level must be positive integer.": "権限レベルは正の整数でなければなりません。", + "You are not in this room.": "この部屋のメンバーではありません。", + "You do not have permission to do that in this room.": "あなたはこの部屋でそれを行う許可を持っていません。", + "Missing room_id in request": "リクエストにroom_idがありません", + "Room %(roomId)s not visible": "部屋 %(roomId)s は見えません", + "Missing user_id in request": "リクエストにuser_idがありません", + "Usage": "用法", + "Searches DuckDuckGo for results": "DuckDuckGoを検索します", + "/ddg is not a command": "/ddg はコマンドではありません", + "To use it, just wait for autocomplete results to load and tab through them.": "それを使用するには、結果が完全にロードされるのを待ってから、Tabキーを押してください。", + "Changes your display nickname": "表示されるニックネームを変更", + "Changes colour scheme of current room": "現在の部屋のスキームを変更する", + "Sets the room topic": "部屋のトピックを設定", + "Invites user with given id to current room": "指定されたIDを持つユーザーを現在のルームに招待する", + "Joins room with given alias": "指定された別名で部屋に参加する", + "Leave room": "部屋を出る", + "Unrecognised room alias:": "認識されない部屋の別名:", + "Kicks user with given id": "与えられたIDを持つユーザーを追い出す", + "Bans user with given id": "指定されたIDでユーザーを禁止する", + "Unbans user with given id": "指定されたIDでユーザーのブロックを解除する", + "Ignores a user, hiding their messages from you": "ユーザーを無視し、自分からのメッセージを隠す", + "Ignored user": "無視されたユーザー", + "You are now ignoring %(userId)s": "%(userId)s を無視しています", + "Stops ignoring a user, showing their messages going forward": "ユーザー無視を止めてメッセージを表示する", + "Unignored user": "無記名ユーザー", + "You are no longer ignoring %(userId)s": "あなたはもはや %(userId)s を無視していません", + "Define the power level of a user": "ユーザーの権限レベルを定義", + "Deops user with given id": "指定されたIDのユーザーを非表示", + "Opens the Developer Tools dialog": "開発者ツールダイアログを開きます", + "Verifies a user, device, and pubkey tuple": "ユーザー、デバイス、および公開鍵タプルを検証します", + "Unknown (user, device) pair:": "不明な(ユーザー、デバイス) ペア:", + "Device already verified!": "デバイスはすでに確認済みです!", + "WARNING: Device already verified, but keys do NOT MATCH!": "警告:デバイスはすでに検証済みですが、キーは一致しません!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告: キー確認が失敗しました! %(userId)s とデバイス %(deviceId)s の署名鍵は、提供された鍵 \"%(fingerprint)s\" と一致しない \"%(fprint)s\" です。 通信が傍受されている可能性があります!", + "Verified key": "確認済みのキー", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "指定した署名鍵は、%(userId)s のデバイス%(deviceId)s から受け取った署名鍵と一致します。デバイスを検証済みとしてマークしました。", + "Displays action": "アクションを表示", + "Forces the current outbound group session in an encrypted room to be discarded": "暗号化されたルーム内の現在のアウトバウンドグループセッションを強制的に破棄します", + "Unrecognised command:": "認識できないコマンド:", + "Reason": "理由", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s は %(displayName)s の招待を受け入れました。", + "%(targetName)s accepted an invitation.": "%(targetName)s は招待を受け入れました。", + "%(senderName)s requested a VoIP conference.": "%(senderName)s はVoIP会議を要求しました。", + "%(senderName)s invited %(targetName)s.": "%(senderName)s は %(targetName)s を招待しました。", + "%(senderName)s banned %(targetName)s.": "%(senderName)s は %(targetName)s を追放しました。", + "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s は、表示名を %(displayName)s に変更しました。", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s は、表示名を %(displayName)s に設定します。", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s は表示名 (%(oldDisplayName)s) を削除しました。", + "%(senderName)s removed their profile picture.": "%(senderName)s はプロフィール画像を削除しました。", + "%(senderName)s changed their profile picture.": "%(senderName)s はプロフィール画像を変更しました。", + "%(senderName)s set a profile picture.": "%(senderName)s はプロフィール画像を設定しました。" } From 4fbfc7cb4dfd0f0953e45d1c9d561a681cb2385e Mon Sep 17 00:00:00 2001 From: Moo Date: Wed, 31 Oct 2018 20:27:32 +0000 Subject: [PATCH 17/85] Translated using Weblate (Lithuanian) Currently translated at 69.3% (882 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 776445e40d..1f8963babb 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -872,5 +872,16 @@ "You have no historical rooms": "Jūs neturite istorinių kambarių", "Historical": "Istoriniai", "Every page you use in the app": "Kiekvienas puslapis, kurį naudoji programoje", - "Call Timeout": "Skambučio laikas baigėsi" + "Call Timeout": "Skambučio laikas baigėsi", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s kaip šio kambario adresus pridėjo %(addedAddresses)s.", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s kaip šio kambario adresą pridėjo %(addedAddresses)s.", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s kaip šio kambario adresus pašalino %(removedAddresses)s.", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s kaip šio kambario adresą pašalino %(removedAddresses)s.", + "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s kaip šio kambario adresus pridėjo %(addedAddresses)s ir pašalino %(removedAddresses)s.", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s nustatė pagrindinį šio kambario adresą į %(address)s.", + "%(senderName)s removed the main address for this room.": "%(senderName)s pašalino pagrindinį šio kambario adresą.", + "Disinvite": "Atšaukti pakvietimą", + "Disinvite this user?": "Atšaukti pakvietimą šiam naudotojui?", + "Unknown for %(duration)s": "Nežinoma jau %(duration)s", + "(warning: cannot be disabled again!)": "(įspėjimas: nebeįmanoma bus išjungti!)" } From 2589ce6a775c11d32c3c9bb5c80c25b91261299a Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 31 Oct 2018 17:50:05 +0000 Subject: [PATCH 18/85] Translated using Weblate (Polish) Currently translated at 93.8% (1194 of 1272 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 3e5fb0a47e..53bbfcd496 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1202,5 +1202,10 @@ "Updating Riot": "Aktualizowanie Riot", "Submit Debug Logs": "Wyślij dzienniki błędów", "Please contact your service administrator to continue using this service.": "Proszę, skontaktuj się z administratorem aby korzystać dalej z funkcji.", - "Only room administrators will see this warning": "Tylko administratorzy pokojów widzą to ostrzeżenie" + "Only room administrators will see this warning": "Tylko administratorzy pokojów widzą to ostrzeżenie", + "Open Devtools": "Otwórz narzędzia deweloperskie", + "Clear cache and resync": "Wyczyść pamięć podręczną i zsynchronizuj ponownie", + "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riot używa teraz 3-5x mniej pamięci, ładując informacje o innych użytkownikach tylko wtedy, gdy jest to konieczne. Poczekaj, aż ponownie zsynchronizujemy się z serwerem!", + "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Jeśli inna wersja Riot jest nadal otwarta w innej zakładce, proszę zamknij ją, ponieważ używanie Riot na tym samym komputerze z włączonym i wyłączonym jednocześnie leniwym ładowaniem będzie powodować problemy.", + "And %(count)s more...|other": "I %(count)s więcej…" } From 5558b7a3b2b8d8beec94cd901712e3f778cfa6e6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 14:43:15 -0600 Subject: [PATCH 19/85] Avoid hitting the SettingsStore thousands of times when generating room lists Should fix https://github.com/vector-im/riot-web/issues/7646 to some degree --- src/stores/RoomListStore.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 8909dbb489..527fc0fe2e 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -217,11 +217,16 @@ class RoomListStore extends Store { } }); + // Note: we check the settings up here instead of in the forEach or + // in the _recentsComparator to avoid hitting the SettingsStore a few + // thousand times. + const pinUnread = SettingsStore.getValue("pinUnreadRooms"); + const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); Object.keys(lists).forEach((listKey) => { let comparator; switch (RoomListStore._listOrders[listKey]) { case "recent": - comparator = this._recentsComparator; + comparator = (roomA, roomB) => this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); break; case "manual": default: @@ -262,10 +267,7 @@ class RoomListStore extends Store { } } - _recentsComparator(roomA, roomB) { - const pinUnread = SettingsStore.getValue("pinUnreadRooms"); - const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); - + _recentsComparator(roomA, roomB, pinUnread, pinMentioned) { // We try and set the ordering to be Mentioned > Unread > Recent // assuming the user has the right settings, of course From 272acfa2f55b89f87658da91a503a2023ef83958 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 14:46:39 -0600 Subject: [PATCH 20/85] Appease the linter --- src/stores/RoomListStore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 527fc0fe2e..65148ec8c4 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -226,7 +226,9 @@ class RoomListStore extends Store { let comparator; switch (RoomListStore._listOrders[listKey]) { case "recent": - comparator = (roomA, roomB) => this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); + comparator = (roomA, roomB) => { + return this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); + }; break; case "manual": default: From 0c7aadb92b0d3b7042ff8658c33df5b0b697cefe Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 16:28:13 -0600 Subject: [PATCH 21/85] Improve room list sort performance by caching common variables This won't help much if the user is in a ton of highly active rooms, but for the most part this will help those in thousands of rooms, many of which are likely to be quiet. Fixes https://github.com/vector-im/riot-web/issues/7646 Fixes https://github.com/vector-im/riot-web/issues/7645 (due to timestamp ordering) --- src/stores/RoomListStore.js | 135 ++++++++++++++++++++++++++++++++---- 1 file changed, 120 insertions(+), 15 deletions(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 65148ec8c4..e77debd2f2 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -54,6 +54,7 @@ class RoomListStore extends Store { "im.vector.fake.archived": [], }, ready: false, + roomCache: {}, // roomId => { cacheType => value } }; } @@ -85,6 +86,8 @@ class RoomListStore extends Store { !payload.isLiveUnfilteredRoomTimelineEvent || !this._eventTriggersRecentReorder(payload.event) ) break; + + this._clearCachedRoomState(payload.event.getRoomId()); this._generateRoomLists(); } break; @@ -112,6 +115,8 @@ class RoomListStore extends Store { if (liveTimeline !== eventTimeline || !this._eventTriggersRecentReorder(payload.event) ) break; + + this._clearCachedRoomState(payload.event.getRoomId()); this._generateRoomLists(); } break; @@ -222,12 +227,20 @@ class RoomListStore extends Store { // thousand times. const pinUnread = SettingsStore.getValue("pinUnreadRooms"); const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); + this._timings = {}; Object.keys(lists).forEach((listKey) => { let comparator; switch (RoomListStore._listOrders[listKey]) { case "recent": comparator = (roomA, roomB) => { - return this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); + this._timings["overall_" + roomA.roomId + "_" + roomB.roomId] = { + type: "overall", + start: performance.now(), + end: 0, + }; + const ret = this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); + this._timings["overall_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); + return ret; }; break; case "manual": @@ -238,12 +251,76 @@ class RoomListStore extends Store { lists[listKey].sort(comparator); }); + // Combine the samples for performance metrics + const samplesByType = {}; + for (const sampleName of Object.keys(this._timings)) { + const sample = this._timings[sampleName]; + if (!samplesByType[sample.type]) samplesByType[sample.type] = { + min: 999999999, + max: 0, + count: 0, + total: 0, + }; + + const record = samplesByType[sample.type]; + const duration = sample.end - sample.start; + if (duration < record.min) record.min = duration; + if (duration > record.max) record.max = duration; + record.count++; + record.total += duration; + } + + for (const category of Object.keys(samplesByType)) { + const {min, max, count, total} = samplesByType[category]; + const average = total / count; + + console.log(`RoomListSortPerf : type=${category} min=${min} max=${max} total=${total} samples=${count} average=${average}`); + } + this._setState({ lists, ready: true, // Ready to receive updates via Room.tags events }); } + _updateCachedRoomState(roomId, type, value) { + const roomCache = this._state.roomCache; + if (!roomCache[roomId]) roomCache[roomId] = {}; + + if (value) roomCache[roomId][type] = value; + else delete roomCache[roomId][type]; + + this._setState({roomCache}); + } + + _clearCachedRoomState(roomId) { + const roomCache = this._state.roomCache; + delete roomCache[roomId]; + this._setState({roomCache}); + } + + _getRoomState(room, type) { + const roomId = room.roomId; + const roomCache = this._state.roomCache; + if (roomCache[roomId] && typeof roomCache[roomId][type] !== 'undefined') { + return roomCache[roomId][type]; + } + + if (type === "timestamp") { + const ts = this._tsOfNewestEvent(room); + this._updateCachedRoomState(roomId, "timestamp", ts); + return ts; + } else if (type === "unread") { + const unread = room.getUnreadNotificationCount() > 0; + this._updateCachedRoomState(roomId, "unread", unread); + return unread; + } else if (type === "notifications") { + const notifs = room.getUnreadNotificationCount("highlight") > 0; + this._updateCachedRoomState(roomId, "notifications", notifs); + return notifs; + } else throw new Error("Unrecognized room cache type: " + type); + } + _eventTriggersRecentReorder(ev) { return ev.getTs() && ( Unread.eventTriggersUnreadCount(ev) || @@ -270,30 +347,58 @@ class RoomListStore extends Store { } _recentsComparator(roomA, roomB, pinUnread, pinMentioned) { + //console.log("Comparing " + roomA.roomId + " with " + roomB.roomId +" || pinUnread=" + pinUnread +" pinMentioned="+pinMentioned); // We try and set the ordering to be Mentioned > Unread > Recent - // assuming the user has the right settings, of course + // assuming the user has the right settings, of course. + + this._timings["timestamp_" + roomA.roomId + "_" + roomB.roomId] = { + type: "timestamp", + start: performance.now(), + end: 0, + }; + const timestampA = this._getRoomState(roomA, "timestamp"); + const timestampB = this._getRoomState(roomB, "timestamp"); + const timestampDiff = timestampB - timestampA; + this._timings["timestamp_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); if (pinMentioned) { - const mentionsA = roomA.getUnreadNotificationCount("highlight") > 0; - const mentionsB = roomB.getUnreadNotificationCount("highlight") > 0; - if (mentionsA && !mentionsB) return -1; - if (!mentionsA && mentionsB) return 1; - if (mentionsA && mentionsB) return 0; - // If neither have mentions, fall through to remaining checks + this._timings["mentioned_" + roomA.roomId + "_" + roomB.roomId] = { + type: "mentioned", + start: performance.now(), + end: 0, + }; + const mentionsA = this._getRoomState(roomA, "notifications"); + const mentionsB = this._getRoomState(roomB, "notifications"); + this._timings["mentioned_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); + if (mentionsA && !mentionsB) return -1; + if (!mentionsA && mentionsB) return 1; + + // If they both have notifications, sort by timestamp. + // If neither have notifications (the fourth check not shown + // here), then try and sort by unread messages and finally by + // timestamp. + if (mentionsA && mentionsB) return timestampDiff; } if (pinUnread) { - const unreadA = Unread.doesRoomHaveUnreadMessages(roomA); - const unreadB = Unread.doesRoomHaveUnreadMessages(roomB); + this._timings["unread_" + roomA.roomId + "_" + roomB.roomId] = { + type: "unread", + start: performance.now(), + end: 0, + }; + const unreadA = this._getRoomState(roomA, "unread"); + const unreadB = this._getRoomState(roomB, "notifications"); + this._timings["unread_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); if (unreadA && !unreadB) return -1; if (!unreadA && unreadB) return 1; - if (unreadA && unreadB) return 0; - // If neither have unread messages, fall through to remaining checks + + // If they both have unread messages, sort by timestamp + // If nether have unread message (the fourth check not shown + // here), then just sort by timestamp anyways. + if (unreadA && unreadB) return timestampDiff; } - // XXX: We could use a cache here and update it when we see new - // events that trigger a reorder - return this._tsOfNewestEvent(roomB) - this._tsOfNewestEvent(roomA); + return timestampDiff; } _lexicographicalComparator(roomA, roomB) { From 122868e32f3c27b1565c1044b3c325b96c5a0b54 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 16:30:48 -0600 Subject: [PATCH 22/85] Removing timing/performance tracking on room list store This was used to verify the fix was actually making improvements and can be safely taken out. --- src/stores/RoomListStore.js | 55 +------------------------------------ 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index e77debd2f2..8dc557ace0 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -227,20 +227,12 @@ class RoomListStore extends Store { // thousand times. const pinUnread = SettingsStore.getValue("pinUnreadRooms"); const pinMentioned = SettingsStore.getValue("pinMentionedRooms"); - this._timings = {}; Object.keys(lists).forEach((listKey) => { let comparator; switch (RoomListStore._listOrders[listKey]) { case "recent": comparator = (roomA, roomB) => { - this._timings["overall_" + roomA.roomId + "_" + roomB.roomId] = { - type: "overall", - start: performance.now(), - end: 0, - }; - const ret = this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); - this._timings["overall_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); - return ret; + return this._recentsComparator(roomA, roomB, pinUnread, pinMentioned); }; break; case "manual": @@ -251,32 +243,6 @@ class RoomListStore extends Store { lists[listKey].sort(comparator); }); - // Combine the samples for performance metrics - const samplesByType = {}; - for (const sampleName of Object.keys(this._timings)) { - const sample = this._timings[sampleName]; - if (!samplesByType[sample.type]) samplesByType[sample.type] = { - min: 999999999, - max: 0, - count: 0, - total: 0, - }; - - const record = samplesByType[sample.type]; - const duration = sample.end - sample.start; - if (duration < record.min) record.min = duration; - if (duration > record.max) record.max = duration; - record.count++; - record.total += duration; - } - - for (const category of Object.keys(samplesByType)) { - const {min, max, count, total} = samplesByType[category]; - const average = total / count; - - console.log(`RoomListSortPerf : type=${category} min=${min} max=${max} total=${total} samples=${count} average=${average}`); - } - this._setState({ lists, ready: true, // Ready to receive updates via Room.tags events @@ -347,29 +313,16 @@ class RoomListStore extends Store { } _recentsComparator(roomA, roomB, pinUnread, pinMentioned) { - //console.log("Comparing " + roomA.roomId + " with " + roomB.roomId +" || pinUnread=" + pinUnread +" pinMentioned="+pinMentioned); // We try and set the ordering to be Mentioned > Unread > Recent // assuming the user has the right settings, of course. - this._timings["timestamp_" + roomA.roomId + "_" + roomB.roomId] = { - type: "timestamp", - start: performance.now(), - end: 0, - }; const timestampA = this._getRoomState(roomA, "timestamp"); const timestampB = this._getRoomState(roomB, "timestamp"); const timestampDiff = timestampB - timestampA; - this._timings["timestamp_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); if (pinMentioned) { - this._timings["mentioned_" + roomA.roomId + "_" + roomB.roomId] = { - type: "mentioned", - start: performance.now(), - end: 0, - }; const mentionsA = this._getRoomState(roomA, "notifications"); const mentionsB = this._getRoomState(roomB, "notifications"); - this._timings["mentioned_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); if (mentionsA && !mentionsB) return -1; if (!mentionsA && mentionsB) return 1; @@ -381,14 +334,8 @@ class RoomListStore extends Store { } if (pinUnread) { - this._timings["unread_" + roomA.roomId + "_" + roomB.roomId] = { - type: "unread", - start: performance.now(), - end: 0, - }; const unreadA = this._getRoomState(roomA, "unread"); const unreadB = this._getRoomState(roomB, "notifications"); - this._timings["unread_" + roomA.roomId + "_" + roomB.roomId].end = performance.now(); if (unreadA && !unreadB) return -1; if (!unreadA && unreadB) return 1; From a713cc5c52309f74d1dfccef28556de037eb3db1 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 17:07:05 -0600 Subject: [PATCH 23/85] Compare the right types of events --- src/stores/RoomListStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 8dc557ace0..f7596774b6 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -335,7 +335,7 @@ class RoomListStore extends Store { if (pinUnread) { const unreadA = this._getRoomState(roomA, "unread"); - const unreadB = this._getRoomState(roomB, "notifications"); + const unreadB = this._getRoomState(roomB, "unread"); if (unreadA && !unreadB) return -1; if (!unreadA && unreadB) return 1; From 3960ae2fcd956702c5adc4f0929438acdea53388 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 1 Nov 2018 17:17:01 -0600 Subject: [PATCH 24/85] Add more commentary around how the roomCache works --- src/stores/RoomListStore.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index f7596774b6..2b70d53b59 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -54,7 +54,24 @@ class RoomListStore extends Store { "im.vector.fake.archived": [], }, ready: false, - roomCache: {}, // roomId => { cacheType => value } + + // The room cache stores a mapping of roomId to cache record. + // Each cache record is a key/value pair for various bits of + // data used to sort the room list. Currently this stores the + // following bits of informations: + // "timestamp": number, The timestamp of the last relevant + // event in the room. + // "notifications": boolean, Whether or not the user has been + // highlighted on any unread events. + // "unread": boolean, Whether or not the user has any + // unread events. + // + // All of the cached values are lazily loaded on read in the + // recents comparator. When an event is received for a particular + // room, all the cached values are invalidated - forcing the + // next read to set new values. The entries do not expire on + // their own. + roomCache: {}, }; } From 6c908a3e08eed07c71f9bac66102ec20a631ac0a Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Fri, 2 Nov 2018 00:20:32 +0000 Subject: [PATCH 25/85] Translated using Weblate (Japanese) Currently translated at 34.3% (437 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 58 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 25e18cb11f..95fe39d76c 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -380,5 +380,61 @@ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s は表示名 (%(oldDisplayName)s) を削除しました。", "%(senderName)s removed their profile picture.": "%(senderName)s はプロフィール画像を削除しました。", "%(senderName)s changed their profile picture.": "%(senderName)s はプロフィール画像を変更しました。", - "%(senderName)s set a profile picture.": "%(senderName)s はプロフィール画像を設定しました。" + "%(senderName)s set a profile picture.": "%(senderName)s はプロフィール画像を設定しました。", + "VoIP conference started.": "VoIP会議が開始されました。", + "VoIP conference finished.": "VoIP会議が終了しました。", + "%(targetName)s rejected the invitation.": "%(targetName)s は招待を拒否しました。", + "%(targetName)s left the room.": "%(targetName)s は部屋を出ました。", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s は %(targetName)s のブロックを解除しました。", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s は %(targetName)s を追放しました。", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s は %(targetName)s の招待を撤回しました。", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s はトピックを \"%(topic)s\" に変更しました。", + "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s はルーム名を削除しました。", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s はルーム名を %(roomName)s に変更しました。", + "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s はイメージを送信しました。", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", + "%(senderName)s added %(count)s %(addedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加しました。", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", + "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", + "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加し、%(removedAddresses)s を削除しました。", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s は、この部屋のメインアドレスを %(address)s に設定しました。", + "%(senderName)s removed the main address for this room.": "%(senderName)s はこの部屋のメインアドレスを削除しました。", + "Someone": "誰か", + "(not supported by this browser)": "(このブラウザではサポートされていません)", + "%(senderName)s answered the call.": "%(senderName)s が応答しました。", + "(could not connect media)": "(メディアを接続できませんでした)", + "(no answer)": "(応答なし)", + "(unknown failure: %(reason)s)": "(不明なエラー: %(reason)s)", + "%(senderName)s ended the call.": "%(senderName)s は通話を終了しました。", + "%(senderName)s placed a %(callType)s call.": "%(senderName)s は %(callType)s 電話をかけました。", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s は部屋に加わるよう %(targetDisplayName)s に招待状を送りました。", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s は、すべてのルームメンバーに招待された時点からの部屋履歴を参照できるようにしました。", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s は、すべての部屋のメンバーに参加した時点からの部屋履歴を参照できるようにしました。", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s は、すべての部屋メンバーに部屋履歴を参照できるようにしました。", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s は、部屋履歴を誰でも参照できるようにしました。", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s は 見知らぬ (%(visibility)s) に部屋履歴を参照できるようにしました。", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s はエンドツーエンドの暗号化をオンにしました (アルゴリズム %(algorithm)s)。", + "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s は %(fromPowerLevel)s から %(toPowerLevel)s", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s は %(powerLevelDiffText)s の権限レベルを変更しました。", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s は、その部屋の固定メッセージを変更しました。", + "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s ウィジェットは %(senderName)s によって変更されました", + "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s ウィジェットが %(senderName)s によって追加されました", + "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s ウィジェットが %(senderName)s によって削除されました", + "%(names)s and %(count)s others are typing|other": "%(names)s と 他 %(count)s 人が入力中です", + "%(names)s and %(count)s others are typing|one": "%(names)s ともう1人が入力中です", + "%(names)s and %(lastPerson)s are typing": "%(names)s と %(lastPerson)s が入力しています", + "Failure to create room": "部屋の作成に失敗しました", + "Server may be unavailable, overloaded, or you hit a bug.": "サーバーが使用できない、オーバーロードされている、またはバグが発生した可能性があります。", + "Send anyway": "とにかく送る", + "Unnamed Room": "名前のない部屋", + "This homeserver has hit its Monthly Active User limit.": "このホームサーバーは、月間アクティブユーザー制限を超えています。", + "This homeserver has exceeded one of its resource limits.": "このホームサーバーは、リソース制限の1つを超えています。", + "Please contact your service administrator to continue using the service.": "サービスを引き続き使用するには、サービス管理者にお問い合わせください。", + "Unable to connect to Homeserver. Retrying...": "ホームサーバーに接続できません。 再試行中...", + "Your browser does not support the required cryptography extensions": "お使いのブラウザは、必要な暗号化拡張機能をサポートしていません", + "Not a valid Riot keyfile": "有効なRiotキーファイルではありません", + "Authentication check failed: incorrect password?": "認証チェックに失敗しました: パスワードの間違い?", + "Sorry, your homeserver is too old to participate in this room.": "申し訳ありませんが、あなたのホームサーバーはこの部屋に参加するには古すぎます。", + "Please contact your homeserver administrator.": "ホームサーバー管理者に連絡してください。", + "Failed to join room": "部屋に参加できませんでした" } From f7bc27413dd3574a079bed84366acc8d485cd822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Fri, 2 Nov 2018 09:00:00 +0000 Subject: [PATCH 26/85] Translated using Weblate (French) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 1a936270e6..9958e51d16 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1298,5 +1298,7 @@ "Joining room...": "Adhésion au salon…", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Vous êtes administrateur de cette communauté. Vous ne pourrez pas revenir sans une invitation d'un autre administrateur.", "Open Devtools": "Ouvrir les outils développeur", - "Show developer tools": "Afficher les outils de développeur" + "Show developer tools": "Afficher les outils de développeur", + "Pin unread rooms to the top of the room list": "Épingler les salons non lus en haut de la liste des salons", + "Pin rooms I'm mentioned in to the top of the room list": "Épingler les salons où l'on me mentionne en haut de la liste des salons" } From 1ba96b97ea96d5a6340aeb5d8e5e00faf7b0fe6e Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 2 Nov 2018 12:06:16 +0000 Subject: [PATCH 27/85] Translated using Weblate (Hungarian) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index ce1cb211f3..b777817c0a 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1298,5 +1298,7 @@ "Joining room...": "Belépés a szobába..", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Te vagy ennek a közösségnek az adminisztrátora. Egy másik adminisztrátortól kapott meghívó nélkül nem tudsz majd újra csatlakozni.", "Open Devtools": "Fejlesztői eszközök megnyitása", - "Show developer tools": "Fejlesztői eszközök megjelenítése" + "Show developer tools": "Fejlesztői eszközök megjelenítése", + "Pin unread rooms to the top of the room list": "Nem olvasott üzeneteket tartalmazó szobák a szobalista elejére", + "Pin rooms I'm mentioned in to the top of the room list": "Megemlítéseket tartalmazó szobák a szobalista elejére" } From ade9c7002a3e149fe57e19d4e6c2552e961cc608 Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Fri, 2 Nov 2018 09:16:31 +0000 Subject: [PATCH 28/85] Translated using Weblate (Japanese) Currently translated at 57.4% (732 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 326 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 311 insertions(+), 15 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 95fe39d76c..e188d821ad 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -14,7 +14,7 @@ "Encryption is enabled in this room": "この部屋の発言は暗号化されています", "Favourite": "お気に入り", "Favourites": "お気に入り", - "Hide read receipts": "発言を読んでも既読状態にしない", + "Hide read receipts": "既読を表示しない", "Invited": "招待中", "%(displayName)s is typing": "%(displayName)s 文字入力中", "%(targetName)s joined the room.": "%(targetName)s 部屋に参加しました。", @@ -125,7 +125,7 @@ "Leave": "退室", "Enable notifications for this account": "このアカウントで通知を行う", "Failed to update keywords": "キーワードの更新に失敗しました", - "Enable email notifications": "電子メールでの通知を行う", + "Enable email notifications": "電子メール通知を有効にする", "Directory": "部屋一覧", "Download this file": "この添付ファイルをダウンロード", "Failed to get public room list": "公開部屋一覧の取得に失敗しました", @@ -242,9 +242,9 @@ "Call": "通話", "Answer": "応答", "e.g. ": "凡例: ", - "Your device resolution": "デバイスの解像度", + "Your device resolution": "端末の解像度", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "このページに部屋、ユーザー、グループIDなどの識別可能な情報が含まれている場合、そのデータはサーバーに送信される前に削除されます。", - "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "この部屋には未知の装置があります。確認せずに進むと、誰かがあなたの呼び出しを盗聴する可能性があります。", + "There are unknown devices in this room: if you proceed without verifying them, it will be possible for someone to eavesdrop on your call.": "この部屋には未知の端末があります。確認せずに進むと、誰かがあなたの呼び出しを盗聴する可能性があります。", "Answer Anyway": "とにかく応答", "Call Anyway": "とにかく通話", "Call Timeout": "通話タイムアウト", @@ -359,13 +359,13 @@ "Define the power level of a user": "ユーザーの権限レベルを定義", "Deops user with given id": "指定されたIDのユーザーを非表示", "Opens the Developer Tools dialog": "開発者ツールダイアログを開きます", - "Verifies a user, device, and pubkey tuple": "ユーザー、デバイス、および公開鍵タプルを検証します", - "Unknown (user, device) pair:": "不明な(ユーザー、デバイス) ペア:", - "Device already verified!": "デバイスはすでに確認済みです!", - "WARNING: Device already verified, but keys do NOT MATCH!": "警告:デバイスはすでに検証済みですが、キーは一致しません!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告: キー確認が失敗しました! %(userId)s とデバイス %(deviceId)s の署名鍵は、提供された鍵 \"%(fingerprint)s\" と一致しない \"%(fprint)s\" です。 通信が傍受されている可能性があります!", + "Verifies a user, device, and pubkey tuple": "ユーザー、端末、および公開鍵タプルを検証します", + "Unknown (user, device) pair:": "不明な(ユーザー、端末) ペア:", + "Device already verified!": "端末はすでに確認済みです!", + "WARNING: Device already verified, but keys do NOT MATCH!": "警告:端末はすでに検証済みですが、キーは一致しません!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and device %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "警告: キー確認が失敗しました! %(userId)s と端末 %(deviceId)s の署名鍵は、提供された鍵 \"%(fingerprint)s\" と一致しない \"%(fprint)s\" です。 通信が傍受されている可能性があります!", "Verified key": "確認済みのキー", - "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "指定した署名鍵は、%(userId)s のデバイス%(deviceId)s から受け取った署名鍵と一致します。デバイスを検証済みとしてマークしました。", + "The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "指定した署名鍵は、%(userId)s の端末%(deviceId)s から受け取った署名鍵と一致します。端末を検証済みとしてマークしました。", "Displays action": "アクションを表示", "Forces the current outbound group session in an encrypted room to be discarded": "暗号化されたルーム内の現在のアウトバウンドグループセッションを強制的に破棄します", "Unrecognised command:": "認識できないコマンド:", @@ -374,7 +374,7 @@ "%(targetName)s accepted an invitation.": "%(targetName)s は招待を受け入れました。", "%(senderName)s requested a VoIP conference.": "%(senderName)s はVoIP会議を要求しました。", "%(senderName)s invited %(targetName)s.": "%(senderName)s は %(targetName)s を招待しました。", - "%(senderName)s banned %(targetName)s.": "%(senderName)s は %(targetName)s を追放しました。", + "%(senderName)s banned %(targetName)s.": "%(senderName)s は %(targetName)s をBANしました。", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s は、表示名を %(displayName)s に変更しました。", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s は、表示名を %(displayName)s に設定します。", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s は表示名 (%(oldDisplayName)s) を削除しました。", @@ -385,7 +385,7 @@ "VoIP conference finished.": "VoIP会議が終了しました。", "%(targetName)s rejected the invitation.": "%(targetName)s は招待を拒否しました。", "%(targetName)s left the room.": "%(targetName)s は部屋を出ました。", - "%(senderName)s unbanned %(targetName)s.": "%(senderName)s は %(targetName)s のブロックを解除しました。", + "%(senderName)s unbanned %(targetName)s.": "%(senderName)s は %(targetName)s をBAN解除しました。", "%(senderName)s kicked %(targetName)s.": "%(senderName)s は %(targetName)s を追放しました。", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s は %(targetName)s の招待を撤回しました。", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s はトピックを \"%(topic)s\" に変更しました。", @@ -397,8 +397,8 @@ "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|other": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", "%(senderName)s removed %(count)s %(removedAddresses)s as addresses for this room.|one": "%(senderName)s はこの部屋のアドレスとして %(removedAddresses)s を削除しました。", "%(senderName)s added %(addedAddresses)s and removed %(removedAddresses)s as addresses for this room.": "%(senderName)s はこの部屋のアドレスとして %(addedAddresses)s を追加し、%(removedAddresses)s を削除しました。", - "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s は、この部屋のメインアドレスを %(address)s に設定しました。", - "%(senderName)s removed the main address for this room.": "%(senderName)s はこの部屋のメインアドレスを削除しました。", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s は、この部屋の主アドレスを %(address)s に設定しました。", + "%(senderName)s removed the main address for this room.": "%(senderName)s はこの部屋の主アドレスを削除しました。", "Someone": "誰か", "(not supported by this browser)": "(このブラウザではサポートされていません)", "%(senderName)s answered the call.": "%(senderName)s が応答しました。", @@ -436,5 +436,301 @@ "Authentication check failed: incorrect password?": "認証チェックに失敗しました: パスワードの間違い?", "Sorry, your homeserver is too old to participate in this room.": "申し訳ありませんが、あなたのホームサーバーはこの部屋に参加するには古すぎます。", "Please contact your homeserver administrator.": "ホームサーバー管理者に連絡してください。", - "Failed to join room": "部屋に参加できませんでした" + "Failed to join room": "部屋に参加できませんでした", + "Message Pinning": "メッセージ留め", + "Increase performance by only loading room members on first view": "最初のビューではルームメンバーを読み込むだけにしてパフォーマンスを向上させる", + "Disable Emoji suggestions while typing": "入力中に絵文字の候補を無効にする", + "Hide join/leave messages (invites/kicks/bans unaffected)": "参加/離脱メッセージを非表示にする (招待/キック/禁止は影響を受けない)", + "Hide avatar changes": "アバター変更を隠す", + "Hide display name changes": "表示名の変更を表示しない", + "Always show encryption icons": "常に暗号化アイコンを表示する", + "Enable automatic language detection for syntax highlighting": "構文強調表示の自動言語検出を有効にする", + "Hide avatars in user and room mentions": "ユーザーや部屋でアバターを非表示にする", + "Disable big emoji in chat": "チャットで大きな絵文字を無効にする", + "Mirror local video feed": "ローカルビデオ映像送信", + "Disable Community Filter Panel": "コミュニティフィルタパネルを無効にする", + "Disable Peer-to-Peer for 1:1 calls": "1対1通話でピアツーピアを無効にする", + "Send analytics data": "分析データを送信する", + "Never send encrypted messages to unverified devices from this device": "この端末から未認証の端末に暗号化されたメッセージを送信しない", + "Never send encrypted messages to unverified devices in this room from this device": "この端末からこの部屋の未認証の端末に暗号化されたメッセージを送信しないでください", + "Enable inline URL previews by default": "デフォルトでインラインURLプレビューを有効にする", + "Enable URL previews for this room (only affects you)": "この部屋のURLプレビューを有効にする (あなたにのみ影響する)", + "Enable URL previews by default for participants in this room": "この部屋の参加者のためにデフォルトでURLプレビューを有効にする", + "Room Colour": "部屋の色", + "Enable widget screenshots on supported widgets": "サポートされているウィジェットでウィジェットのスクリーンショットを有効にする", + "Show empty room list headings": "空の部屋リスト見出しを表示する", + "Active call (%(roomName)s)": "アクティブな通話 (%(roomName)s)", + "unknown caller": "不明な発信者", + "Incoming voice call from %(name)s": "%(name)s からの着信音声コール", + "Incoming video call from %(name)s": "%(name)s からの着信ビデオコール", + "Incoming call from %(name)s": "%(name)s からの着信コール", + "Decline": "辞退", + "Accept": "受諾", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "テキストメッセージが +%(msisdn)s に送信されました。 含まれている確認コードを入力してください", + "Incorrect verification code": "認証コードの誤りです", + "Enter Code": "コードを入力する", + "Submit": "提出", + "Phone": "電話", + "Add phone number": "電話番号を追加", + "Failed to upload profile picture!": "プロフィール写真をアップロードできませんでした!", + "Upload new:": "新しいアップロード:", + "No display name": "表示名なし", + "New passwords don't match": "新しいパスワードが一致しません", + "Passwords can't be empty": "パスワードを空にすることはできません", + "Warning!": "警告!", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "パスワードを変更すると、すべての端末のエンドツーエンドの暗号化キーがリセットされ、暗号化されたチャット履歴は読み取れなくなります (最初にルームキーをエクスポートしてから再インポートする場合を除く)。 将来これは改善されるでしょう。", + "Export E2E room keys": "E2Eルームキーをエクスポートする", + "Do you want to set an email address?": "メールアドレスを設定しますか?", + "Password": "パスワード", + "Confirm password": "確認のパスワード", + "Your home server does not support device management.": "ホームサーバーは端末管理をサポートしていません。", + "Unable to load device list": "端末リストを読み込めません", + "Authentication": "認証", + "Delete %(count)s devices|other": "%(count)s 件の端末を削除する", + "Delete %(count)s devices|one": "端末を削除する", + "Device ID": "端末ID", + "Device Name": "端末名", + "Last seen": "最後のシーン", + "Select devices": "端末の選択", + "Failed to set display name": "表示名の設定に失敗しました", + "Disable Notifications": "通知を無効にする", + "Enable Notifications": "通知を有効にする", + "Off": "オフ", + "On": "オン", + "Cannot add any more widgets": "ウィジェットを追加できません", + "The maximum permitted number of widgets have already been added to this room.": "この部屋にウィジェットの最大許容数が既に追加されています。", + "Add a widget": "ウィジェットを追加する", + "Drop File Here": "ここにファイルをドロップする", + "Drop file here to upload": "アップロードするファイルをここにドロップする", + " (unsupported)": " (サポートされていない)", + "Join as voice or video.": "音声またはビデオとして参加してください。", + "Ongoing conference call%(supportedText)s.": "進行中の会議通話 %(supportedText)s", + "This event could not be displayed": "このイベントは表示できませんでした", + "%(senderName)s sent an image": "%(senderName)s が画像を送信しました", + "%(senderName)s sent a video": "%(senderName)s が動画を送信しました", + "%(senderName)s uploaded a file": "%(senderName)s がファイルをアップロードしました", + "Options": "オプション", + "Your key share request has been sent - please check your other devices for key share requests.": "共有キーリクエストが送信されました - 共有キーリクエスト用の他の端末を確認してください。", + "Key share requests are sent to your other devices automatically. If you rejected or dismissed the key share request on your other devices, click here to request the keys for this session again.": "共有キーリクエストは、他の端末に自動的に送信されます。 他の端末での共有キーリクエストを拒否または却下した場合は、ここをクリックしてこのセッションのキーを再度要求してください。", + "If your other devices do not have the key for this message you will not be able to decrypt them.": "他の端末にこのメッセージのキーがない場合、それらの端末を復号化することはできません。", + "Key request sent.": "キーリクエストが送信されました。", + "Re-request encryption keys from your other devices.": "他の端末から暗号化キーを再リクエストします。", + "Undecryptable": "解読不能", + "Encrypting": "暗号化", + "Encrypted, not sent": "暗号化され、送信されません", + "Encrypted by a verified device": "検証された端末によって暗号化されました", + "Encrypted by an unverified device": "未検証の端末によって暗号化されました", + "Unencrypted message": "暗号化されていないメッセージ", + "Please select the destination room for this message": "このメッセージを送り先部屋を選択してください", + "Blacklisted": "ブラックリストに載せた", + "Verified": "検証済み", + "Unverified": "未検証", + "device id: ": "端末id: ", + "Disinvite": "招待拒否", + "Kick": "追い出す", + "Disinvite this user?": "このユーザーを招待拒否しますか?", + "Kick this user?": "このユーザーを追い出しますか?", + "Failed to kick": "キックに失敗しました", + "e.g. %(exampleValue)s": "例えば %(exampleValue)s", + "Every page you use in the app": "アプリで使用するすべてのページ", + "Your User Agent": "ユーザーエージェント", + "Call Failed": "呼び出しに失敗しました", + "Review Devices": "端末を確認する", + "Automatically replace plain text Emoji": "自動的にプレーンテキスト絵文字を置き換える", + "Pin unread rooms to the top of the room list": "未読の部屋を部屋リストの上部にピン止めする", + "Pin rooms I'm mentioned in to the top of the room list": "ルームリストの上部に記載された部屋をピン止めする", + "Demote yourself?": "自身を降格しますか?", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "自分自身を降格させるときにこの変更を元に戻すことはできません。あなたが部屋の最後の特権ユーザーである場合、特権を回復することは不可能です。", + "Demote": "降格", + "Failed to mute user": "ユーザーのミュートに失敗しました", + "Failed to toggle moderator status": "モデレータステータスを切り替えることができませんでした", + "Failed to change power level": "権限レベルの変更に失敗しました", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "この変更を元に戻すことはできません。そのユーザーが自分と同じ権限レベルを持つように促します。", + "No devices with registered encryption keys": "登録された暗号化キーを持つ端末はありません", + "Devices": "端末", + "Ignore": "無視", + "Jump to read receipt": "既読へジャンプ", + "Invite": "招待", + "Share Link to User": "ユーザーへのリンクを共有する", + "User Options": "ユーザーオプション", + "Unmute": "ミュート解除", + "Revoke Moderator": "モデレーターを取り消す", + "Make Moderator": "モデレーターにする", + "Admin Tools": "管理者ツール", + "Level:": "レベル:", + "and %(count)s others...|other": "そして、他 %(count)s ...", + "and %(count)s others...|one": "そして、もう1つ...", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (パワー %(powerLevelNumber)s)", + "deleted": "", + "Attachment": "付属品", + "At this time it is not possible to reply with a file so this will be sent without being a reply.": "現時点ではファイルで返信することはできませんので、返信なしに送信されます。", + "Upload Files": "ファイルをアップロードする", + "Are you sure you want to upload the following files?": "次のファイルをアップロードしますか?", + "Encrypted room": "暗号化された部屋", + "Unencrypted room": "暗号化されていない部屋", + "Hangup": "電話を切る", + "Voice call": "音声通話", + "Video call": "ビデオ通話", + "Show Text Formatting Toolbar": "テキストの書式設定ツールバーを表示する", + "Send an encrypted reply…": "暗号化された返信を送信する…", + "Send a reply (unencrypted)…": "(暗号化されていない) 返信を送信する…", + "Send an encrypted message…": "暗号化されたメッセージを送信する…", + "Send a message (unencrypted)…": "(暗号化されていない) メッセージを送信する…", + "This room has been replaced and is no longer active.": "この部屋は交換されており、もうアクティブではありません。", + "The conversation continues here.": "会話はここで続けられます。", + "You do not have permission to post to this room": "この部屋に投稿する権限がありません", + "Turn Markdown off": "マークダウンをオフにする", + "Turn Markdown on": "マークダウンをオンにする", + "Hide Text Formatting Toolbar": "テキストの書式設定ツールバーを隠す", + "Server error": "サーバーエラー", + "Server unavailable, overloaded, or something else went wrong.": "サーバーが使用できない、オーバーロードされている、または何かが間違っていました。", + "Command error": "コマンドエラー", + "Unable to reply": "返信できません", + "At this time it is not possible to reply with an emote.": "現時点では、エモートで返信することはできません。", + "Markdown is disabled": "マークダウンは無効です", + "Markdown is enabled": "マークダウンは有効です", + "Jump to message": "メッセージにジャンプ", + "No pinned messages.": "固定メッセージはありません。", + "Loading...": "読み込み中...", + "Pinned Messages": "固定メッセージ", + "%(duration)ss": "%(duration)s 秒", + "%(duration)sm": "%(duration)s 分", + "%(duration)sh": "%(duration)s 時", + "%(duration)sd": "%(duration)s 日", + "Online for %(duration)s": "オンライン時間 %(duration)s", + "Idle for %(duration)s": "アイドル時間 %(duration)s", + "Offline for %(duration)s": "オフライン時間 %(duration)s", + "Unknown for %(duration)s": "不明な時間 %(duration)s", + "Idle": "アイドル", + "Offline": "オフライン", + "Unknown": "未知の", + "Seen by %(userName)s at %(dateTime)s": "%(dateTime)s に %(userName)s が見た", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(dateTime)s に %(displayName)s (%(userName)s) が見た", + "Replying": "返信中", + "Failed to set avatar.": "アバターを設定できませんでした。", + "Save": "保存", + "(~%(count)s results)|other": "(~%(count)s 結果)", + "(~%(count)s results)|one": "(~%(count)s 結果)", + "Join Room": "部屋に入る", + "Remove avatar": "アバターを削除", + "Forget room": "部屋を忘れる", + "Share room": "部屋を共有する", + "Show panel": "パネルを表示する", + "Drop here to favourite": "お気に入りはここにドロップする", + "Drop here to tag direct chat": "ダイレクトチャットにタグを付けるためにここにドロップ", + "Drop here to restore": "復元するにはここにドロップ", + "Drop here to demote": "降格するにはここにドロップ", + "Drop here to tag %(section)s": "%(section)s にタグを付けるにはここにドロップ", + "Press to start a chat with someone": "を押すと、誰かとチャットを開始します", + "You're not in any rooms yet! Press to make a room or to browse the directory": "あなたはまだどの部屋にもいません! を押してルームを作成するか、を押してディレクトリをブラウズします", + "Community Invites": "コミュニティへの招待", + "Invites": "招待", + "Unban": "BAN解除", + "Ban": "BAN", + "Unban this user?": "このユーザーをBAN解除しますか?", + "Ban this user?": "このユーザーを利用禁止にしますか?", + "Failed to ban user": "ユーザーを利用禁止できませんでした", + "System Alerts": "システムアラート", + "Joining room...": "部屋に入る...", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "この招待状が送信されたアドレスがあなたのアカウントに関連付けられているアドレスと一致しているかどうかを確認できません。", + "This invitation was sent to an email address which is not associated with this account:": "この招待状はこのアカウントに関連付けられていないメールアドレスに送信されました:", + "You may wish to login with a different account, or add this email to this account.": "別のアカウントでログインするか、このメールをこのアカウントに追加することができます。", + "You have been invited to join this room by %(inviterName)s": "%(inviterName)s からこの部屋に参加するように招待されました", + "Would you like to accept or decline this invitation?": "この招待状を受諾または辞退しますか?", + "Reason: %(reasonText)s": "理由: %(reasonText)s", + "Rejoin": "再参加", + "You have been kicked from %(roomName)s by %(userName)s.": "あなたは %(userName)s により %(roomName)s から追い出されました。", + "You have been kicked from this room by %(userName)s.": "あなたは %(userName)s によりこの部屋から追い出されました。", + "You have been banned from %(roomName)s by %(userName)s.": "あなたは %(userName)s により %(roomName)s から締め出されました。", + "You have been banned from this room by %(userName)s.": "あなたは %(userName)s によってこの部屋から閉め出されました。", + "This room": "この部屋", + "%(roomName)s does not exist.": "%(roomName)s は存在しません。", + "%(roomName)s is not accessible at this time.": "%(roomName)s は現在アクセスできません。", + "You are trying to access %(roomName)s.": "%(roomName)s にアクセスしようとしています。", + "You are trying to access a room.": "ある部屋にアクセスしようとしています。", + "Click here to join the discussion!": "ここをクリックしてディスカッションに参加してください!", + "This is a preview of this room. Room interactions have been disabled": "この部屋のプレビューです。 部屋の相互作用が無効になっています", + "To change the room's avatar, you must be a": "部屋のアバターを変更するのに必要な権限", + "To change the room's name, you must be a": "部屋の名前を変更するのに必要な権限", + "To change the room's main address, you must be a": "部屋の主アドレスを変更するのに必要な権限", + "To change the room's history visibility, you must be a": "部屋履歴の可視性を変更するのに必要な権限", + "To change the permissions in the room, you must be a": "部屋のパーミッションを変更するのに必要な権限", + "To change the topic, you must be a": "トピックを変更するのに必要な権限", + "To modify widgets in the room, you must be a": "部屋のウィジェットを変更するのに必要な権限", + "Failed to unban": "閉め出し解除に失敗しました", + "Banned by %(displayName)s": "%(displayName)s によって閉め出されました", + "Privacy warning": "プライバシーに関する警告", + "Changes to who can read history will only apply to future messages in this room": "履歴を読むことができる人への変更は、この部屋の将来のメッセージにのみ適用されます", + "The visibility of existing history will be unchanged": "既存の履歴の可視性は変更されません", + "End-to-end encryption is in beta and may not be reliable": "エンドツーエンドの暗号化はベータ版であり、信頼性がないかもしれません", + "You should not yet trust it to secure data": "データを保護するためにまだそれを信用すべきではありません", + "Devices will not yet be able to decrypt history from before they joined the room": "端末はまだ部屋に入る前の履歴を復号化することはできません", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "部屋の暗号化が有効になったら、(今のところ) もう一度電源を切ることはできません", + "Encrypted messages will not be visible on clients that do not yet implement encryption": "暗号化されたメッセージは、まだ暗号化を実装していないクライアントでは表示されません", + "Encryption is not enabled in this room": "この部屋では暗号化が有効になっていません", + "The default role for new room members is": "新しいルームメンバーのデフォルトの役割は次のとおり", + "To send messages, you must be a": "メッセージを送信するのに必要な権限", + "To invite users into the room, you must be a": "ユーザーを会議室に招待するのに必要な権限", + "To configure the room, you must be a": "部屋を設定するのに必要な権限", + "To kick users, you must be a": "ユーザーを追い出すのに必要な権限", + "To ban users, you must be a": "ユーザーを閉め出すのに必要な権限", + "To remove other users' messages, you must be a": "他のユーザーのメッセージを削除するのに必要な権限", + "To notify everyone in the room, you must be a": "部屋の全員に通知するのに必要な権限", + "No users have specific privileges in this room": "この部屋には特定の権限を持つユーザーはいません", + "%(user)s is a %(userRole)s": "%(user)s は %(userRole)s です", + "Privileged Users": "特権ユーザー", + "Muted Users": "ミュートされたユーザー", + "Banned users": "追放されたユーザー", + "This room is not accessible by remote Matrix servers": "この部屋はリモートのMatrixサーバーからアクセスできない", + "Tagged as: ": "タグ付き: ", + "To link to a room it must have an address.": "部屋にリンクするにはアドレスが必要です。", + "Guests cannot join this room even if explicitly invited.": "ゲストは、明示的に招待された場合でもこの部屋に参加することはできません。", + "Click here to fix": "修正するにはここをクリック", + "To send events of type , you must be a": "タイプのイベントを送信するのに必要な権限", + "Upgrade room to version %(ver)s": "部屋をバージョン %(ver)s にアップグレードする", + "Who can access this room?": "誰がこの部屋にアクセスできますか?", + "Publish this room to the public in %(domain)s's room directory?": "%(domain)s のルームディレクトリにこの部屋を公開しますか?", + "Who can read history?": "誰が履歴を読むことができますか?", + "Members only (since the point in time of selecting this option)": "メンバーのみ (このオプションを選択した時点以降)", + "Members only (since they were invited)": "メンバーのみ (招待されて以来)", + "Members only (since they joined)": "メンバーのみ (参加して以来)", + "Permissions": "アクセス許可", + "Advanced": "詳細", + "Internal room ID: ": "内部の部屋ID: ", + "Room version number: ": "部屋のバージョン番号: ", + "Add a topic": "トピックを追加", + "There is a known vulnerability affecting this room.": "この部屋には既知の脆弱性が存在します。", + "This room version is vulnerable to malicious modification of room state.": "この部屋のバージョンは、部屋の状態の悪意のある変更に対して脆弱です。", + "Click here to upgrade to the latest room version and ensure room integrity is protected.": "最新の部屋のバージョンにアップグレードし、部屋の完全性が確保されていることを確認するには、ここをクリックしてください。", + "Only room administrators will see this warning": "この警告はルーム管理者のみに表示されます", + "You don't currently have any stickerpacks enabled": "現在、使用可能なステッカーパックはありません", + "Add some now": "今すぐ追加", + "Stickerpack": "ステッカーパック", + "Hide Stickers": "ステッカーを隠す", + "Show Stickers": "ステッカーを表示", + "Scroll to unread messages": "未読メッセージにスクロールする", + "Jump to first unread message.": "最初の未読メッセージにジャンプします。", + "Invalid alias format": "無効なエイリアス形式", + "'%(alias)s' is not a valid format for an alias": "'%(alias)s' はエイリアスの有効な形式ではありません", + "Invalid address format": "無効なアドレス形式", + "'%(alias)s' is not a valid format for an address": "'%(alias)s' は有効なアドレス形式ではありません", + "not specified": "指定されていない", + "not set": "設定されていない", + "Remote addresses for this room:": "この部屋のリモートアドレス:", + "Addresses": "アドレス", + "The main address for this room is": "この部屋の主アドレスは", + "Local addresses for this room:": "この部屋のローカルアドレス:", + "This room has no local addresses": "この部屋にはローカルアドレスはありません", + "New address (e.g. #foo:%(localDomain)s)": "新しいアドレス (例 #foo:%(localDomain)s)", + "Invalid community ID": "無効なコミュニティID", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' は有効なコミュニティIDではありません", + "Showing flair for these communities:": "これらのコミュニティの特色を示す:", + "This room is not showing flair for any communities": "この部屋はどんなコミュニティに対しても特色を表示していません", + "New community ID (e.g. +foo:%(localDomain)s)": "新しいコミュニティID (例 +foo:%(localDomain)s)", + "You have enabled URL previews by default.": "デフォルトでURLプレビューが有効です。", + "You have disabled URL previews by default.": "デフォルトでURLプレビューが無効です。", + "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが有効です。", + "URL previews are disabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが無効です。", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URLプレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューが生成された場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", + "URL Previews": "URLプレビュー" } From 50768327e2232888b9b11204f7287352adb49606 Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Fri, 2 Nov 2018 18:16:41 +0000 Subject: [PATCH 29/85] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/bg/ --- src/i18n/strings/bg.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index b49384891c..4fa54e08c3 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1291,5 +1291,11 @@ "Clear cache and resync": "Изчисти кеша и ресинхронизирай", "Please accept all of the policies": "Моля, приемете всички политики", "Please review and accept the policies of this homeserver:": "Моля, прегледайте и приемете политиките на този сървър:", - "Add some now": "Добави сега" + "Add some now": "Добави сега", + "Pin unread rooms to the top of the room list": "Закачане на непрочетени стаи най-отгоре в списъка", + "Pin rooms I'm mentioned in to the top of the room list": "Закачане на споменаващи ме стаи най-отгоре в списъка", + "Joining room...": "Влизане в стая...", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Вие сте администратор на тази общност. Няма да можете да се присъедините пак без покана от друг администратор.", + "Open Devtools": "Отваряне на инструменти на разработчика", + "Show developer tools": "Покажи инструментите за разработчици" } From 578136fa3062219cb6f7ff2cca86814ee6c23a88 Mon Sep 17 00:00:00 2001 From: Osoitz Date: Sat, 3 Nov 2018 08:23:53 +0000 Subject: [PATCH 30/85] Translated using Weblate (Basque) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/eu/ --- src/i18n/strings/eu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 0d25b988ad..6eaf55259e 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1296,5 +1296,7 @@ "Joining room...": "Gelara elkartzen...", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Komunitate honen administratzailea zara. Ezin izango duzu berriro elkartu ez bazaitu beste administratzaile batek gonbidatzen.", "Open Devtools": "Ireki garapen tresnak", - "Show developer tools": "Erakutsi garapen tresnak" + "Show developer tools": "Erakutsi garapen tresnak", + "Pin unread rooms to the top of the room list": "Finkatu irakurri gabeko gelak gelen zerrendaren goialdean", + "Pin rooms I'm mentioned in to the top of the room list": "Finkatu aipatu nauten gelak gelen zerrendaren goialdean" } From 450b226632fe7c4f0c19bdec937c4d9eccd25cd6 Mon Sep 17 00:00:00 2001 From: Krombel Date: Sat, 3 Nov 2018 13:32:47 +0000 Subject: [PATCH 31/85] Translated using Weblate (German) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 5cb856b651..88667bdb0d 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1291,5 +1291,12 @@ "Incompatible local cache": "Inkompatibler lokaler Zwischenspeicher", "Clear cache and resync": "Zwischenspeicher löschen und erneut synchronisieren", "Please accept all of the policies": "Bitte akzeptiere alle Bedingungen", - "Please review and accept the policies of this homeserver:": "Bitte sieh dir alle Bedingungen dieses Heimservers an und akzeptiere sie:" + "Please review and accept the policies of this homeserver:": "Bitte sieh dir alle Bedingungen dieses Heimservers an und akzeptiere sie:", + "Pin unread rooms to the top of the room list": "Ungelesene Räume oben an der Raumliste anheften", + "Pin rooms I'm mentioned in to the top of the room list": "Räume mit Erwähnungen oben an der Raumliste anheften", + "Joining room...": "Trete Raum bei...", + "Add some now": "Füge jetzt hinzu", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Du bist ein Administrator dieser Community. Du wirst nicht erneut hinzutreten können, wenn du nicht von einem anderen Administrator eingeladen wirst.", + "Open Devtools": "Öffne Entwickler-Werkzeuge", + "Show developer tools": "Zeige Entwickler-Werkzeuge" } From f9d5c11d8d373ce6d521ce436b5e6ccdaa4604aa Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 4 Nov 2018 19:47:24 -0700 Subject: [PATCH 32/85] Regenerate the room list when m.fully_read is issued Not doing so results in the RoomListStore tracking stale data when the user reads messages on another device. The visual effect of this is rooms being incorrectly pinned in places they shouldn't be, such as the top of the list. This also fixes another visual bug where rooms don't move down once their timelines are read. This second issue is mot prominent when multiple rooms have been pinned to the top, and the middle one is read ahead of the others - it'll stick around until some other condition decides to wipe the room's cached state. Fixes https://github.com/vector-im/riot-web/issues/7653 --- src/actions/MatrixActionCreators.js | 30 +++++++++++++++++++++++++++++ src/stores/RoomListStore.js | 7 +++++++ 2 files changed, 37 insertions(+) diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index 31bcac3e52..2f2c23d06f 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -62,6 +62,35 @@ function createAccountDataAction(matrixClient, accountDataEvent) { }; } +/** + * @typedef RoomAccountDataAction + * @type {Object} + * @property {string} action 'MatrixActions.Room.accountData'. + * @property {MatrixEvent} event the MatrixEvent that triggered the dispatch. + * @property {string} event_type the type of the MatrixEvent, e.g. "m.direct". + * @property {Object} event_content the content of the MatrixEvent. + * @property {Room} room the room where the account data was changed. + */ + +/** + * Create a MatrixActions.Room.accountData action that represents a MatrixClient `Room.accountData` + * matrix event. + * + * @param {MatrixClient} matrixClient the matrix client. + * @param {MatrixEvent} accountDataEvent the account data event. + * @param {Room} room the room where account data was changed + * @returns {RoomAccountDataAction} an action of type MatrixActions.accountData. + */ +function createRoomAccountDataAction(matrixClient, accountDataEvent, room) { + return { + action: 'MatrixActions.Room.accountData', + event: accountDataEvent, + event_type: accountDataEvent.getType(), + event_content: accountDataEvent.getContent(), + room: room, + }; +} + /** * @typedef RoomAction * @type {Object} @@ -201,6 +230,7 @@ export default { start(matrixClient) { this._addMatrixClientListener(matrixClient, 'sync', createSyncAction); this._addMatrixClientListener(matrixClient, 'accountData', createAccountDataAction); + this._addMatrixClientListener(matrixClient, 'Room.accountData', createRoomAccountDataAction); this._addMatrixClientListener(matrixClient, 'Room', createRoomAction); this._addMatrixClientListener(matrixClient, 'Room.tags', createRoomTagsAction); this._addMatrixClientListener(matrixClient, 'Room.timeline', createRoomTimelineAction); diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 2b70d53b59..0f8e5d7b4d 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -142,6 +142,13 @@ class RoomListStore extends Store { this._generateRoomLists(); } break; + case 'MatrixActions.Room.accountData': { + if (payload.event_type === 'm.fully_read') { + this._clearCachedRoomState(payload.room.roomId); + this._generateRoomLists(); + } + } + break; case 'MatrixActions.Room.myMembership': { this._generateRoomLists(); } From ec2528e8b5f1c015e1c35e2f87c9c9eb9f748344 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 4 Nov 2018 23:00:47 -0700 Subject: [PATCH 33/85] Update MatrixActionCreators.js --- src/actions/MatrixActionCreators.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/MatrixActionCreators.js b/src/actions/MatrixActionCreators.js index 2f2c23d06f..c1d42ffd0d 100644 --- a/src/actions/MatrixActionCreators.js +++ b/src/actions/MatrixActionCreators.js @@ -79,7 +79,7 @@ function createAccountDataAction(matrixClient, accountDataEvent) { * @param {MatrixClient} matrixClient the matrix client. * @param {MatrixEvent} accountDataEvent the account data event. * @param {Room} room the room where account data was changed - * @returns {RoomAccountDataAction} an action of type MatrixActions.accountData. + * @returns {RoomAccountDataAction} an action of type MatrixActions.Room.accountData. */ function createRoomAccountDataAction(matrixClient, accountDataEvent, room) { return { From 821cdc55c1695a8a00cf8196fe97c3bd75424b4a Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Fri, 2 Nov 2018 18:17:34 +0000 Subject: [PATCH 34/85] Translated using Weblate (Bulgarian) Currently translated at 100.0% (1274 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/bg/ --- src/i18n/strings/bg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 4fa54e08c3..4c390cfade 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1296,6 +1296,6 @@ "Pin rooms I'm mentioned in to the top of the room list": "Закачане на споменаващи ме стаи най-отгоре в списъка", "Joining room...": "Влизане в стая...", "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "Вие сте администратор на тази общност. Няма да можете да се присъедините пак без покана от друг администратор.", - "Open Devtools": "Отваряне на инструменти на разработчика", + "Open Devtools": "Отвори инструментите за разработчици", "Show developer tools": "Покажи инструментите за разработчици" } From 6df367f95a087a791940cd1d7f0878813556287c Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Mon, 5 Nov 2018 09:27:25 +0000 Subject: [PATCH 35/85] Translated using Weblate (Japanese) Currently translated at 75.6% (964 of 1274 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.riot.im/projects/riot-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 234 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 233 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index e188d821ad..4194e72b6a 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -732,5 +732,237 @@ "URL previews are enabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが有効です。", "URL previews are disabled by default for participants in this room.": "この部屋の参加者は、デフォルトでURLプレビューが無効です。", "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "このような暗号化された部屋では、URLプレビューはデフォルトで無効になっており、あなたのホームサーバー(プレビューが生成された場所)がこの部屋に表示されているリンクに関する情報を収集できないようにしています。", - "URL Previews": "URLプレビュー" + "URL Previews": "URLプレビュー", + "You have no historical rooms": "履歴のある部屋がありません", + "Historical": "履歴のある", + "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "メッセージにURLを入力すると、URLプレビューが表示され、タイトル、説明、ウェブサイトからの画像など、そのリンクに関する詳細情報が表示されます。", + "Error decrypting audio": "オーディオの復号化エラー", + "Error decrypting attachment": "添付ファイルの復号化エラー", + "Decrypt %(text)s": "%(text)s を解読する", + "Download %(text)s": "%(text)s をダウンロード", + "Invalid file%(extra)s": "無効なファイル %(extra)s", + "Error decrypting image": "イメージの復号化エラー", + "Error decrypting video": "動画の復号化エラー", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s が %(roomName)s のアバターを変更しました", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s がルームアバターを削除しました。", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s はルームアバターをに変更しました", + "This room is a continuation of another conversation.": "この部屋は別の会話の続きです。", + "Click here to see older messages.": "古いメッセージを見るにはここをクリックしてください。", + "Copied!": "コピーされました!", + "Failed to copy": "コピーに失敗しました", + "Add an Integration": "統合を追加する", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "サードパーティのサイトに移動して、%(integationsUrl)s で使用するためにアカウントを認証できるようになります。続行しますか?", + "Removed or unknown message type": "削除されたまたは未知のメッセージタイプ", + "Message removed by %(userId)s": "%(userId)s によってメッセージが削除されました", + "Message removed": "メッセージが削除された", + "Robot check is currently unavailable on desktop - please use a web browser": "現在のところ、ロボットチェックはデスクトップ上ではご利用いただけません - ウェブブラウザを使用してください", + "This Home Server would like to make sure you are not a robot": "このHome Serverはあなたがロボットではないことを確認します", + "Sign in with CAS": "CASでサインインする", + "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.": "カスタムサーバーオプションを使用して、別のホームサーバーURLを指定して、他のMatrixサーバーにサインインすることができます。", + "This allows you to use this app with an existing Matrix account on a different home server.": "これにより、別のホームサーバー上の既存のMatrixアカウントでこのアプリケーションを使用することができます。", + "You can also set a custom identity server but this will typically prevent interaction with users based on email address.": "カスタムアイデンティティサーバーを設定することもできますが、通常は電子メールアドレスに基づいてユーザーとのやりとりを防止します。", + "To continue, please enter your password.": "続行するには、パスワードを入力してください。", + "Password:": "パスワード:", + "Please review and accept the policies of this homeserver:": "このホームサーバーのポリシーを確認し、同意してください:", + "An email has been sent to %(emailAddress)s": "電子メールが %(emailAddress)s に送信されました。", + "Please check your email to continue registration.": "登録を続行するにはメールをご確認ください。", + "Token incorrect": "間違ったトークン", + "A text message has been sent to %(msisdn)s": "テキストメッセージが %(msisdn)s に送信されました", + "Please enter the code it contains:": "それに含まれるコードを入力してください:", + "Code": "コード", + "Start authentication": "認証を開始する", + "The email field must not be blank.": "電子メールフィールドは空白であってはいけません。", + "The user name field must not be blank.": "ユーザー名フィールドは空白であってはなりません。", + "The phone number field must not be blank.": "電話番号フィールドは空白であってはいけません。", + "The password field must not be blank.": "パスワードフィールドは空白であってはいけません。", + "Username on %(hs)s": "%(hs)s のユーザー名", + "User name": "ユーザー名", + "Mobile phone number": "携帯電話番号", + "Forgot your password?": "パスワードを忘れましたか?", + "%(serverName)s Matrix ID": "%(serverName)s Matrix ID", + "Sign in with": "にログインする", + "Email address": "メールアドレス", + "Sign in": "サインイン", + "If you don't specify an email address, you won't be able to reset your password. Are you sure?": "メールアドレスを指定しないと、パスワードをリセットできません。間違いありませんか?", + "Email address (optional)": "メールアドレス (オプション)", + "You are registering with %(SelectedTeamName)s": "あなたは %(SelectedTeamName)s で登録しています", + "Mobile phone number (optional)": "携帯電話番号 (オプション)", + "Default server": "デフォルトサーバー", + "Custom server": "カスタムサーバー", + "Home server URL": "ホームサーバーのURL", + "Identity server URL": "アイデンティティ・サーバーのURL", + "What does this mean?": "これはどういう意味ですか?", + "Remove from community": "コミュニティから削除", + "Disinvite this user from community?": "このユーザーをコミュニティから拒否しますか?", + "Remove this user from community?": "コミュニティからこのユーザーを削除しますか?", + "Failed to withdraw invitation": "招待を撤回できませんでした", + "Failed to remove user from community": "コミュニティからユーザーを削除できませんでした", + "Filter community members": "コミュニティメンバーをフィルタリングする", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "%(roomName)s を %(groupId)s から削除してもよろしいですか?", + "Removing a room from the community will also remove it from the community page.": "コミュニティから部屋を削除すると、コミュニティページからもその部屋が削除されます。", + "Failed to remove room from community": "コミュニティからの部屋の削除に失敗しました", + "Failed to remove '%(roomName)s' from %(groupId)s": "%(groupName)s から '%(roomName)s' を削除できませんでした", + "Something went wrong!": "何かが間違っていた!", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "%(groupId)s の '%(roomName)s' の表示を更新できませんでした。", + "Visibility in Room List": "ルームリストの可視性", + "Visible to everyone": "みんなに見える", + "Only visible to community members": "コミュニティメンバーにのみ表示されます", + "Filter community rooms": "コミュニティルームをフィルタリングする", + "Something went wrong when trying to get your communities.": "コミュニティに参加しようとすると何かがうまくいかなかった。", + "Display your community flair in rooms configured to show it.": "それを表示するように構成された部屋にコミュニティの特色を表示します。", + "Show developer tools": "開発者ツールを表示", + "You're not currently a member of any communities.": "あなたは現在、どのコミュニティのメンバーでもありません。", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie (please see our Cookie Policy).": "匿名利用データを送信して、Riot.imの改善を支援してください。 これはCookieを使用します (クッキーポリシーをご覧ください)>。", + "Please help improve Riot.im by sending anonymous usage data. This will use a cookie.": "匿名利用データを送信して、Riot.imの改善を支援してください。 これはクッキーを使用します。", + "Yes, I want to help!": "はい、協力します!", + "Please contact your service administrator to get this limit increased.": "この制限を増やすには、サービス管理者にお問い合わせください。", + "This homeserver has hit its Monthly Active User limit so some users will not be able to log in.": "このホームサーバーは月間アクティブユーザー数の上限に達しているため、一部のユーザーはログインできません。", + "This homeserver has exceeded one of its resource limits so some users will not be able to log in.": "このホームサーバーはリソース制限の1つを超えており、一部のユーザーはログインできません。", + "Unknown Address": "不明な住所", + "NOTE: Apps are not end-to-end encrypted": "注: アプリはエンドツーエンド暗号化されていません", + "Warning: This widget might use cookies.": "警告: このウィジェットはCookieを使用することがあります。", + "Do you want to load widget from URL:": "URLからウィジェットをロードしますか:", + "Allow": "許可", + "Delete Widget": "ウィジェットを削除", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "ウィジェットを削除すると、この部屋のすべてのユーザーのウィジェットが削除されます。 このウィジェットを削除してもいいですか?", + "Delete widget": "ウィジェットを削除", + "Failed to remove widget": "ウィジェットを削除できませんでした", + "An error ocurred whilst trying to remove the widget from the room": "ウィジェットをその部屋から削除しようとしているときにエラーが発生しました", + "Revoke widget access": "ウィジェットへのアクセスを取り消す", + "Minimize apps": "アプリを最小化する", + "Reload widget": "ウィジェットを再ロード", + "Popout widget": "ウィジェットをポップアウト", + "Picture": "画像", + "Unblacklist": "ブラックリスト解除", + "Blacklist": "ブラックリスト", + "Verify...": "検証中...", + "No results": "結果がありません", + "Communities": "コミュニティ", + "Home": "ホーム", + "Integrations Error": "統合エラー", + "Manage Integrations": "統合管理", + "%(nameList)s %(transitionList)s": "%(nameList)s %(transitionList)s", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s が %(count)s 回参加しました", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s が参加しました", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s が %(count)s 回参加しました", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s が参加しました", + "%(severalUsers)sleft %(count)s times|other": "%(severalUers)s が %(count)s 回退室しました", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s が退室しました", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s が %(count)s 回退室しました", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s が退室しました", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s が%(count)s 回参加し、退室した", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s が参加して退室しました", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s が %(count)s 回参加し退室しました", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s が参加し退室しました", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s が %(count)s 回退室し再参加しました", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s が退室し再参加しました", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s が %(count)s 回退室し再参加しました", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s が退室し再参加しました", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s が %(count)s 回招待を拒否しました", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s が招待を拒否しました", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s が %(count)s 回招待を拒否しました", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s が招待を拒否しました", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s が招待を取り消しました", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s が %(count)s 回招待を取り消しました", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s が招待を取り消しました", + "were invited %(count)s times|other": "%(count)s 回招待されました", + "were invited %(count)s times|one": "招待されました", + "was invited %(count)s times|other": "%(count)s 回招待されました", + "was invited %(count)s times|one": "招待されました", + "were banned %(count)s times|other": "%(count)s 回追放されました", + "were banned %(count)s times|one": "追放されました", + "was banned %(count)s times|other": "%(count)s 回追放されました", + "was banned %(count)s times|one": "追放されました", + "were unbanned %(count)s times|other": "%(count)s 回追放解除されました", + "were unbanned %(count)s times|one": "追放解除されました", + "was unbanned %(count)s times|other": "%(count)s 回追放解除されました", + "were kicked %(count)s times|other": "%(count)s 回追い出しました", + "were kicked %(count)s times|one": "追い出されました", + "was kicked %(count)s times|other": "%(count)s 回追い出されました", + "was kicked %(count)s times|one": "追い出されました", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s が %(count)s 回名前を変更しました", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s が名前を変更しました", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s が %(count)s 回名前を変更しました", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s が名前を変更しました", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s が %(count)s 回アバターを変更しました", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s がアバターを変更しました", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s がアバターを %(count)s 回変更しました", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s がアバターを変更しました", + "%(items)s and %(count)s others|other": "%(items)s と 他 %(count)s 回", + "%(items)s and %(count)s others|one": "%(items)s と他の1つ", + "%(items)s and %(lastItem)s": "%(items)s と %(lastItem)s", + "collapse": "崩壊", + "expand": "拡大する", + "Custom of %(powerLevel)s": "%(powerLevel)s のカスタム", + "Custom level": "カスタムレベル", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "返信されたイベントを読み込めません。存在しないか、表示する権限がありません。", + "In reply to ": "返信 ", + "And %(count)s more...|other": "そして %(count)s もっと...", + "ex. @bob:example.com": "例 @bob:example.com", + "Add User": "ユーザーを追加", + "Matrix ID": "Matirx ID", + "Matrix Room ID": "Matrix 部屋ID", + "email address": "メールアドレス", + "You have entered an invalid address.": "無効なアドレスを入力しました。", + "Try using one of the following valid address types: %(validTypesList)s.": "次の有効なアドレスタイプのいずれかを使用してください。%(validTypesList)s", + "Before submitting logs, you must create a GitHub issue to describe your problem.": "ログを送信する前に、問題を説明するためにGitHubに論点を作成する必要があります。", + "What GitHub issue are these logs for?": "これらのログはどのGitHubの問題ですか?", + "Create a new chat or reuse an existing one": "新しいチャットを作成するか、既存のチャットを再利用する", + "Start new chat": "新しいチャットを開始", + "You already have existing direct chats with this user:": "このユーザーには既に既存のチャットがあります:", + "Click on the button below to start chatting!": "チャットを開始するには、下のボタンをクリックしてください!", + "Confirm Removal": "削除の確認", + "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "このイベントを削除してもよろしいですか?部屋の名前やトピックの変更を削除すると、変更が取り消される可能性があります。", + "Community IDs cannot be empty.": "コミュニティIDは空にできません。", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "コミュニティIDには次の文字のみを含めることができます a-z, 0-9, or '=_-./'", + "Something went wrong whilst creating your community": "コミュニティを作成する時に何かがうまくいかなかった", + "Create Community": "コミュニティを作成する", + "Community Name": "コミュニティ名", + "Example": "例", + "Community ID": "コミュニティID", + "example": "例", + "Create": "作成する", + "Room name (optional)": "部屋名 (オプション)", + "Advanced options": "詳細オプション", + "Block users on other matrix homeservers from joining this room": "他のmatrixホームサーバーのユーザーをこの部屋に参加させないようにする", + "This setting cannot be changed later!": "この設定は後で変更することはできません!", + "Failed to indicate account erasure": "アカウントの削除を示すことができませんでした", + "Unknown error": "不明なエラー", + "Incorrect password": "間違ったパスワード", + "Deactivate Account": "アカウントを無効にする", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "これにより、あなたのアカウントは永久に使用できなくなります。ログインできなくなり、誰も同じユーザーIDを再登録できなくなります。これにより、参加しているすべてのルームから退室し、 IDサーバからあなたのアカウントの詳細が削除されます。この操作は元に戻すことができません。", + "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "アカウントを無効にしても、送信されたメッセージはデフォルトではなくなりません。メッセージを忘れてしまった場合は、下のボックスにチェックを入れてください。", + "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Matrixのメッセージの可視性は電子メールと似ています。メッセージを忘れると、新規または未登録のユーザーと共有することができませんが、既にこれらのメッセージにアクセスしている登録ユーザーは、依然としてそのコピーにアクセスできます。", + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "アカウントを無効にしたときに送信したすべてのメッセージを忘れてください (警告:これにより、今後のユーザーは会話履歴の全文を見ることができなくなります)", + "To continue, please enter your password:": "続行するには、パスワードを入力してください:", + "password": "パスワード", + "To verify that this device can be trusted, please contact its owner using some other means (e.g. in person or a phone call) and ask them whether the key they see in their User Settings for this device matches the key below:": "この端末が信頼できることを確認するには、他の方法 (個人や電話など) で所有者に連絡し、端末のユーザー設定で表示される鍵が以下のキーと一致するかどうかを尋ねてください:", + "Device name": "端末名", + "Device key": "端末キー", + "If it matches, press the verify button below. If it doesn't, then someone else is intercepting this device and you probably want to press the blacklist button instead.": "一致する場合は下の確認ボタンを押し、そうでない場合は他の誰かがこのデバイスを傍受しているので、代わりにブラックリストボタンを押してください。", + "In future this verification process will be more sophisticated.": "将来この検証プロセスはより洗練されたものになるでしょう。", + "Verify device": "デバイスの検証", + "I verify that the keys match": "キーが一致することを確認します", + "An error has occurred.": "エラーが発生しました。", + "You added a new device '%(displayName)s', which is requesting encryption keys.": "暗号化キーを要求している新しい端末 '%(displayName)s' を追加しました。", + "Your unverified device '%(displayName)s' is requesting encryption keys.": "未確認の端末 '%(displayName)s' が暗号化キーを要求しています。", + "Start verification": "検証を開始する", + "Share without verifying": "検証せずに共有する", + "Ignore request": "要求を無視する", + "Loading device info...": "端末情報を読み込んでいます...", + "Encryption key request": "暗号化キー要求", + "You've previously used Riot on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, Riot needs to resync your account.": "以前 %(host)s にて、メンバーの遅延ロードを有効にしたRiotを使用していました。このバージョンでは、遅延ロードは無効です。ローカルキャッシュはこれらの2つの設定の間で互換性がないため、Riotはアカウントを再同期する必要があります。", + "If the other version of Riot is still open in another tab, please close it as using Riot on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "他のバージョンのRiotがまだ別のタブで開いている場合は、同じホスト上でRiotを使用するように閉じてください。遅延ロードが同時に有効と無効になっていると問題が発生します。", + "Incompatible local cache": "互換性のないローカルキャッシュ", + "Clear cache and resync": "キャッシュをクリアして再同期する", + "Riot now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "Riotは、必要に応じて他のユーザーに関する情報をロードするだけで、メモリの使用量を3〜5倍減らしました。サーバーと再同期するのを待ってください!", + "Updating Riot": "Riot更新中", + "Failed to upgrade room": "部屋をアップグレードできませんでした", + "The room upgrade could not be completed": "部屋のアップグレードを完了できませんでした", + "Upgrade this room to version %(version)s": "この部屋をバージョン %(version)s にアップグレードします", + "Upgrade Room Version": "アップグレードルームバージョン", + "Upgrading this room requires closing down the current instance of the room and creating a new room it its place. To give room members the best possible experience, we will:": "この部屋をアップグレードするには、現在の部屋のインスタンスを閉じて、新しい部屋を作成する必要があります。 部屋のメンバーに最高の体験を提供するため、私たちは以下を行います:", + "Create a new room with the same name, description and avatar": "同じ名前、説明、アバターで新しい部屋を作成する", + "Update any local room aliases to point to the new room": "新しいルームを指すようにローカルルームのエイリアスを更新する", + "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "古いバージョンの部屋でのユーザーの発言を停止し、新しい部屋に移動するようユーザーに通知するメッセージを投稿する" } From 975392cbbbd3d30fa07a571bd329cfe048e71d42 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Mon, 5 Nov 2018 11:25:42 +0100 Subject: [PATCH 36/85] Add visible guest warning to encourage login If you happen to get logged out, it might not be very clear what has happened visually. This adds a visible warning to the top of the home page to suggest logging in. Fixes vector-im/riot-web#7629. Signed-off-by: J. Ryan Stinnett --- res/css/structures/_HomePage.scss | 13 ++++++++ src/components/structures/HomePage.js | 44 +++++++++++++++++++++++++++ src/i18n/strings/en_EN.json | 2 ++ src/i18n/strings/en_US.json | 2 ++ 4 files changed, 61 insertions(+) diff --git a/res/css/structures/_HomePage.scss b/res/css/structures/_HomePage.scss index cdac1bcc8a..dc3158b39d 100644 --- a/res/css/structures/_HomePage.scss +++ b/res/css/structures/_HomePage.scss @@ -33,3 +33,16 @@ limitations under the License. .mx_HomePage_body { // margin-left: 63px; } + +.mx_HomePage_guest_warning { + display: flex; + background-color: $secondary-accent-color; + border: 1px solid $accent-color; + margin: 20px; + padding: 20px 40px; + border-radius: 5px; +} + +.mx_HomePage_guest_warning img { + padding-right: 10px; +} diff --git a/src/components/structures/HomePage.js b/src/components/structures/HomePage.js index 89053b35c7..01aabf6115 100644 --- a/src/components/structures/HomePage.js +++ b/src/components/structures/HomePage.js @@ -23,6 +23,8 @@ import request from 'browser-request'; import { _t } from '../../languageHandler'; import sanitizeHtml from 'sanitize-html'; import sdk from '../../index'; +import { MatrixClient } from 'matrix-js-sdk'; +import dis from '../../dispatcher'; class HomePage extends React.Component { static displayName = 'HomePage'; @@ -37,6 +39,10 @@ class HomePage extends React.Component { homePageUrl: PropTypes.string, }; + static contextTypes = { + matrixClient: PropTypes.instanceOf(MatrixClient), + }; + state = { iframeSrc: '', page: '', @@ -85,10 +91,47 @@ class HomePage extends React.Component { this._unmounted = true; } + onLoginClick() { + dis.dispatch({ action: 'start_login' }); + } + + onRegisterClick() { + dis.dispatch({ action: 'start_registration' }); + } + render() { + let guestWarning = ""; + if (this.context.matrixClient.isGuest()) { + guestWarning = ( +
+ +
+
+ { _t("You are currently using Riot anonymously as a guest.") } +
+
+ { _t( + 'If you would like to create a Matrix account you can register now.', + {}, + { 'a': (sub) => { sub } }, + ) } +
+
+ { _t( + 'If you already have a Matrix account you can log in instead.', + {}, + { 'a': (sub) => { sub } }, + ) } +
+
+
+ ); + } + if (this.state.iframeSrc) { return (
+ { guestWarning }