diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28b978c5..fb753d55 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,78 @@
+Changes in [0.11.4](https://github.com/vector-im/riot-web/releases/tag/v0.11.4) (2017-06-22)
+============================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.3...v0.11.4)
+
+ * Update matrix-js-sdk and react-sdk to fix a regression where the
+ background indexedb worker was disabled, failures to open indexeddb
+ causing the app to fail to start, a race when starting that could break
+ switching to rooms, and the inability to invite users with mixed case
+ usernames.
+
+Changes in [0.11.3](https://github.com/vector-im/riot-web/releases/tag/v0.11.3) (2017-06-20)
+============================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.2...v0.11.3)
+
+ * Update to matrix-react-sdk 0.9.6 to fix infinite spinner bugs
+ and some parts of the app that had missed translation.
+
+Changes in [0.11.2](https://github.com/vector-im/riot-web/releases/tag/v0.11.2) (2017-06-19)
+============================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.2-rc.2...v0.11.2)
+
+ * Add more languages and translations
+ * Add a 'register' button
+
+Changes in [0.11.2-rc.2](https://github.com/vector-im/riot-web/releases/tag/v0.11.2-rc.2) (2017-06-16)
+======================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.2-rc.1...v0.11.2-rc.2)
+
+ * Update react-sdk to pull in fixes for URL previews, CAS
+ login, h2 in markdown and CAPTCHA forms.
+ * Enable Korean translation
+ * Update from Weblate.
+ [\#4323](https://github.com/vector-im/riot-web/pull/4323)
+ * Fix h2 in markdown being weird
+ [\#4332](https://github.com/vector-im/riot-web/pull/4332)
+
+Changes in [0.11.2-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.11.2-rc.1) (2017-06-15)
+======================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.1...v0.11.2-rc.1)
+
+ * Attempts to deflakify the joining test
+ [\#4313](https://github.com/vector-im/riot-web/pull/4313)
+ * Add a test for the login flow when there is a teamserver
+ [\#4315](https://github.com/vector-im/riot-web/pull/4315)
+ * Remove onload simulator from loading test
+ [\#4314](https://github.com/vector-im/riot-web/pull/4314)
+ * Update from Weblate.
+ [\#4305](https://github.com/vector-im/riot-web/pull/4305)
+ * Test that we handle stored mx_last_room_id correctly
+ [\#4292](https://github.com/vector-im/riot-web/pull/4292)
+ * Ask for email address after setting password for the first time
+ [\#4301](https://github.com/vector-im/riot-web/pull/4301)
+ * i18n for setting email after password flow
+ [\#4299](https://github.com/vector-im/riot-web/pull/4299)
+ * Update from Weblate.
+ [\#4290](https://github.com/vector-im/riot-web/pull/4290)
+ * Don't show the tooltips when filtering rooms
+ [\#4282](https://github.com/vector-im/riot-web/pull/4282)
+ * Update from Weblate.
+ [\#4272](https://github.com/vector-im/riot-web/pull/4272)
+ * Add missing VOIP Dropdown width
+ [\#4266](https://github.com/vector-im/riot-web/pull/4266)
+ * Update import and directory path in the Translations dev guide
+ [\#4261](https://github.com/vector-im/riot-web/pull/4261)
+ * Use Thai string for Thai in Language-Chooser
+ [\#4260](https://github.com/vector-im/riot-web/pull/4260)
+
+Changes in [0.11.1](https://github.com/vector-im/riot-web/releases/tag/v0.11.1) (2017-06-14)
+============================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.0...v0.11.1)
+
+ * Update to react-sdk 0.9.4 to prompt to set an
+ email address when setting a password and make
+ DM guessing smarter.
+
Changes in [0.11.0](https://github.com/vector-im/riot-web/releases/tag/v0.11.0) (2017-06-12)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.11.0-rc.2...v0.11.0)
diff --git a/electron_app/package.json b/electron_app/package.json
index 0e08efd5..2c6e62f2 100644
--- a/electron_app/package.json
+++ b/electron_app/package.json
@@ -2,7 +2,7 @@
"name": "riot-web",
"productName": "Riot",
"main": "src/electron-main.js",
- "version": "0.11.0",
+ "version": "0.11.4",
"description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.",
"dependencies": {
diff --git a/electron_app/src/electron-main.js b/electron_app/src/electron-main.js
index 3491ce0f..99e14b74 100644
--- a/electron_app/src/electron-main.js
+++ b/electron_app/src/electron-main.js
@@ -29,6 +29,7 @@ const AutoLaunch = require('auto-launch');
const tray = require('./tray');
const vectorMenu = require('./vectormenu');
const webContentsHandler = require('./webcontents-handler');
+const updater = require('./updater');
const windowStateKeeper = require('electron-window-state');
@@ -46,69 +47,9 @@ try {
// Continue with the defaults (ie. an empty config)
}
-const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
-const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
-
let mainWindow = null;
-let appQuitting = false;
+global.appQuitting = false;
-function installUpdate() {
- // for some reason, quitAndInstall does not fire the
- // before-quit event, so we need to set the flag here.
- appQuitting = true;
- electron.autoUpdater.quitAndInstall();
-}
-
-function pollForUpdates() {
- try {
- electron.autoUpdater.checkForUpdates();
- } catch (e) {
- console.log('Couldn\'t check for update', e);
- }
-}
-
-function startAutoUpdate(updateBaseUrl) {
- if (updateBaseUrl.slice(-1) !== '/') {
- updateBaseUrl = updateBaseUrl + '/';
- }
- try {
- // For reasons best known to Squirrel, the way it checks for updates
- // is completely different between macOS and windows. On macOS, it
- // hits a URL that either gives it a 200 with some json or
- // 204 No Content. On windows it takes a base path and looks for
- // files under that path.
- if (process.platform === 'darwin') {
- // include the current version in the URL we hit. Electron doesn't add
- // it anywhere (apart from the User-Agent) so it's up to us. We could
- // (and previously did) just use the User-Agent, but this doesn't
- // rely on NSURLConnection setting the User-Agent to what we expect,
- // and also acts as a convenient cache-buster to ensure that when the
- // app updates it always gets a fresh value to avoid update-looping.
- electron.autoUpdater.setFeedURL(
- `${updateBaseUrl}macos/?localVersion=${encodeURIComponent(electron.app.getVersion())}`);
-
- } else if (process.platform === 'win32') {
- electron.autoUpdater.setFeedURL(`${updateBaseUrl}win32/${process.arch}/`);
- } else {
- // Squirrel / electron only supports auto-update on these two platforms.
- // I'm not even going to try to guess which feed style they'd use if they
- // implemented it on Linux, or if it would be different again.
- console.log('Auto update not supported on this platform');
- }
- // We check for updates ourselves rather than using 'updater' because we need to
- // do it in the main process (and we don't really need to check every 10 minutes:
- // every hour should be just fine for a desktop app)
- // However, we still let the main window listen for the update events.
- // We also wait a short time before checking for updates the first time because
- // of squirrel on windows and it taking a small amount of time to release a
- // lock file.
- setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
- setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
- } catch (err) {
- // will fail if running in debug mode
- console.log('Couldn\'t enable update checking', err);
- }
-}
// handle uncaught errors otherwise it displays
// stack traces in popup dialogs, which is terrible (which
@@ -120,8 +61,6 @@ process.on('uncaughtException', function(error) {
console.log('Unhandled exception', error);
});
-electron.ipcMain.on('install_update', installUpdate);
-
let focusHandlerAttached = false;
electron.ipcMain.on('setBadgeCount', function(ev, count) {
electron.app.setBadgeCount(count);
@@ -233,7 +172,7 @@ electron.app.on('ready', () => {
if (vectorConfig.update_base_url) {
console.log(`Starting auto update with base URL: ${vectorConfig.update_base_url}`);
- startAutoUpdate(vectorConfig.update_base_url);
+ updater.start(vectorConfig.update_base_url);
} else {
console.log('No update_base_url is defined: auto update is disabled');
}
@@ -246,7 +185,7 @@ electron.app.on('ready', () => {
defaultHeight: 768,
});
- mainWindow = new electron.BrowserWindow({
+ mainWindow = global.mainWindow = new electron.BrowserWindow({
icon: iconPath,
show: false,
autoHideMenuBar: true,
@@ -264,7 +203,7 @@ electron.app.on('ready', () => {
mainWindow.hide();
// Create trayIcon icon
- tray.create(mainWindow, {
+ tray.create({
icon_path: iconPath,
brand: vectorConfig.brand || 'Riot',
});
@@ -276,10 +215,10 @@ electron.app.on('ready', () => {
}
mainWindow.on('closed', () => {
- mainWindow = null;
+ mainWindow = global.mainWindow = null;
});
mainWindow.on('close', (e) => {
- if (!appQuitting && (tray.hasTray() || process.platform === 'darwin')) {
+ if (!global.appQuitting && (tray.hasTray() || process.platform === 'darwin')) {
// On Mac, closing the window just hides it
// (this is generally how single-window Mac apps
// behave, eg. Mail.app)
@@ -302,7 +241,10 @@ electron.app.on('activate', () => {
});
electron.app.on('before-quit', () => {
- appQuitting = true;
+ global.appQuitting = true;
+ if (mainWindow) {
+ mainWindow.webContents.send('before-quit');
+ }
});
// Set the App User Model ID to match what the squirrel
diff --git a/electron_app/src/tray.js b/electron_app/src/tray.js
index 039e7133..bd07d7d4 100644
--- a/electron_app/src/tray.js
+++ b/electron_app/src/tray.js
@@ -26,17 +26,17 @@ exports.hasTray = function hasTray() {
return (trayIcon !== null);
};
-exports.create = function(win, config) {
+exports.create = function(config) {
// no trays on darwin
if (process.platform === 'darwin' || trayIcon) return;
const toggleWin = function() {
- if (win.isVisible() && !win.isMinimized()) {
- win.hide();
+ if (global.mainWindow.isVisible() && !global.mainWindow.isMinimized()) {
+ global.mainWindow.hide();
} else {
- if (win.isMinimized()) win.restore();
- if (!win.isVisible()) win.show();
- win.focus();
+ if (global.mainWindow.isMinimized()) global.mainWindow.restore();
+ if (!global.mainWindow.isVisible()) global.mainWindow.show();
+ global.mainWindow.focus();
}
};
@@ -54,41 +54,46 @@ exports.create = function(win, config) {
},
]);
- trayIcon = new Tray(config.icon_path);
+ const defaultIcon = nativeImage.createFromPath(config.icon_path);
+
+ trayIcon = new Tray(defaultIcon);
trayIcon.setToolTip(config.brand);
trayIcon.setContextMenu(contextMenu);
trayIcon.on('click', toggleWin);
let lastFavicon = null;
- win.webContents.on('page-favicon-updated', async function(ev, favicons) {
- let newFavicon = config.icon_path;
- if (favicons && favicons.length > 0 && favicons[0].startsWith('data:')) {
- newFavicon = favicons[0];
+ global.mainWindow.webContents.on('page-favicon-updated', async function(ev, favicons) {
+ if (!favicons || favicons.length <= 0 || !favicons[0].startsWith('data:')) {
+ if (lastFavicon !== null) {
+ win.setIcon(defaultIcon);
+ trayIcon.setImage(defaultIcon);
+ lastFavicon = null;
+ }
+ return;
}
// No need to change, shortcut
- if (newFavicon === lastFavicon) return;
- lastFavicon = newFavicon;
+ if (favicons[0] === lastFavicon) return;
+ lastFavicon = favicons[0];
- // if its not default we have to construct into nativeImage
- if (newFavicon !== config.icon_path) {
- newFavicon = nativeImage.createFromDataURL(favicons[0]);
+ let newFavicon = nativeImage.createFromDataURL(favicons[0]);
- if (process.platform === 'win32') {
- try {
- const icoPath = path.join(app.getPath('temp'), 'win32_riot_icon.ico')
- const icoBuf = await pngToIco(newFavicon.toPNG());
- fs.writeFileSync(icoPath, icoBuf);
- newFavicon = icoPath;
- } catch (e) {console.error(e);}
+ // Windows likes ico's too much.
+ if (process.platform === 'win32') {
+ try {
+ const icoPath = path.join(app.getPath('temp'), 'win32_riot_icon.ico');
+ fs.writeFileSync(icoPath, await pngToIco(newFavicon.toPNG()));
+ newFavicon = nativeImage.createFromPath(icoPath);
+ } catch (e) {
+ console.error("Failed to make win32 ico", e);
}
}
trayIcon.setImage(newFavicon);
- win.setIcon(newFavicon);
+ global.mainWindow.setIcon(newFavicon);
});
- win.webContents.on('page-title-updated', function(ev, title) {
+ global.mainWindow.webContents.on('page-title-updated', function(ev, title) {
trayIcon.setToolTip(title);
});
};
diff --git a/electron_app/src/updater.js b/electron_app/src/updater.js
new file mode 100644
index 00000000..49fa4e04
--- /dev/null
+++ b/electron_app/src/updater.js
@@ -0,0 +1,84 @@
+const { app, autoUpdater, ipcMain } = require('electron');
+
+const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
+const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
+
+function installUpdate() {
+ // for some reason, quitAndInstall does not fire the
+ // before-quit event, so we need to set the flag here.
+ global.appQuitting = true;
+ autoUpdater.quitAndInstall();
+}
+
+function pollForUpdates() {
+ try {
+ autoUpdater.checkForUpdates();
+ } catch (e) {
+ console.log('Couldn\'t check for update', e);
+ }
+}
+
+module.exports = {};
+module.exports.start = function startAutoUpdate(updateBaseUrl) {
+ if (updateBaseUrl.slice(-1) !== '/') {
+ updateBaseUrl = updateBaseUrl + '/';
+ }
+ try {
+ let url;
+ // For reasons best known to Squirrel, the way it checks for updates
+ // is completely different between macOS and windows. On macOS, it
+ // hits a URL that either gives it a 200 with some json or
+ // 204 No Content. On windows it takes a base path and looks for
+ // files under that path.
+ if (process.platform === 'darwin') {
+ // include the current version in the URL we hit. Electron doesn't add
+ // it anywhere (apart from the User-Agent) so it's up to us. We could
+ // (and previously did) just use the User-Agent, but this doesn't
+ // rely on NSURLConnection setting the User-Agent to what we expect,
+ // and also acts as a convenient cache-buster to ensure that when the
+ // app updates it always gets a fresh value to avoid update-looping.
+ url = `${updateBaseUrl}macos/?localVersion=${encodeURIComponent(app.getVersion())}`;
+
+ } else if (process.platform === 'win32') {
+ url = `${updateBaseUrl}win32/${process.arch}/`;
+ } else {
+ // Squirrel / electron only supports auto-update on these two platforms.
+ // I'm not even going to try to guess which feed style they'd use if they
+ // implemented it on Linux, or if it would be different again.
+ console.log('Auto update not supported on this platform');
+ }
+
+ if (url) {
+ autoUpdater.setFeedURL(url);
+ // We check for updates ourselves rather than using 'updater' because we need to
+ // do it in the main process (and we don't really need to check every 10 minutes:
+ // every hour should be just fine for a desktop app)
+ // However, we still let the main window listen for the update events.
+ // We also wait a short time before checking for updates the first time because
+ // of squirrel on windows and it taking a small amount of time to release a
+ // lock file.
+ setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
+ setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
+ }
+ } catch (err) {
+ // will fail if running in debug mode
+ console.log('Couldn\'t enable update checking', err);
+ }
+}
+
+ipcMain.on('install_update', installUpdate);
+ipcMain.on('check_updates', pollForUpdates);
+
+function ipcChannelSendUpdateStatus(status) {
+ if (global.mainWindow) {
+ global.mainWindow.webContents.send('check_updates', status);
+ }
+}
+
+autoUpdater.on('update-available', function() {
+ ipcChannelSendUpdateStatus(true);
+}).on('update-not-available', function() {
+ ipcChannelSendUpdateStatus(false);
+}).on('error', function(error) {
+ ipcChannelSendUpdateStatus(error.message);
+});
diff --git a/package.json b/package.json
index 51c366b1..f5129006 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "riot-web",
"productName": "Riot",
"main": "electron_app/src/electron-main.js",
- "version": "0.11.0",
+ "version": "0.11.4",
"description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.",
"repository": {
@@ -65,8 +65,8 @@
"gfm.css": "^1.1.1",
"highlight.js": "^9.0.0",
"linkifyjs": "^2.1.3",
- "matrix-js-sdk": "0.7.11",
- "matrix-react-sdk": "0.9.3",
+ "matrix-js-sdk": "0.7.13",
+ "matrix-react-sdk": "0.9.7",
"modernizr": "^3.1.0",
"pako": "^1.0.5",
"q": "^1.4.1",
diff --git a/res/home/rooms/riot-ios.png b/res/home/rooms/riot-ios.png
index 83306f7c..6a0c598f 100644
Binary files a/res/home/rooms/riot-ios.png and b/res/home/rooms/riot-ios.png differ
diff --git a/res/home/rooms/riot-translations.png b/res/home/rooms/riot-translations.png
index ee0f8558..2ae95836 100644
Binary files a/res/home/rooms/riot-translations.png and b/res/home/rooms/riot-translations.png differ
diff --git a/scripts/copy-res.js b/scripts/copy-res.js
index b02946ae..e8f6684d 100755
--- a/scripts/copy-res.js
+++ b/scripts/copy-res.js
@@ -13,15 +13,21 @@ const INCLUDE_LANGS = [
{'value': 'en_US', 'label': 'English (US)'},
{'value': 'da', 'label': 'Dansk'},
{'value': 'el', 'label': 'Ελληνικά'},
+ {'value': 'eo', 'label': 'Esperanto'},
{'value': 'nl', 'label': 'Nederlands'},
{'value': 'de_DE', 'label': 'Deutsch'},
{'value': 'fr', 'label': 'Français'},
+ {'value': 'hu', 'label': 'Magyar'},
+ {'value': 'ko', 'label': '한국어'},
+ {'value': 'nb_NO', 'label': 'Norwegian Bokmål'},
+ {'value': 'pl', 'label': 'Polski'},
{'value': 'pt', 'label': 'Português'},
{'value': 'pt_BR', 'label': 'Português do Brasil'},
{'value': 'ru', 'label': 'Русский'},
{'value': 'sv', 'label': 'Svenska'},
{'value': 'es', 'label': 'Español'},
{'value': 'th', 'label': 'ไทย'},
+ {'value': 'tr', 'label': 'Türk'},
{'value': 'zh_Hans', 'label': '简体中文'}, // simplified chinese
{'value': 'zh_Hant', 'label': '繁體中文'}, // traditional chinese
];
diff --git a/src/components/structures/HomePage.js b/src/components/structures/HomePage.js
index e1e700f2..2311cc1f 100644
--- a/src/components/structures/HomePage.js
+++ b/src/components/structures/HomePage.js
@@ -46,8 +46,8 @@ module.exports = React.createClass({
translate: function(s) {
s = sanitizeHtml(_t(s));
// ugly fix for https://github.com/vector-im/riot-web/issues/4243
- s = s.replace(/Riot\.im/, 'Riot.im');
- s = s.replace(/\[matrix\]/, '');
+ s = s.replace(/Riot\.im/, 'Riot.im');
+ s = s.replace(/\[matrix\]/, '');
return s;
},
diff --git a/src/components/structures/LoginBox.js b/src/components/structures/LoginBox.js
index 445585a7..c9f8e87a 100644
--- a/src/components/structures/LoginBox.js
+++ b/src/components/structures/LoginBox.js
@@ -47,6 +47,10 @@ module.exports = React.createClass({
dis.dispatch({ action: 'start_login' });
},
+ onRegisterClick: function() {
+ dis.dispatch({ action: 'start_registration' });
+ },
+
render: function() {
var TintableSvg = sdk.getComponent('elements.TintableSvg');
@@ -71,6 +75,9 @@ module.exports = React.createClass({
{ _t("Login") }
+
+ { _t("Register") }
+
);
}
diff --git a/src/components/structures/RoomSubList.js b/src/components/structures/RoomSubList.js
index 2740c6a4..092ed9cc 100644
--- a/src/components/structures/RoomSubList.js
+++ b/src/components/structures/RoomSubList.js
@@ -530,7 +530,7 @@ var RoomSubList = React.createClass({
var label = this.props.collapsed ? null : this.props.label;
let content;
- if (this.state.sortedList.length == 0) {
+ if (this.state.sortedList.length == 0 && !this.props.searchFilter) {
content = this.props.emptyContent;
} else {
content = this.makeRoomTiles();
diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js
index e3f4d140..bc82778a 100644
--- a/src/components/views/context_menus/MessageContextMenu.js
+++ b/src/components/views/context_menus/MessageContextMenu.js
@@ -117,7 +117,7 @@ module.exports = React.createClass({
onForwardClick: function() {
dis.dispatch({
action: 'forward_event',
- content: this.props.mxEvent,
+ event: this.props.mxEvent,
});
this.closeMenu();
},
diff --git a/src/components/views/dialogs/SetPasswordDialog.js b/src/components/views/dialogs/SetPasswordDialog.js
index 47e13a17..b82d0346 100644
--- a/src/components/views/dialogs/SetPasswordDialog.js
+++ b/src/components/views/dialogs/SetPasswordDialog.js
@@ -17,7 +17,42 @@ limitations under the License.
import React from 'react';
import sdk from 'matrix-react-sdk';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
+import Modal from 'matrix-react-sdk/lib/Modal';
+const WarmFuzzy = function(props) {
+ const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
+ let title = _t('You have successfully set a password!');
+ if (props.didSetEmail) {
+ title = _t('You have successfully set a password and an email address!');
+ }
+ const advice = _t('You can now return to your account after signing out, and sign in on other devices.');
+ let extraAdvice = null;
+ if (!props.didSetEmail) {
+ extraAdvice = _t('Remember, you can always set an email address in user settings if you change your mind.');
+ }
+
+ return
+
- To return to your account in future you need to set a password
+ { _tJsx(
+ "To return to your account in future you need to set a password",
+ /(.*?)<\/u>/,
+ (sub) => { return { sub }; },
+ ) }
);
- }
+ },
});
diff --git a/src/components/views/globals/UpdateCheckBar.js b/src/components/views/globals/UpdateCheckBar.js
new file mode 100644
index 00000000..926ccbcc
--- /dev/null
+++ b/src/components/views/globals/UpdateCheckBar.js
@@ -0,0 +1,85 @@
+/*
+Copyright 2017 Michael Telatynski <7t3chguy@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+import React from 'react';
+import { _t } from 'matrix-react-sdk/lib/languageHandler';
+import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
+import {updateCheckStatusEnum} from '../../../vector/platform/VectorBasePlatform';
+import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton';
+
+const doneStatuses = [
+ updateCheckStatusEnum.ERROR,
+ updateCheckStatusEnum.NOTAVAILABLE,
+];
+
+export default React.createClass({
+ propTypes: {
+ status: React.PropTypes.oneOf(Object.values(updateCheckStatusEnum)).isRequired,
+ // Currently for error detail but will be usable for download progress
+ // once that is a thing that squirrel passes through electron.
+ detail: React.PropTypes.string,
+ },
+
+ getDefaultProps: function() {
+ return {
+ detail: '',
+ }
+ },
+
+ getStatusText: function() {
+ switch(this.props.status) {
+ case updateCheckStatusEnum.ERROR:
+ return _t('Error encountered (%(errorDetail)s).', { errorDetail: this.props.detail });
+ case updateCheckStatusEnum.CHECKING:
+ return _t('Checking for an update...');
+ case updateCheckStatusEnum.NOTAVAILABLE:
+ return _t('No update available.');
+ case updateCheckStatusEnum.DOWNLOADING:
+ return _t('Downloading update...');
+ }
+ }
+ ,
+
+ hideToolbar: function() {
+ PlatformPeg.get().stopUpdateCheck();
+ },
+
+ render: function() {
+ const message = this.getStatusText();
+ const warning = _t('Warning');
+
+ let image;
+ if (doneStatuses.includes(this.props.status)) {
+ image = ;
+ } else {
+ image = ;
+ }
+
+ return (
+
);
}
});
diff --git a/src/i18n/strings/bn_BD.json b/src/i18n/strings/bn_BD.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/src/i18n/strings/bn_BD.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/bn_IN.json b/src/i18n/strings/bn_IN.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/src/i18n/strings/bn_IN.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json
index dfd84ecb..806cf9bf 100644
--- a/src/i18n/strings/de_DE.json
+++ b/src/i18n/strings/de_DE.json
@@ -51,7 +51,7 @@
"Failed to set Direct Message status of room": "Konnte den direkten Benachrichtigungsstatus nicht setzen",
"Favourite": "Favorit",
"Fetching third party location failed": "Das Abrufen des Drittanbieterstandorts ist fehlgeschlagen",
- "Forget": "Lösche",
+ "Forget": "Entfernen",
"from the directory": "aus dem Verzeichnis",
" from room": " aus dem Raum",
"Keywords": "Schlüsselwörter",
@@ -75,7 +75,7 @@
"Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten",
"unknown error code": "Unbekannter Fehlercode",
"Unnamed room": "Unbenannter Raum",
- "Notify me for anything else": "Benachrichtige mich für alles andere",
+ "Notify me for anything else": "Über alles andere benachrichtigen",
"Off": "Aus",
"On": "An",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Client als Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem",
@@ -86,23 +86,23 @@
"Cancel Sending": "Senden abbrechen",
"Close": "Schließen",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Soll der Raum-Alias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?",
- "Download this file": "Diese Datei herunterladen",
+ "Download this file": "Datei herunterladen",
"Failed to add tag %(tagName)s to room": "Das Hinzufügen des Tags %(tagName)s für den Raum ist fehlgeschlagen",
- "Failed to forget room %(errCode)s": "Das Entfernen des Raums %(errCode)s aus deiner Liste ist fehlgeschlagen",
+ "Failed to forget room %(errCode)s": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s",
"Failed to remove tag %(tagName)s from room": "Das Entfernen des Tags %(tagName)s für den Raum ist fehlgeschlagen",
"Failed to set direct chat tag": "Fehler beim Setzen der \"Direkter Chat\"-Kennzeichnung",
"Mentions only": "Nur, wenn du erwähnt wirst",
"Mute": "Stummschalten",
"Permalink": "Permanenter Link",
"Quote": "Zitat",
- "Redact": "Redaktionell entfernen",
+ "Redact": "Löschen",
"Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?",
"remove %(name)s from the directory.": "entferne %(name)s aus dem Verzeichnis.",
"Resend": "Erneut senden",
"Source URL": "Quell-URL",
"Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen",
"Unhide Preview": "Vorschau wieder anzeigen",
- "Uploaded on %(date)s by %(user)s": "Hochgeladen am %(date)s durch %(user)s",
+ "Uploaded on %(date)s by %(user)s": "Hochgeladen am %(date)s von %(user)s",
"View Decrypted Source": "Entschlüsselten Quellcode ansehen",
"View Source": "Quellcode ansehen",
"You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)",
@@ -165,7 +165,7 @@
"Uploading report": "Lade Bericht hoch",
"What's New": "Was ist neu",
"What's new?": "Was ist neu?",
- "Waiting for response from server": "Warte auf eine Antwort vom Server",
+ "Waiting for response from server": "Auf Antwort vom Server warten",
"You are Rioting as a guest. Register or sign in to access more rooms and features!": "Du verwendest Riot als Gast. Registriere oder melde dich an um Zugang zu mehr Räumen und Funktionen zu bekommen!",
"You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen um einen Anruf mit Bildschirmfreigabe durchzuführen.",
"OK": "OK",
@@ -205,5 +205,9 @@
"This will allow you to return to your account after signing out, and sign in on other devices.": "Dies erlaubt dir, dich wieder an deinem Konto anzumelden, nachdem du dich abgemeldet hast.",
"Dev chat for the Dendrite dev team": "Entwickler-Chat für das Dendrite-Entwickler-Team",
"General discussion about Matrix and Riot": "Allgemeine Diskussion über Matrix und Riot",
- " (HTTP status %(httpStatus))": "(HTTP Status %(httpStatus))"
+ "(HTTP status %(httpStatus)s)": "(HTTP-Status %(httpStatus)s)",
+ "You have successfully set a password and an email address!": "Du hast erfolgreich ein Passwort und eine E-Mail-Adresse gesetzt!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Denk daran, dass du in den Benutzereinstellungen jederzeit eine E-Mail-Adresse setzen kannst.",
+ "To return to your account in future you need to set a password": "Um in Zukunft zu deinem Konto zurückkehren zu können, musst du ein Passwort setzen",
+ "Set Password": "Setze ein Passwort"
}
diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json
index cbb2a819..bb34a8e4 100644
--- a/src/i18n/strings/el.json
+++ b/src/i18n/strings/el.json
@@ -20,8 +20,8 @@
"Download this file": "Λήψη αρχείου",
"Enable audible notifications in web client": "Ενεργοποίηση ηχητικών ειδοποιήσεων",
"Enable email notifications": "Ενεργοποίηση ειδοποιήσεων μέσω μηνυμάτων ηλ. αλληλογραφίας",
- "Enable notifications for this account": "Ενεργοποίηση ειδοποιήσεων γι' αυτό το λογαριασμό",
- "Enter keywords separated by a comma:": "Πρόσθεσε λέξεις κλειδιά χωρισμένες με κόμμα:",
+ "Enable notifications for this account": "Ενεργοποίηση ειδοποιήσεων για τον λογαριασμό",
+ "Enter keywords separated by a comma:": "Προσθέστε λέξεις κλειδιά χωρισμένες με κόμμα:",
"Error": "Σφάλμα",
"#example": "#παράδειγμα",
"Expand panel": "Μεγιστοποίηση καρτέλας",
@@ -31,7 +31,7 @@
"customServer_text": "Μπορείτε να χρησιμοποιήσετε τις προσαρμοσμένες ρυθμίσεις για να εισέλθετε σε άλλους διακομιστές Matrix επιλέγοντας μια διαφορετική διεύθυνση για το διακομιστή. Αυτό σας επιτρέπει να χρησιμοποιήσετε την εφαρμογή Riot με έναν υπάρχοντα λογαριασμό σε διαφορετικό διακομιστή.
Επίσης μπορείτε να επιλέξετε ένα διαφορετικό διακομιστή ταυτότητας αλλά δεν θα έχετε τη δυνατότητα να προσκαλέσετε άλλους χρήστες ή να σας προσκαλέσουν μέσω μηνυμάτων ηλεκτρονικής αλληλογραφίας.",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s μέσω %(browserName)s σε %(osName)s",
"All messages (loud)": "Όλα τα μηνύματα (δυνατά)",
- "delete the alias.": "διαγραφή ψευδώνυμου.",
+ "delete the alias.": "διέγραψε το ψευδώνυμο.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Διαγραφή του ψευδώνυμου %(alias)s και αφαίρεση του %(name)s από το ευρετήριο;",
"Dismiss": "Απόρριψη",
"Failed to add tag %(tagName)s to room": "Δεν ήταν δυνατή η προσθήκη της ετικέτας %(tagName)s στο δωμάτιο",
@@ -39,7 +39,7 @@
"Failed to join the room": "Δεν ήταν δυνατή η σύνδεση στο δωμάτιο",
"Favourite": "Αγαπημένο",
"Files": "Αρχεία",
- "Filter room names": "Φίλτραρε τα δωμάτια",
+ "Filter room names": "Φιλτράρισμα δωματίων",
"Forward Message": "Προώθηση",
" from room": " από το δωμάτιο",
"Guests can join": "Επισκέπτες μπορούν να συνδεθούν",
@@ -86,7 +86,7 @@
"Update": "Ενημέρωση",
"Enable desktop notifications": "Ενεργοποίηση ειδοποιήσεων στην επιφάνεια εργασίας",
"Error saving email notification preferences": "Σφάλμα κατά την αποθήκευση των προτιμήσεων",
- "Failed to send report: ": "Απέτυχε η αποστολή της αναφοράς: ",
+ "Failed to send report: ": "Δεν ήταν δυνατή η αποστολή της αναφοράς: ",
"Loading bug report module": "Φόρτωση μονάδας αναφοράς σφαλμάτων",
"Mentions only": "Μόνο αναφορές",
"Messages containing my display name": "Μηνύματα που περιέχουν το όνομα μου",
@@ -149,14 +149,14 @@
"View Source": "Προβολή κώδικα",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Ισως να έχετε κάνει τις ρυθμίσεις σε άλλη εφαρμογή εκτός του Riot. Δεν μπορείτε να τις αλλάξετε μέσω του Riot αλλά ισχύουν κανονικά",
"Couldn't find a matching Matrix room": "Δεν βρέθηκε κάποιο δωμάτιο",
- "Drop here %(toAction)s": "Απόθεση εδώ %(toAction)s",
- "Failed to": "Αποτυχία να",
+ "Drop here %(toAction)s": "Αποθέστε εδώ %(toAction)s",
+ "Failed to": "Απέτυχε να",
"Failed to get public room list": "Δεν ήταν δυνατή η λήψη της λίστας με τα δημόσια δωμάτια",
"Failed to set direct chat tag": "Δεν ήταν δυνατός ο χαρακτηρισμός της συνομιλίας ως 1-προς-1",
"powered by Matrix": "βασισμένο στο πρωτόκολλο Matrix",
"Quote": "Παράθεση",
"Fetching third party location failed": "Η λήψη τοποθεσίας απέτυχε",
- " (HTTP status %(httpStatus))": "(Κατάσταση HTTP %(httpStatus))",
+ "(HTTP status %(httpStatus)s)": "(Κατάσταση HTTP %(httpStatus)s)",
"Login": "Σύνδεση",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Το Riot χρησιμοποιεί αρκετά προχωρημένα χαρακτηριστικά των περιηγητών Ιστού, ορισμένα από τα οποία δεν είναι διαθέσιμα ή είναι σε πειραματικό στάδιο στον περιηγητή σας.",
"The Home Server may be too old to support third party networks": "Ο διακομιστής μπορεί να είναι αρκετά παλιός για να υποστηρίζει δίκτυα τρίτων",
@@ -167,11 +167,11 @@
"Get started with some tips from Riot Bot!": "Ξεκινήστε με μερικές συμβουλές από το Riot Bot!",
"General discussion about Matrix and Riot": "Γενική συζήτηση σχετικά με Matrix και Riot",
"Discussion of all things Matrix!": "Συζήτηση για όλα τα πράγματα του Matrix!",
- "Riot/Web & Desktop chat": "Συνομιλία για Riot/Web & Desktop",
- "Riot/iOS & matrix-ios-sdk chat": "Συνομιλία για Riot/iOS & matrix-ios-sdk",
- "Riot/Android & matrix-android-sdk chat": "Συνομιλία για Riot/Android & matrix-android-sdk",
+ "Riot/Web & Desktop chat": "Συζήτηση για το Riot/Web & Desktop",
+ "Riot/iOS & matrix-ios-sdk chat": "Συζήτηση για το Riot/iOS & matrix-ios-sdk",
+ "Riot/Android & matrix-android-sdk chat": "Συζήτηση για το Riot/Android & matrix-android-sdk",
"Matrix technical discussions": "Τεχνικές συζητήσεις σχετικά με το Matrix",
- "Running Matrix services": "Εκτέλεση υπηρεσιών Matrix",
+ "Running Matrix services": "Χρησιμοποιώντας τις υπηρεσίες του Matrix",
"Community-run support for Synapse": "Κοινοτική υποστήριξη για το Synapse",
"Admin support for Dendrite": "Υποστήριξη διαχειριστή για το Dendrite",
"Announcements about Synapse releases": "Ανακοινώσεις σχετικά με τις εκδόσεις του Synapse",
@@ -183,8 +183,8 @@
"Implementing VoIP services with Matrix": "Υλοποίηση υπηρεσίων VoIP με το Matrix",
"Discussion of the Identity Service API": "Συζήτηση σχετικά με το Identity Service API",
"Contributing code to Matrix and Riot": "Συνεισφορά κώδικα στο Matrix και Riot",
- "Dev chat for the Riot/Web dev team": "Συνομιλία για την ομάδα ανάπτυξης του Riot/Web",
- "Dev chat for the Dendrite dev team": "Συνομιλία για την ομάδα ανάπτυξης του Dendrite",
+ "Dev chat for the Riot/Web dev team": "Συζήτηση με την ομάδα ανάπτυξης του Riot/Web",
+ "Dev chat for the Dendrite dev team": "Συζήτηση με την ομάδα ανάπτυξης του Dendrite",
"Co-ordination for Riot/Web translators": "Συντονισμός για μεταφραστές του Riot/Web",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Αρκετά δωμάτια υπάρχουν ήδη στο Matrix, συνδεδεμένα σε υπάρχοντα δίκτυα (Slack, IRC, Gitter κ.λπ) ή αυτόνομα. Ρίξτε μια ματιά στο ευρετήριο!",
"Failed to change password. Is your password correct?": "Δεν ήταν δυνατή η αλλαγή του κωδικού πρόσβασης. Είναι σωστός ο κωδικός πρόσβασης;",
@@ -196,5 +196,9 @@
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Προκειμένου να διαγνωστούν προβλήματα, τα αρχεία καταγραφής από αυτόν τον πελάτη θα σταλούν με αυτήν την αναφορά σφάλματος. Αν προτιμάτε να στείλετε μόνο το παραπάνω κείμενο, απενεργοποιήστε:",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Με τον τρέχον περιηγητή, η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι εντελώς εσφαλμένη και ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν. Εάν θέλετε να το δοκιμάσετε ούτως ή άλλως μπορείτε να συνεχίσετε, αλλά είστε μόνοι σας σε ό, τι αφορά τα προβλήματα που μπορεί να αντιμετωπίσετε!",
"Failed to set Direct Message status of room": "Δεν ήταν δυνατός ο ορισμός της κατάστασης Direct Message του δωματίου",
- "Support for those using, running and writing other bridges": "Υποστήριξη ηια τους χρήστες που χρησιμοποιούν ή αναπτύσσουν εφαρμογές ενσωμάτωσης για το Matrix"
+ "Support for those using, running and writing other bridges": "Υποστήριξη για τους χρήστες που χρησιμοποιούν ή αναπτύσσουν εφαρμογές ενσωμάτωσης για το Matrix",
+ "You have successfully set a password and an email address!": "Ο κωδικός πρόσβασης και η διεύθυνση ηλεκτρονικής αλληλογραφίας ορίστηκαν επιτυχώς!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Να θυμάστε ότι μπορείτε πάντα να ορίσετε μια διεύθυνση ηλεκτρονικής αλληλογραφίας στις ρυθμίσεις χρήστη αν αλλάξετε γνώμη.",
+ "To return to your account in future you need to set a password": "Για να επιστρέψετε στον λογαριασμό σας μελλοντικα πρέπει να ορίσετε έναν κωδικό πρόσβασης",
+ "Set Password": "Ορισμός κωδικού πρόσβασης"
}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index cb50de95..10c21a62 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -62,7 +62,7 @@
"Guests can join": "Guests can join",
"Guest users can't invite users. Please register to invite.": "Guest users can't invite users. Please register to invite.",
"Hide panel": "Hide panel",
- " (HTTP status %(httpStatus))": "(HTTP status %(httpStatus))",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
"I understand the risks and wish to continue": "I understand the risks and wish to continue",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:",
"Invite to this room": "Invite to this room",
@@ -98,7 +98,6 @@
"Please Register": "Please Register",
"powered by Matrix": "powered by Matrix",
"Quote": "Quote",
- "Redact": "Redact",
"Reject": "Reject",
"Remove %(name)s from the directory?": "Remove %(name)s from the directory?",
"Remove": "Remove",
@@ -160,6 +159,11 @@
"Today": "Today",
"Yesterday": "Yesterday",
"OK": "OK",
+ "Warning": "Warning",
+ "Checking for an update...": "Checking for an update...",
+ "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).",
+ "No update available.": "No update available.",
+ "Downloading update...": "Downloading update...",
"You need to be using HTTPS to place a screen-sharing call.": "You need to be using HTTPS to place a screen-sharing call.",
"Welcome page": "Welcome page",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!",
@@ -196,5 +200,9 @@
"You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.",
"Continue": "Continue",
"Please set a password!": "Please set a password!",
- "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices."
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.",
+ "You have successfully set a password and an email address!": "You have successfully set a password and an email address!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind.",
+ "To return to your account in future you need to set a password": "To return to your account in future you need to set a password",
+ "Set Password": "Set Password"
}
diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json
index 85008865..29e089ef 100644
--- a/src/i18n/strings/en_US.json
+++ b/src/i18n/strings/en_US.json
@@ -96,7 +96,6 @@
"Please Register": "Please Register",
"powered by Matrix": "powered by Matrix",
"Quote": "Quote",
- "Redact": "Redact",
"Reject": "Reject",
"Remove %(name)s from the directory?": "Remove %(name)s from the directory?",
"Remove": "Remove",
@@ -164,8 +163,39 @@
"Login": "Login",
"Continue": "Continue",
"Failed to change password. Is your password correct?": "Failed to change password. Is your password correct?",
- " (HTTP status %(httpStatus))": "(HTTP status %(httpStatus))",
+ "(HTTP status %(httpStatus)s)": "(HTTP status %(httpStatus)s)",
"Welcome to Riot.im": "Welcome to Riot.im",
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Decentralised, encrypted chat & collaboration powered by [matrix]",
- "Chat with Riot Bot": "Chat with Riot Bot"
+ "Chat with Riot Bot": "Chat with Riot Bot",
+ "Search the room directory": "Search the room directory",
+ "Get started with some tips from Riot Bot!": "Get started with some tips from Riot Bot!",
+ "General discussion about Matrix and Riot": "General discussion about Matrix and Riot",
+ "Discussion of all things Matrix!": "Discussion of all things Matrix!",
+ "Matrix technical discussions": "Matrix technical discussions",
+ "Running Matrix services": "Running Matrix services",
+ "Community-run support for Synapse": "Community-run support for Synapse",
+ "Admin support for Dendrite": "Admin support for Dendrite",
+ "Announcements about Synapse releases": "Announcements about Synapse releases",
+ "Support for those using and running matrix-appservice-irc": "Support for those using and running matrix-appservice-irc",
+ "Building services on Matrix": "Building services on Matrix",
+ "Support for those using the Matrix spec": "Support for those using the Matrix spec",
+ "Design and implementation of E2E in Matrix": "Design and implementation of E2E in Matrix",
+ "Implementing VR services with Matrix": "Implementing VR services with Matrix",
+ "Implementing VoIP services with Matrix": "Implementing VoIP services with Matrix",
+ "Discussion of the Identity Service API": "Discussion of the Identity Service API",
+ "Support for those using, running and writing other bridges": "Support for those using, running and writing other bridges",
+ "Contributing code to Matrix and Riot": "Contributing code to Matrix and Riot",
+ "Dev chat for the Riot/Web dev team": "Dev chat for the Riot/Web dev team",
+ "Dev chat for the Dendrite dev team": "Dev chat for the Dendrite dev team",
+ "Co-ordination for Riot/Web translators": "Co-ordination for Riot/Web translators",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!",
+ "You have successfully set a password!": "You have successfully set a password!",
+ "You can now return to your account after signing out, and sign in on other devices.": "You can now return to your account after signing out, and sign in on other devices.",
+ "Please set a password!": "Please set a password!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "This will allow you to return to your account after signing out, and sign in on other devices.",
+ "Riot/Android & matrix-android-sdk chat": "Riot/Android & matrix-android-sdk chat",
+ "Riot/Web & Desktop chat": "Riot/Web & Desktop chat",
+ "Riot/iOS & matrix-ios-sdk chat": "Riot/iOS & matrix-ios-sdk chat",
+ "You have successfully set a password and an email address!": "You have successfully set a password and an email address!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Remember, you can always set an email address in user settings if you change your mind."
}
diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json
index 9e26dfee..a7baa043 100644
--- a/src/i18n/strings/eo.json
+++ b/src/i18n/strings/eo.json
@@ -1 +1,202 @@
-{}
\ No newline at end of file
+{
+ "A new version of Riot is available.": "Nova versio de \"Riot\" haveblas.",
+ "All messages": "Ĉiuj mesaĝoj",
+ "All messages (loud)": "Ĉiuj mesaĝoj (lauta)",
+ "All Rooms": "Ĉiuj babilejoj",
+ "Cancel": "Nuligi",
+ "Create new room": "Krei novan babilejon",
+ "delete the alias.": "Forviŝi la kromnomon.",
+ "Describe your problem here.": "Priskribi vian problemon ĉi tie.",
+ "Direct Chat": "Rekta babilejo",
+ "Directory": "Dosierujo",
+ "Dismiss": "Eksigu",
+ "Download this file": "Elŝutu ĉi-tiun dosieron",
+ "#example": "#ekzemplo",
+ "Files": "Dosieroj",
+ "Forget": "Forgesi",
+ " from room": " el babilejo",
+ "Guests can join": "Gastoj povas aliĝi",
+ "Guest users can't invite users. Please register to invite.": "Gasta uzantoj ne povas inviti uzantojn. Bonvolu registri por inviti.",
+ "I understand the risks and wish to continue": "Mi komprenas la riskonj kaj volas daŭrigi",
+ "Invite to this room": "Inviti en ĉi tiun babilejon",
+ "Keywords": "Ŝlosilvortoj",
+ "Leave": "Foriri",
+ "Low Priority": "Malalta prioritato",
+ "Messages containing my display name": "Mesaĝoj enhavantaj mian vidigan nomon",
+ "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn",
+ "Messages containing my user name": "Mesaĝoj enhavantaj mian uzantnomon",
+ "Messages in group chats": "Mesaĝoj en grupaj babilejoj",
+ "Mute": "Silentigi",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Bonvolu priskribi la cimon. Kion vi faris? Kion vi atendis okazi? Kion fakte okazis?",
+ "Please install Chrome or Firefox for the best experience.": "Bonvolu instali \"Chrome\" aŭ \"Firefox\" por la plej bona sperto.",
+ "Please Register": "Bonvolu registri",
+ "powered by Matrix": "funkciigata de \"Matrix\"",
+ "Quote": "Citu",
+ "Reject": "Malakcepti",
+ "Resend": "Resendi",
+ "Room directory": "Babileja dosierujo",
+ "Room not found": "Babilejo ne trovita",
+ "Search": "Serĉi",
+ "Search…": "Serĉi…",
+ "Search for a room": "Serĉi babilejon",
+ "Send": "Sendi",
+ "Start chat": "Komenci babiladon",
+ "This Room": "Ĉi tiu Babilejo",
+ "Add an email address above to configure email notifications": "Aldonu retadreson supre por agordi retpoŝtajn sciigojn",
+ "Advanced notification settings": "Agordoj de sciigoj specialaj",
+ "Call invitation": "Invito al voko",
+ "All notifications are currently disabled for all targets.": "Ĉiuj sciigoj estas malvalidigitaj por ĉiu aparato.",
+ "An error occurred whilst saving your email notification preferences.": "Eraro okazis dum konservado de agordoj por retpoŝtaj sciigoj.",
+ "Cancel Sending": "Nuligi sendadon",
+ "Can't update user notification settings": "Ne eblas ĝisdatigi la agordojn de sciigoj al uzanto",
+ "Changelog": "Protokolo de ŝanĝoj",
+ "Close": "Fermi",
+ "Collapse panel": "Kaŝi panelon",
+ "Collecting app version information": "Kolektante informon pri versio de la aplikaĵo",
+ "Collecting logs": "Kolektante protokolon",
+ "Couldn't find a matching Matrix room": "Ne eblis trovi kongruantan ejon Matrix",
+ "Custom Server Options": "Opcioj pri personigo de servilo",
+ "customServer_text": "Vi povas uzi opciojn personigitajn de la servilo por ensaluti en aliajn servilojn Matrix specifante alian adreson URL-an de alia servilo Home. Tio permesas al vi uzi Riot per ekzistanta konto en alia Home servilo.
Vi povas ankaŭ agordi servilon identecan personigita, sed ne eblos inviti uzantojn pere de retpoŝtadreso, aŭ esti invitita pere de retpoŝtadreso vi mem.",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Forviŝi la kromnomon de la ejo %(alias)s and forigi %(name)s el la dosierujo?",
+ "Enable audible notifications in web client": "Ebligi aŭdeblajn sciigojn en la retkliento",
+ "Enable desktop notifications": "Ebligi labortablajn sciigojn",
+ "Enable email notifications": "Ebligi retpoŝtajn sciigojn",
+ "Enable notifications for this account": "Ebligi sciigojn por tiu ĉi konto",
+ "Enable them now": "Ebligi ilin nun",
+ "Enter keywords separated by a comma:": "Entajpi ŝlosilvortojn apartigitaj per komoj:",
+ "Error": "Eraro",
+ "Error saving email notification preferences": "Eraro konservante agordojn pri retpoŝtaj sciigoj",
+ "Expand panel": "Pli grandigi panelon",
+ "Failed to": "Malsukcesis",
+ "Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al la ejo",
+ "Failed to change settings": "Malsukcesis ŝanĝi la agordojn",
+ "Failed to forget room %(errCode)s": "Malsukcesis forgesi la ejon %(errCode)s",
+ "Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn",
+ "Failed to get protocol list from Home Server": "Malsukcesis obteni la liston de protokoloj por la servilo Home",
+ "Failed to get public room list": "Malsukcesis obteni la liston de publikaj ejoj",
+ "Failed to join the room": "Malsukcesis aliĝi al la ejo",
+ "Failed to remove tag %(tagName)s from room": "Malsukcesis forigi la etikedon %(tagName)s el la ejo",
+ "Failed to send report: ": "Malsukcesis sendi raporton: ",
+ "Failed to set direct chat tag": "Malsukcesis agordi la etikedon de rekta babilejo",
+ "Failed to set Direct Message status of room": "Malsukcesis agordi la staton de Rekta Mesaĝo de la ejo",
+ "Forward Message": "Plusendi mesaĝon",
+ "Hide panel": "Kaŝi panelon",
+ "(HTTP status %(httpStatus)s)": "(stato HTTP %(httpStatus)s)",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Por diagnozi problemojn, protokoloj el tiu ĉi kliento sendiĝos kune kun tiu ĉi raporto de eraro. Se vi preferas sendi nur la supran tekston, bonvolu malŝalti:",
+ "Login": "Ensaluti",
+ "Loading bug report module": "Ŝarĝante modulon pri eraroraporto",
+ "Members": "Membroj",
+ "Mentions only": "Nur mencioj",
+ "Messages in one-to-one chats": "Mesaĝoj en unu-je-unu babilejoj",
+ "Messages sent by bot": "Mesaĝoj sendita per roboto",
+ "more": "pli",
+ "No rooms to show": "Neniu ejo por montri",
+ "Noisy": "Brua",
+ "Notification targets": "Celo de sciigoj",
+ "Notifications": "Sciigoj",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "La sciigoj de la sekvaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:",
+ "Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo",
+ "Notify me for anything else": "Sciigu min por ĉio alia",
+ "Off": "Malŝaltita",
+ "On": "Ŝaltita",
+ "Operation failed": "La operacio malsukcesis",
+ "Permalink": "Konstanta ligilo",
+ "Please describe the bug and/or send logs.": "Bonvolu priskribi la cimon kaj/aŭ sendi protokolojn.",
+ "Redact": "Redakti",
+ "Remove %(name)s from the directory?": "Forigi %(name)s el la dosierujo?",
+ "Remove": "Forigi",
+ "remove %(name)s from the directory.": "forigi %(name)s el la dosierujo.",
+ "Remove from Directory": "Forigi el Dosierujo",
+ "Report a bug": "Raporti cimon",
+ "Riot Desktop on %(platformName)s": "Riot Labortablo sur %(platformName)s",
+ "Riot does not know how to join a room on this network": "Riot ne scias kiel aliĝi al ejo en tiu ĉi reto",
+ "Riot is not supported on mobile web. Install the app?": "Riot ne estas subtenita je mobile web. Instali la aplikaĵon?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uzas multajn specialajn trajtojn, kelkaj ne estas disponeblaj aŭ estas eksperimentaj en via nuna retumilo.",
+ "Send logs": "Sendi protokolojn",
+ "Settings": "Agordoj",
+ "Source URL": "Fonta URL",
+ "Sorry, your browser is not able to run Riot.": "Pardonu, via retumilo ne kapablas funkciigi Riot.",
+ "The Home Server may be too old to support third party networks": "La servilo Home povas esti tro malnova por subteni retoj de ekstera liveranto",
+ "There are advanced notifications which are not shown here": "Estas specialaj sciigoj kiuj ne estas montritaj ĉi tie",
+ "The server may be unavailable or overloaded": "La servilo povas esti maldisponebla aŭ tro ŝarĝita",
+ "This room is inaccessible to guests. You may be able to join if you register.": "Ci tiu ejo estas neenirebla por gastoj. Vi povus aliĝi se vi registriĝas.",
+ " to room": " al ejo",
+ "Unable to fetch notification target list": "Ne eblis obteni la liston de celoj por sciigoj",
+ "Unable to join network": "Ne eblis kuniĝi kun la reto",
+ "Unable to look up room ID from server": "Ne eblis trovi la identigon el la servilo",
+ "Unavailable": "Maldisponebla",
+ "Unhide Preview": "Malkaŝi antaŭrigardon",
+ "Unknown device": "Nekonata aparato",
+ "unknown error code": "kodo de nekonata eraro",
+ "Unnamed room": "Nekonata ejo",
+ "Update": "Ĝisdatigi",
+ "Uploaded on %(date)s by %(user)s": "Alŝutita je %(date)s per %(user)s",
+ "Uploading report": "Alŝutante raporton",
+ "View Decrypted Source": "Vidi malĉifritan fonton",
+ "View Source": "Vidi fonton",
+ "What's New": "Kio novas",
+ "What's new?": "Kio novas?",
+ "Waiting for response from server": "Atendante respondon el la servilo",
+ "When I'm invited to a room": "Kiam mi estas invitita en ejon",
+ "World readable": "Legebla tutmonde",
+ "You cannot delete this image. (%(code)s)": "Vi ne povas forviŝi tiun ĉi bildon. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "Vi ne povas forviŝi tiun ĉi mesaĝon. (%(code)s)",
+ "You are not receiving desktop notifications": "Vi ne estas ricevante sciigojn labortablan",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Vi uzas Riot kiel gasto. Registriĝu aŭ ensalutu por atingi pli da ejoj kaj funkcioj!",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vi eble agordis ilin en kliento kiu ne estis Riot. Vi ne povas agordi ilin en Riot sed ili ankoraŭ validas",
+ "Sunday": "Dimanĉo",
+ "Monday": "Lundo",
+ "Tuesday": "Mardo",
+ "Wednesday": "Merkredo",
+ "Thursday": "Ĵaŭdo",
+ "Friday": "Vendredo",
+ "Saturday": "Sabato",
+ "Today": "Hodiaŭ",
+ "Yesterday": "Hieraŭ",
+ "OK": "Bone",
+ "You need to be using HTTPS to place a screen-sharing call.": "Vi devas uzi HTTPS por starigi ekranan vokon.",
+ "Welcome page": "Paĝo de bonveno",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Kun via nuna retumilo, la aspekto kaj funkciado de la aplikaĵo povas esti tute malĝusta, kaj kelkaj aŭ ĉiu funkcioj eble ne funkcios. Se vi volas provi ĉiuokaze vi rajtas daŭrigi, sed ne estos subteno se vi trafas problemojn!",
+ "Welcome to Riot.im": "Bonvenon al Riot.im",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Malcentra, ĉifrita babilejo & kunlaboro povigita de [matrix]",
+ "Search the room directory": "Serĉi la ejan dosierujon",
+ "Chat with Riot Bot": "Babili kun la roboto Riot Bot",
+ "Get started with some tips from Riot Bot!": "Eki per sugesto de la roboto Riot Bot!",
+ "General discussion about Matrix and Riot": "Ĝenerala diskutado pri Matrix kaj Riot",
+ "Discussion of all things Matrix!": "Diskutado pri ĉio rilate al Matrix!",
+ "Riot/Web & Desktop chat": "Diskudato labortabla pri Riot/Web",
+ "Riot/iOS & matrix-ios-sdk chat": "Diskutado pri Riot/iOS & matrix-ios-sdk",
+ "Riot/Android & matrix-android-sdk chat": "Diskutado pri Riot/Android & matrix-android-sdk",
+ "Matrix technical discussions": "Teknikaj diskutoj pri Matrix",
+ "Running Matrix services": "Funkciigado de servoj Matrix",
+ "Community-run support for Synapse": "Komunuma subtenado de Synapse",
+ "Admin support for Dendrite": "Administra subtenado por Dendrite",
+ "Announcements about Synapse releases": "Anoncoj pri eldonoj Synapse",
+ "Support for those using and running matrix-appservice-irc": "Subteno por tiuj, kiuj uzas kaj funkciigas matrix-appservice-irc",
+ "Building services on Matrix": "Konstruante servojn per Matrix",
+ "Support for those using the Matrix spec": "Subteno por tiuj, kiuj uzas la specifon Matrix",
+ "Design and implementation of E2E in Matrix": "Dizajno kaj realigo de E2E en Matrix",
+ "Implementing VR services with Matrix": "Realigi VR-servojn per Matrix",
+ "Implementing VoIP services with Matrix": "Realigi VoIP-servojn per Matrix",
+ "Discussion of the Identity Service API": "Diskutado pri la API de Identiga Servo",
+ "Support for those using, running and writing other bridges": "Subteno por tiuj, kiuj uzas, funkciigas kaj skribas aliajn pontojn",
+ "Contributing code to Matrix and Riot": "Kontribui kodon al Matrix kaj Riot",
+ "Dev chat for the Riot/Web dev team": "Programista babilado por la programteamo de Riot/Web",
+ "Dev chat for the Dendrite dev team": "Programista babilado por la programteamo de Dendrite",
+ "Co-ordination for Riot/Web translators": "Kunordigado por tradukistoj de Riot/Web",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Multaj ejoj jam ekzistas en Matrix, ligitaj al ekzistantaj retoj (Slock, IRC, Gitter, ktp) aŭ sendependaj. Kontrolu la dosierujon!",
+ "Failed to change password. Is your password correct?": "Malsukcesis ŝanĝi la pasvorton. Ĉu via pasvorto pravas?",
+ "You have successfully set a password!": "Vi sukcese agordis pasvorton!",
+ "You can now return to your account after signing out, and sign in on other devices.": "Vi nun rajtas reiri al via konto post elsaluto, kaj ensaluti per aliaj aparatoj.",
+ "Continue": "Daŭrigi",
+ "Please set a password!": "Bonvolu agordi pasvorton!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Tio ĉi permesos vin reiri al via konto post elsaluto, kaj ensaluti per alia aparato.",
+ "You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Memoru, vi ĉiam povas agordi retpoŝtadreson en via uzanta agordo se vi decidas ŝanĝi ĝin poste.",
+ "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s per %(browserName)s je %(osName)s",
+ "Safari and Opera work too.": "Safari kaj Opera ankaŭ funkcias.",
+ "Drop here %(toAction)s": "Forlasi ĉi tie %(toAction)s",
+ "Favourite": "Plej ŝatata",
+ "Fetching third party location failed": "Venigado de ekstere liverita loko malsukcesis",
+ "Filter room names": "Filtri nomojn de ejoj"
+}
diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json
index 9fd5dd54..697822dc 100644
--- a/src/i18n/strings/es.json
+++ b/src/i18n/strings/es.json
@@ -56,7 +56,7 @@
"Messages in one-to-one chats": "Mensajes en chats uno a uno",
"Messages sent by bot": "Mensajes enviados por bot",
"more": "más",
- "Mute": "Mute",
+ "Mute": "Silenciar",
"No rooms to show": "Sin salas para mostrar",
"Noisy": "Ruidoso",
"Notification targets": "Objetivos de notificación",
@@ -65,9 +65,9 @@
"Notify me for anything else": "Notificarme para cualquier otra cosa",
"Off": "Apagado",
"On": "Encendido",
- "Operation failed": "Operación fallida",
+ "Operation failed": "Falló la operación",
"Permalink": "Enlace permanente",
- "Please Register": "Por favor regístrate",
+ "Please Register": "Por favor, regístrese",
"Quote": "Citar",
"Redact": "Redactar",
"Reject": "Rechazar",
@@ -80,7 +80,7 @@
"Room directory": "Directorio de salas",
"Room not found": "Sala no encontrada",
"Search for a room": "Buscar sala",
- "Settings": "Ajustes",
+ "Settings": "Configuración",
"Source URL": "URL de origen",
"Start chat": "Comenzar chat",
"The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros",
@@ -112,5 +112,97 @@
"Saturday": "Sábado",
"Today": "Hoy",
"Yesterday": "Ayer",
- "Welcome page": "Página de bienvenida"
+ "Welcome page": "Página de bienvenida",
+ "Continue": "Continuar",
+ "Search": "Búsqueda",
+ "OK": "Correcto",
+ "Failed to change password. Is your password correct?": "Falló al cambiar la clave, ¿Está correcta tu clave?",
+ "Safari and Opera work too.": "Safari y Opera también funcionan.",
+ "A new version of Riot is available.": "Una nueva versión de Riot está disponible.",
+ "Cancel": "Cancelar",
+ "Describe your problem here.": "Describa su problema aquí.",
+ "Forward Message": "Reenviar mensaje",
+ "Hide panel": "Ocultar panel",
+ "(HTTP status %(httpStatus)s)": "(estado HTTP %(httpStatus)s)",
+ "I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
+ "Changelog": "Bitácora de cambios",
+ "Collapse panel": "Colapsar panel",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Recuerde que, si es necesario, puede establecer una dirección de email en las preferencias de usuario.",
+ "All Rooms": "Todas las salas",
+ "Expand panel": "Expandir panel",
+ "Failed to": "Falló",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Para diagnosticar los problemas, las trazas de este cliente serán enviadas adjuntas a este informe de defecto. Si quisiera enviar el texto anterior solamente, entonces desmarque:",
+ "Login": "Abrir sesión",
+ "Report a bug": "Informe un defecto",
+ "Search…": "Buscar…",
+ "Send": "Enviar",
+ "Send logs": "Enviar trazas",
+ "Sorry, your browser is not able to run Riot.": "¡Lo sentimos! Su navegador no puede ejecutar Riot.",
+ "This Room": "Esta sala",
+ "Unavailable": "No disponible",
+ "Unknown device": "Dispositivo desconocido",
+ "Update": "Actualizar",
+ "Uploading report": "Enviando informe",
+ "What's New": "Lo que hay de nuevo",
+ "What's new?": "¿Qué hay de nuevo?",
+ "Waiting for response from server": "Esperando una respuesta del servidor",
+ "You have successfully set a password and an email address!": "¡Ha establecido exitosamente la contraseña y la dirección de email!",
+ "You have successfully set a password!": "¡Ha establecido exitosamente una contraseña!",
+ "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s en %(osName)s",
+ "All messages (loud)": "Todos los mensajes (ruidoso)",
+ "All notifications are currently disabled for all targets.": "Las notificaciones estan desactivadas en todos los objetivos.",
+ "Collecting app version information": "Recolectando información de la versión de la aplicación",
+ "Collecting logs": "Recolectando registros",
+ "Dismiss": "Omitir",
+ "Failed to send report: ": "Error al enviar reporte: ",
+ "Loading bug report module": "Cargando módulo de reporte de errores",
+ "Messages containing keywords": "Mensajes que contienen palabras clave",
+ "Notify for all other messages/rooms": "Notificar para todos los demás mensajes/salas",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Por favor describa el error. Qué acción ejecutó? Cuál era el resultado que esperaba? Que pasó realmente?",
+ "Please describe the bug and/or send logs.": "Por favor describa el error y/o envíe los registros.",
+ "Please install Chrome or Firefox for the best experience.": "Por favor instale Google Chrome o Mozilla Firefox para una mejor experiencia.",
+ "powered by Matrix": "con el poder de Matrix",
+ "Riot Desktop on %(platformName)s": "Riot Desktop en %(platformName)s",
+ "Riot is not supported on mobile web. Install the app?": "Riot no está soportado en navegadores Web móviles. Quieres instalar la aplicación?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot usa muchas características avanzadas del navegador, algunas de las cuales no están disponibles en su navegador actual.",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Está usando Riot como invitado. ¡Regístrese o inicie sesión para acceder más salas y características!",
+ "You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "En su navegador actual, la apariencia de la aplicación puede ser completamente incorrecta, y algunas de las características podrían no funcionar. Si aún desea probarlo puede continuar, pero ¡no podremos ofrecer soporte por cualquier problema que pudiese tener!",
+ "Welcome to Riot.im": "Bienvenido a Riot.im",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Conversaciones & colaboración cifradas y descentralizadas con el poder de [matrix]",
+ "Search the room directory": "Buscar en el directorio de salas",
+ "Chat with Riot Bot": "Conversar con el Bot de Riot",
+ "Get started with some tips from Riot Bot!": "¡Comenzar con algunos tips de Riot Bot!",
+ "General discussion about Matrix and Riot": "Discusión general sobre Matrix y Riot",
+ "Discussion of all things Matrix!": "¡Discusión sobre todas las cosas de Matrix!",
+ "Riot/Web & Desktop chat": "Conversaciones de Riot/Web & Desktop",
+ "Riot/iOS & matrix-ios-sdk chat": "Conversaciones sobre Riot/iOS & matrix-ios-sdk",
+ "Riot/Android & matrix-android-sdk chat": "Conversaciones sobre Riot/Android & matrix-android-sdk",
+ "Matrix technical discussions": "Discusiones técnicas sobre Matrix",
+ "Running Matrix services": "Ejecutando servicios de Matrix",
+ "Community-run support for Synapse": "Soporte comunitario de Synapse",
+ "Admin support for Dendrite": "Soporte administrativo para Dendrite",
+ "Announcements about Synapse releases": "Anuncios de lanzamientos de Synapse",
+ "Support for those using and running matrix-appservice-irc": "Soporte para aquellos que usan o administran matrix-appservice-irc",
+ "Building services on Matrix": "Construyendo servicios con Matrix",
+ "Support for those using the Matrix spec": "Soporte para usuarios de la especificación de Matrix",
+ "Design and implementation of E2E in Matrix": "Diseño e implementación de E2E en Matrix",
+ "Implementing VR services with Matrix": "Implementación de servicios VR con Matrix",
+ "Implementing VoIP services with Matrix": "Implementación de servicios VoIP con Matrix",
+ "Discussion of the Identity Service API": "Discusión sobre el API de Identity Service",
+ "Support for those using, running and writing other bridges": "Soporte para usuarios, administradores y desarrolladores de otros puentes",
+ "Contributing code to Matrix and Riot": "Contribuciones de código para Matrix y Riot",
+ "Dev chat for the Riot/Web dev team": "Conversaciones del equipo de desarrollo de Riot/Web",
+ "Dev chat for the Dendrite dev team": "Conversaciones del equipo de desarrollo de Dendrite",
+ "Co-ordination for Riot/Web translators": "Coordinación para traductores de Riot/Web",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Muchas salas ya están disponibles en Matrix, enlazadas a redes existentes (Slack, IRC, Gitter, etc) o independientes. ¡Revisa el directorio!",
+ "You can now return to your account after signing out, and sign in on other devices.": "Ahora puedes regresar a tu cuenta después de cerrar tu sesión, e iniciar sesión en otros dispositivos.",
+ "Please set a password!": "¡Por favor establece una contraseña!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto le permitirá regresar a su cuenta después de cerrar sesión, así como iniciar sesión en otros dispositivos.",
+ "Warning": "Advertencia",
+ "Checking for an update...": "Comprobando actualizaciones...",
+ "No update available.": "No hay actualizaciones disponibles.",
+ "Downloading update...": "Descargando actualizaciones...",
+ "To return to your account in future you need to set a password": "Para regresar a su cuenta en el futuro Ud. debe establecer una contraseña",
+ "Set Password": "Establezca la contraseña"
}
diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json
index 47fb5253..13cf15ce 100644
--- a/src/i18n/strings/fr.json
+++ b/src/i18n/strings/fr.json
@@ -10,7 +10,7 @@
"Create new room": "Créer un nouveau salon",
"Couldn't find a matching Matrix room": "Impossible de trouver un salon Matrix",
"Custom Server Options": "Options de serveur personnalisées",
- "delete the alias.": "Supprimer l'alias.",
+ "delete the alias.": "supprimer l'alias.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer l'alias %(alias)s du salon et supprimer %(name)s du répertoire ?",
"Direct Chat": "Conversation Directe",
"Directory": "Répertoire",
@@ -85,7 +85,7 @@
"more": "plus",
"Mute": "Couper le son",
"No rooms to show": "Aucun salon à afficher",
- "Noisy": "Sonore",
+ "Noisy": "Activer le son",
"Notification targets": "Appareils recevant les notifications",
"Notifications": "Notifications",
"Notifications on the following keywords follow rules which can’t be displayed here": "Les mots-clés suivants suivent des règles de notification qui ne peuvent être affichées ici",
@@ -118,7 +118,7 @@
"Guests can join": "Ouvert aux visiteurs",
" to room": " au salon",
"Advanced notification settings": "Paramètres de notification avancés",
- "customServer_text": "Vous pouvez utiliser l'option de serveur personnalisé pour vous connectez à d'autres serveurs Matrix, en spécifiant une adresse de homerserver différente. Cela permet d'utiliser Riot avec un compte existant sur un homeserverdifférent.
Vous pouvez aussi indiquer un serveur d'identité personnel mais vous ne pourrez plus inviter des utilisateurs par email, ou être invité par email.",
+ "customServer_text": "Vous pouvez utiliser l'option de serveur personnalisé pour vous connectez à d'autres serveurs Matrix, en spécifiant une adresse de homerserver différente. Cela permet d'utiliser Riot avec un compte existant sur un homeserver différent.
Vous pouvez aussi indiquer un serveur d'identité personnel mais vous ne pourrez plus inviter des utilisateurs par email, ou être invité par email.",
"Notifications on the following keywords follow rules which can’t be displayed here:": "Les notifications pour les mots-clés suivant répondent à des critères qui ne peuvent pas être affichés ici :",
"Collapse panel": "Cacher le panneau",
"Expand panel": "Dévoiler le panneau",
@@ -133,7 +133,7 @@
"A new version of Riot is available.": "Une nouvelle version de Riot est disponible.",
"All Rooms": "Tous les salons",
"Cancel": "Annuler",
- "Changelog": "Journal des modif.",
+ "Changelog": "Journal des modif",
"Collecting app version information": "Récupération des info de version de l’application",
"Collecting logs": "Récupération des traces",
"Describe your problem here.": "Décrivez votre problème ici.",
@@ -159,7 +159,45 @@
"What's New": "Nouveautés",
"What's new?": "Nouveautés ?",
"Waiting for response from server": "En attente d’une réponse du serveur",
- "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Vous utilisez Riot en tant que visiteur. Enregistrez vous ou identifiez vous pour accéder à plus de salons et de fonctionnalités !",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Vous utilisez Riot en tant que visiteur. Enregistrez-vous ou identifiez-vous pour accéder à plus de salons et de fonctionnalités !",
"You need to be using HTTPS to place a screen-sharing call.": "Vous devez utiliser HTTPS pour effectuer un appel en partage d’écran.",
- "OK": "OK"
+ "OK": "OK",
+ "Failed to change password. Is your password correct?": "Échec du changement de mot de passe. Votre mot de passe est-il correct ?",
+ "You have successfully set a password!": "Vous avez paramétré un mot de passe avec succès !",
+ "Continue": "Continuer",
+ "Please set a password!": "Veuillez définir un mot de passe !",
+ "You can now return to your account after signing out, and sign in on other devices.": "Vous pouvez maintenant revenir sur votre compte après vous être déconnecté, et vous identifier sur d'autres appareils.",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Cela vous permettra de retourner sur votre compte après vous être déconnecté, et de vous identifier sur d'autres appareils.",
+ "Welcome to Riot.im": "Bienvenue sur Riot.im",
+ "(HTTP status %(httpStatus)s)": "(statut HTTP %(httpStatus)s)",
+ "Login": "S'identifier",
+ "Chat with Riot Bot": "Discussion avec Riot Bot",
+ "Search the room directory": "Rechercher dans le répertoire de salon",
+ "Get started with some tips from Riot Bot!": "Démarrer avec quelques astuces de Riot Bot !",
+ "Riot/Android & matrix-android-sdk chat": "Discussions Riot/Android & matrix-android-sd",
+ "Riot/iOS & matrix-ios-sdk chat": "Discussions Riot/iOS & matrix-ios-sdk",
+ "General discussion about Matrix and Riot": "Discussion générale sur Matrix et Riot",
+ "Riot/Web & Desktop chat": "Discussions Riot/Web & Desktop",
+ "Running Matrix services": "Execution de services Matrix",
+ "Admin support for Dendrite": "Support admin pour Dendrite",
+ "Announcements about Synapse releases": "Communiqués sur les nouvelles versions de Synapse",
+ "Matrix technical discussions": "Discussions techniques sur Matrix",
+ "Community-run support for Synapse": "Support communautaire sur Synape",
+ "Support for those using and running matrix-appservice-irc": "Support pour ceux qui utilisent et exécutent matrix-appservice-irc",
+ "Building services on Matrix": "Développement de services sur Matrix",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Discussion & collaboration décentralisées et encryptées propulsé par [matrix]",
+ "Discussion of all things Matrix!": "Discussion de tous les sujets Matrix !",
+ "Support for those using the Matrix spec": "Support pour les utilisateurs de la spec Matrix",
+ "Design and implementation of E2E in Matrix": "Définition et implémentation de la crypto dans Matrix",
+ "Implementing VR services with Matrix": "Implémentation de de services de réalité virtuelle avec Matrix",
+ "Implementing VoIP services with Matrix": "Implémentation de de services de voix sur IP avec Matrix",
+ "Discussion of the Identity Service API": "Discussion sur l’API du Service Identité",
+ "Support for those using, running and writing other bridges": "Support pour les utilisateurs, administrateurs et développeurs de passerelles",
+ "Contributing code to Matrix and Riot": "Contribuer à Matrix et Riot",
+ "Dev chat for the Riot/Web dev team": "Forum pour les discussions sur les développements de Riot/Web",
+ "Dev chat for the Dendrite dev team": "Forum pour les discussion sur les développements de Dendrite",
+ "Co-ordination for Riot/Web translators": "Coordination des traducteurs de Riot/Web",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Beaucoup de salons existent déjà dans Matrix, liés à des réseaux existants (Slsck, IRC, Gitter etc) ou indépendants. Jetez un oeil au répertoire !",
+ "You have successfully set a password and an email address!": "Vous avez configuré un mot de passe et une adresse e-mail avec succès !",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Souvenez-vous que vous pourrez toujours définir une adresse e-mail dans la configuration utilisateur si vous changez d’avis."
}
diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json
new file mode 100644
index 00000000..f8bfb088
--- /dev/null
+++ b/src/i18n/strings/hi.json
@@ -0,0 +1,8 @@
+{
+ "A new version of Riot is available.": "रायट के एक नया वर्शन उपलब्ध है।",
+ "All messages": "सारे संदेश",
+ "All Rooms": "सारे कमरे",
+ "Please set a password!": "कृपया एक पासवर्ड सेट करें!",
+ "Continue": "आगे बढ़ें",
+ "You have successfully set a password and an email address!": "आपने सफलतापूर्वक एक पासवर्ड और एक ईमेल एड्रेस सेट कर लिया है!"
+}
diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json
index 9f8b2bef..790dfc53 100644
--- a/src/i18n/strings/hu.json
+++ b/src/i18n/strings/hu.json
@@ -130,7 +130,7 @@
"Messages containing keywords": "Az üzenet kulcsszavakat tartalmaz",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s alkalmazás %(browserName)s böngészőn %(osName)s rendszeren",
"A new version of Riot is available.": "Új verzió érhető el a Riot-ból.",
- "All Rooms": "Minden szoba",
+ "All Rooms": "Minden szobában",
"Cancel": "Mégse",
"Changelog": "Változások",
"Collecting app version information": "Alkalmazás verzió információk összegyűjtése",
@@ -148,7 +148,7 @@
"Search…": "Keresés…",
"Send": "Küld",
"Send logs": "Naplók elküldése",
- "This Room": "Ez a szoba",
+ "This Room": "Ebben a szobában",
"Unavailable": "Elérhetetlen",
"Unknown device": "Ismeretlen eszköz",
"Update": "Frissítés",
@@ -196,5 +196,9 @@
"Continue": "Folytatás",
"Please set a password!": "Kérlek, állíts be egy jelszót!",
"This will allow you to return to your account after signing out, and sign in on other devices.": "Ezzel visszatérhetsz kijelentkezés után a fiókodhoz és más eszközökkel is be tudsz jelentkezni.",
- " (HTTP status %(httpStatus))": "(HTTP állapot %(httpStatus))"
+ "(HTTP status %(httpStatus)s)": "(HTTP állapot %(httpStatus)s)",
+ "You have successfully set a password and an email address!": "Sikeresen beállítottad a jelszavad és e-mail címed!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Ha meggondolod magad, bármikor beállíthatod az e-mail címed a felhasználói beállításoknál.",
+ "To return to your account in future you need to set a password": "A fiókba való visszalépéshez jelszót kell beállítanod",
+ "Set Password": "Jelszó beállítása"
}
diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/src/i18n/strings/id.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json
new file mode 100644
index 00000000..8dcc2984
--- /dev/null
+++ b/src/i18n/strings/it.json
@@ -0,0 +1,65 @@
+{
+ "Safari and Opera work too.": "Anche Safari e Opera funzionano.",
+ "A new version of Riot is available.": "È disponibile una nuova versione di Riot.",
+ "Add an email address above to configure email notifications": "Specifica un indirizzo email per configurazione le notifiche via email",
+ "Advanced notification settings": "Impostazioni notifiche avanzate",
+ "All messages": "Tutti i messaggi",
+ "All messages (loud)": "Tutti i messaggi (rumoroso)",
+ "All Rooms": "Tutte le stanze",
+ "An error occurred whilst saving your email notification preferences.": "È avvenuto un errore durante il salvataggio delle tue preferenze sulle notifiche email.",
+ "Call invitation": "Invito ad una chiamata",
+ "Cancel": "Annulla",
+ "Cancel Sending": "Annulla invio",
+ "Can't update user notification settings": "Impossibile aggiornare le impostazioni di notifica dell'utente",
+ "Changelog": "Cambiamenti",
+ "Close": "Chiudi",
+ "Collapse panel": "Riduci pannello",
+ "Collecting app version information": "Raccolta delle informazioni sulla versione dell'applicazione",
+ "Collecting logs": "Raccolta del registro",
+ "Create new room": "Crea una nuova stanza",
+ "Couldn't find a matching Matrix room": "Impossibile trovare una stanza Matrix corrispondente",
+ "Custom Server Options": "Opzioni server personale",
+ "customServer_text": "Puoi utilizzare un server personale per entrare in altri server Matrix specificando un diverso indirizzo per il server Home. Questo ti permetterà di usare Riot con un account Matrix già esistente su un altro server.
Puoi anche specificare un diverso server di identità ma non sarai in grado di invitare utenti o di essere invitato tramite indirizzo email.",
+ "delete the alias.": "Elimina gli alias.",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminare l'alias %(alias)s e rimuovere %(name)s dalla lista?",
+ "Describe your problem here.": "Descrivi qui il tuo problema.",
+ "Direct Chat": "Chat diretta",
+ "Directory": "Lista",
+ "Dismiss": "Scarta",
+ "Download this file": "Scarica questo file",
+ "Enable audible notifications in web client": "Abilita notifiche audio nel client Web",
+ "Enable desktop notifications": "Abilita le notifiche desktop",
+ "Enable email notifications": "Abilita le notifiche email",
+ "Enable notifications for this account": "Abilita le notifiche per questo account",
+ "Enable them now": "Abilitale adesso",
+ "Enter keywords separated by a comma:": "Inserisci le parole chiave separate da virgole:",
+ "Error": "Errore",
+ "Error saving email notification preferences": "Errore nel salvataggio delle preferenze di notifica email",
+ "#example": "#esempio",
+ "Expand panel": "Espandi il pannello",
+ "Failed to": "Non si è riuscito a",
+ "Failed to add tag %(tagName)s to room": "Non si è riuscito ad aggiungere l'etichetta %(tagName)s alla stanza",
+ "Failed to change settings": "Non si è riuscito ad aggiornare le impostazioni",
+ "Failed to update keywords": "Non si è riuscito ad aggiornare le parole chiave",
+ "Failed to get protocol list from Home Server": "Non si è riuscito ad ottenere la lista protocollo dal server Home",
+ "Failed to get public room list": "Non si è riuscito ad ottenere la lista delle stanze pubbliche",
+ "Failed to join the room": "Non si è riuscito a entrare nella stanza",
+ "Failed to remove tag %(tagName)s from room": "Non si è riuscito a rimuovere il tag %(tagName)s dalla stanza",
+ "Failed to send report: ": "Non si è riuscito ad inviare il resoconto: ",
+ "Failed to set direct chat tag": "Non si è riuscito a impostare l'etichetta di chat diretta",
+ "Failed to set Direct Message status of room": "Non si è riuscito ad impostare lo stato di Messaggio Diretto alla stanza",
+ "Favourite": "Preferito",
+ "Files": "File",
+ "Filter room names": "Filtra i nomi delle stanze",
+ "Forget": "Dimentica",
+ "Forward Message": "Inoltra messaggio",
+ " from room": " dalla stanza",
+ "Guests can join": "Gli ospiti sono ammessi",
+ "Guest users can't invite users. Please register to invite.": "Gli utenti ospite non possono invitare altri utenti. Registrati per invitare.",
+ "Hide panel": "Nascondi pannello",
+ "I understand the risks and wish to continue": "Sono consapevole dei rischi e vorrei continuare",
+ "Invite to this room": "Invita a entrare in questa stanza",
+ "Keywords": "Parole chiave",
+ "Leave": "Abbandona",
+ "Login": "Entra"
+}
diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json
new file mode 100644
index 00000000..6424eb24
--- /dev/null
+++ b/src/i18n/strings/ko.json
@@ -0,0 +1,204 @@
+{
+ "A new version of Riot is available.": "라이엇의 새 버전을 사용하실 수 있어요.",
+ "Add an email address above to configure email notifications": "이메일 알림을 설정하기 위해 이메일 주소를 추가해주세요",
+ "Advanced notification settings": "고급 알림 설정",
+ "All messages": "모든 메시지",
+ "All messages (loud)": "모든 메시지 (크게)",
+ "All Rooms": "모든 방",
+ "All notifications are currently disabled for all targets.": "현재 모든 알림이 모든 상대에게서 꺼졌어요.",
+ "An error occurred whilst saving your email notification preferences.": "이메일 알림을 설정하다가 오류가 일어났어요.",
+ "Call invitation": "전화가 왔어요",
+ "Cancel": "취소",
+ "Cancel Sending": "보내기 취소",
+ "Can't update user notification settings": "사용자 알림 설정을 갱신할 수 없어요",
+ "Changelog": "바뀐 점",
+ "Close": "닫기",
+ "Collapse panel": "패널 접기",
+ "Collecting app version information": "앱 버전 정보를 수집하는 중",
+ "Collecting logs": "로그 수집 중",
+ "Create new room": "새 방 만들기",
+ "Couldn't find a matching Matrix room": "일치하는 매트릭스 방을 찾을 수 없어요",
+ "Custom Server Options": "사용자 지정 서버 설정",
+ "delete the alias.": "가명을 지울게요.",
+ "Describe your problem here.": "여기에 일어난 문제를 적어주세요.",
+ "Direct Chat": "직접 이야기하기",
+ "Directory": "목록",
+ "Dismiss": "없애기",
+ "Download this file": "이 파일 받기",
+ "Enable desktop notifications": "컴퓨터에서 알림 받기",
+ "Enable email notifications": "이메일로 알림 받기",
+ "Enable notifications for this account": "이 계정의 알림 받기",
+ "Error": "오류",
+ "Error saving email notification preferences": "이메일 알림을 설정하는데 오류가 일어났어요",
+ "#example": "#예",
+ "Expand panel": "확장 패널",
+ "Forget": "잊기",
+ "Hide panel": "패널 숨기기",
+ "Guest users can't invite users. Please register to invite.": "손님은 사용자를 초대할 수 없어요. 초대하려면 계정을 등록해주세요.",
+ "I understand the risks and wish to continue": "위험할 수 있는 걸 알고 계속하기를 바라요",
+ "Invite to this room": "이 방에 초대하기",
+ "Leave": "떠나기",
+ "Login": "로그인",
+ "Loading bug report module": "오류 보고 모듈을 불러오는 중",
+ "Low Priority": "낮은 우선순위",
+ "Members": "구성원",
+ "more": "더 보기",
+ "Mute": "알림 끄기",
+ "No rooms to show": "보여드릴 방이 없어요",
+ "Notification targets": "알림 대상",
+ "Notifications": "알림",
+ "Off": "끄기",
+ "On": "켜기",
+ "Permalink": "고유주소",
+ "Please describe the bug and/or send logs.": "오류를 적어주시거나 로그를 보내주세요.",
+ "Please Register": "계정을 등록해주세요",
+ "powered by Matrix": "매트릭스의 지원을 받고 있어요",
+ "Quote": "인용하기",
+ "Redact": "지우기",
+ "Reject": "거절하기",
+ "Remove %(name)s from the directory?": "목록에서 %(name)s을 지우시겠어요?",
+ "Remove": "지우기",
+ "remove %(name)s from the directory.": "목록에서 %(name)s을 지웠어요.",
+ "Remove from Directory": "목록에서 지우기",
+ "Report a bug": "오류 보고하기",
+ "Resend": "다시 보내기",
+ "Riot Desktop on %(platformName)s": "%(platformName)s에서 라이엇 컴퓨터판",
+ "Riot is not supported on mobile web. Install the app?": "라이엇은 모바일 사이트를 지원하지 않아요. 앱을 설치하시겠어요?",
+ "Room directory": "방 목록",
+ "Room not found": "방을 찾지 못했어요",
+ "Search": "찾기",
+ "Search…": "찾기…",
+ "Search for a room": "방에서 찾기",
+ "Send": "보내기",
+ "Send logs": "로그 보내기",
+ "Settings": "설정",
+ "Source URL": "출처 주소",
+ "Sorry, your browser is not able to run Riot.": "죄송해요. 브라우저에서 라이엇을 켤 수가 없어요.",
+ "Start chat": "이야기하기",
+ "This Room": "방",
+ "Unavailable": "이용할 수 없음",
+ "Unknown device": "알 수 없는 장치",
+ "unknown error code": "알 수 없는 오류 코드",
+ "Unnamed room": "이름없는 방",
+ "Update": "업데이트",
+ "Uploading report": "보고를 올리는 중",
+ "What's New": "새로운 점",
+ "What's new?": "새로운 점은?",
+ "Waiting for response from server": "서버에서 응답을 기다리는 중",
+ "You cannot delete this image. (%(code)s)": "이 사진을 지우실 수 없어요. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "이 메시지를 지우실 수 없어요. (%(code)s)",
+ "You are not receiving desktop notifications": "컴퓨터 알림을 받지 않고 있어요",
+ "Sunday": "일요일",
+ "Monday": "월요일",
+ "Tuesday": "화요일",
+ "Wednesday": "수요일",
+ "Thursday": "목요일",
+ "Friday": "금요일",
+ "Saturday": "토요일",
+ "Today": "오늘",
+ "Yesterday": "어제",
+ "OK": "알았어요",
+ "Welcome page": "환영 화면",
+ "Welcome to Riot.im": "라이엇에 오신 걸 환영해요",
+ "Chat with Riot Bot": "Riot 봇과 이야기하기",
+ "You have successfully set a password!": "비밀번호를 설정했어요!",
+ "Continue": "게속하기",
+ "Please set a password!": "비밀번호를 설정해주세요!",
+ "%(appName)s via %(browserName)s on %(osName)s": "%(osName)s의 %(browserName)s을 통한 %(appName)s",
+ "Safari and Opera work too.": "사파리와 오페라에서도 작동해요.",
+ "customServer_text": "사용자 지정 서버 설정에서 다른 홈 서버 주소를 지정해 다른 매트릭스 서버에 로그인할 수 있어요. 이를 통해 라이엇과 다른 홈 서버의 기존 매트릭스 계정을 함께 쓸 수 있죠.
사용자 지정 ID 서버를 설정할 수도 있지만 이메일 주소로 사용자를 초대하거나 초대받을 수는 없답니다.",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "방 가명 %(alias)s 을 지우고 목록에서 %(name)s를 지우시겠어요?",
+ "Drop here %(toAction)s": "여기에 놓아주세요 %(toAction)s",
+ "Enable audible notifications in web client": "웹 클라이언트에서 알림 소리 켜기",
+ "Enable them now": "지금 켜기",
+ "Enter keywords separated by a comma:": "키워드를 쉼표로 구분해 입력해주세요:",
+ "Failed to": "실패했어요",
+ "Failed to add tag %(tagName)s to room": "방에 %(tagName)s로 지정하지 못했어요",
+ "Failed to change settings": "설정을 바꾸지 못했어요",
+ "Failed to forget room %(errCode)s": "방 %(errCode)s를 잊지 못했어요",
+ "Failed to update keywords": "키워드를 갱신하지 못했어요",
+ "Failed to get protocol list from Home Server": "홈 서버에서 프로토콜 목록을 얻지 못했어요",
+ "Failed to get public room list": "공개한 방 목록을 얻지 못했어요",
+ "Failed to join the room": "방에 들어가지 못했어요",
+ "Failed to remove tag %(tagName)s from room": "방에서 %(tagName)s 지정을 지우지 못했어요",
+ "Failed to send report: ": "보고를 보내지 못했어요: ",
+ "Failed to set direct chat tag": "직접 이야기 지정을 설정하지 못했어요",
+ "Failed to set Direct Message status of room": "방의 쪽지 상태를 설정하지 못했어요",
+ "Favourite": "즐겨찾기",
+ "Fetching third party location failed": "타사 위치를 불러오지 못했어요",
+ "Files": "파일",
+ "Filter room names": "방 이름 거르기",
+ "Forward Message": "메시지 전달",
+ " from room": " 방에서",
+ "Guests can join": "손님이 들어올 수 있어요",
+ "(HTTP status %(httpStatus)s)": "(HTTP 상태 %(httpStatus)s)",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "문제를 진단하기 위해서, 이 클라이언트의 로그를 오류 보고서와 같이 보낼 거에요. 위 내용만 보내시려면, 체크를 해제하세요:",
+ "Keywords": "키워드",
+ "Mentions only": "답만 하기",
+ "Messages containing my display name": "내 별명이 적힌 메시지",
+ "Messages containing keywords": "키워드가 적힌 메시지",
+ "Messages containing my user name": "내 사용자 이름이 적힌 메시지",
+ "Messages in group chats": "이야기 모임의 메시지",
+ "Messages in one-to-one chats": "1:1 이야기의 메시지",
+ "Messages sent by bot": "봇이 보낸 메시지",
+ "Noisy": "소리",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "여기 표시될 수 없는 규칙에 따라 다음 키워드는 알리지 않아요:",
+ "Notify for all other messages/rooms": "다른 모든 메시지/방 알리기",
+ "Notify me for anything else": "모든 걸 알리기",
+ "Operation failed": "작업 실패",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "오류를 설명해주세요. 무슨 일을 하셨나요? 어떤 일을 예상하셨나요? 실제로는 어떤 일이 일어났나요?",
+ "Please install Chrome or Firefox for the best experience.": "최상의 경험을 위해 크롬이나 파이어폭스를 설치해주세요.",
+ "Riot does not know how to join a room on this network": "라이엇이 이 네트워크에서 방에 들어가는 법을 알 수 없어요",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "라이엇은 많은 고급 브라우저 기능을 사용해요. 일부는 현재 브라우저에서 쓸 수 없거나 실험적이에요.",
+ "The Home Server may be too old to support third party networks": "타사 네트워크를 지원하기에는 홈 서버가 너무 오래된 걸 수 있어요",
+ "There are advanced notifications which are not shown here": "여기 보이지 않는 고급 알림이 있어요",
+ "The server may be unavailable or overloaded": "서버를 쓸 수 없거나 과부하일 수 있어요",
+ "This room is inaccessible to guests. You may be able to join if you register.": "이 방은 손님이 들어가실 수 없어요. 계정을 등록하시면 들어가실 수 있을 거에요.",
+ " to room": " 방에서",
+ "Unable to fetch notification target list": "알림 대상 목록을 불러올 수 없어요",
+ "Unable to join network": "네트워크에 들어갈 수 없어요",
+ "Unable to look up room ID from server": "서버에서 방 ID를 찾아볼 수 없어요",
+ "Unhide Preview": "미리보기를 숨기지 않기",
+ "Uploaded on %(date)s by %(user)s": "by %(user)s가 %(date)s에 올림",
+ "View Decrypted Source": "해독된 출처 보기",
+ "View Source": "출처 보기",
+ "When I'm invited to a room": "방에 초대받았을 때",
+ "World readable": "세계에 보이기",
+ "You need to be using HTTPS to place a screen-sharing call.": "화면 공유를 하려면 HTTPS를 써야만 해요.",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "현재 브라우저에서는, 응용 프로그램의 모양과 기능이 완벽하게 맞지 않거나, 일부 혹은 모든 기능이 작동하지 않을 수 있어요. 계속할 수는 있지만, 맞닥뜨리는 모든 문제는 직접 해결하셔야해요!",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "분산되고, 암호화된 대화 & [matrix]의 지원으로 협력",
+ "Search the room directory": "방 목록을 찾기",
+ "Get started with some tips from Riot Bot!": "라이엇 봇에게 조언을 받고 시작하세요!",
+ "General discussion about Matrix and Riot": "매트릭스와 라이엇에 대한 일반 논의",
+ "Discussion of all things Matrix!": "매트릭스의 모든 것에 대한 토론!",
+ "Riot/Web & Desktop chat": "라이엇/웹 & 컴퓨터 이야기",
+ "Riot/iOS & matrix-ios-sdk chat": "라이엇/IOS & matrix-ios-sdk 대화",
+ "Riot/Android & matrix-android-sdk chat": "매트릭스/안드로이드 & matrix-ios-sdk 대화",
+ "Matrix technical discussions": "매트릭스 기술 논의",
+ "Running Matrix services": "매트릭스 서비스 실행",
+ "Community-run support for Synapse": "시냅스 커뮤니티 운영 지원",
+ "Admin support for Dendrite": "덴드라이트 관리 지원",
+ "Announcements about Synapse releases": "시냅스 공개 발표",
+ "Support for those using and running matrix-appservice-irc": "matrix-appservice-irc를 사용하고 운영하는 사람들을 지원",
+ "Building services on Matrix": "매트릭스에서 서비스 구축",
+ "Support for those using the Matrix spec": "Matrix spec을 사용하는 사람들을 지원",
+ "Design and implementation of E2E in Matrix": "매트릭스에서 E2E 설계와 구현",
+ "Implementing VR services with Matrix": "매트릭스로 VR 서비스 구현",
+ "Implementing VoIP services with Matrix": "매트릭스로 인터넷전화 서비스 구현",
+ "Discussion of the Identity Service API": "ID 서비스 API에 대한 논의",
+ "Support for those using, running and writing other bridges": "다른 브릿지를 사용하고, 운영하고, 기록하는 사람들을 지원",
+ "Contributing code to Matrix and Riot": "매트릭스와 라이엇에 코드 기여하기",
+ "Dev chat for the Riot/Web dev team": "라이엇/웹 개발 팀을 위한 개발자 대화",
+ "Dev chat for the Dendrite dev team": "덴드라이트 개발 팀을 위한 개발자 대화",
+ "Co-ordination for Riot/Web translators": "라이엇/웹 번역자를 위한 조정",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "기존 네트워크(Slack, IRC, Gitter 등)에 연결되있거나 독립된 많은 방들이 이미 매트릭스에 있어요. 목록을 확인해보세요!",
+ "Failed to change password. Is your password correct?": "비밀번호를 바꾸지 못했어요. 이 비밀번호가 정말 맞으세요?",
+ "You can now return to your account after signing out, and sign in on other devices.": "계정을 로그아웃하신 뒤에 계정으로 돌아가, 다른 장치에서 로그인하실 수 있어요.",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "이런 식으로 로그아웃한 뒤 계정으로 돌아가, 다른 장치에서 로그인하실 수 있어요.",
+ "You have successfully set a password and an email address!": "비밀번호와 이메일 주소를 설정했어요!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "잊지마세요, 마음이 바뀌면 언제라도 사용자 설정에서 이메일 주소를 바꾸실 수 있다는 걸요.",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "손님으로 라이엇에 들어오셨네요. 계정을 등록하거나로그인하시고 더 많은 방과 기능을 즐기세요!",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "라이엇이 아닌 다른 클라이언트에서 구성하셨을 수도 있어요. 라이엇에서 조정할 수는 없지만 여전히 적용되있을 거에요",
+ "To return to your account in future you need to set a password": "나중에 계정으로 돌아가려면 비밀번호 설정을 해야만 해요",
+ "Set Password": "비밀번호 설정"
+}
diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json
index 10598885..9f2ad64a 100644
--- a/src/i18n/strings/ml.json
+++ b/src/i18n/strings/ml.json
@@ -2,5 +2,5 @@
"Add an email address above to configure email notifications": "ഇ മെയില് അറിയിപ്പുകൾ ലഭിക്കാന് മുകളില് ഇ-മെയില് വിലാസം നല്കൂ",
"All messages": "എല്ലാ സന്ദേശങ്ങളും",
"All messages (loud)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)",
- "%(appName)s via %(browserName)s on %(osName)s": "%(osName)ല് %(browserName) വഴി %(appName)"
+ "%(appName)s via %(browserName)s on %(osName)s": "%(osName)sല് %(browserName)s വഴി %(appName)s"
}
diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json
index 70860d27..d3d9483c 100644
--- a/src/i18n/strings/nl.json
+++ b/src/i18n/strings/nl.json
@@ -1,51 +1,51 @@
{
- "Add an email address above to configure email notifications": "Voeg een email adres toe om email notificaties te ontvangen",
- "Advanced notification settings": "Geavanceerde notificatie instellingen",
+ "Add an email address above to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen te ontvangen",
+ "Advanced notification settings": "Geavanceerde meldingsinstellingen",
"All messages": "Alle berichten",
"All messages (loud)": "Alle berichten (luid)",
- "All notifications are currently disabled for all targets.": "Alle notificaties zijn op het moment uitgeschakeld voor alle doelen.",
- "An error occurred whilst saving your email notification preferences.": "Er is een fout ontstaan tijdens het opslaan van jouw email notificatie voorkeuren.",
- "Call invitation": "Audio gesprek uitnodiging",
- "Cancel Sending": "Annuleren verzending",
- "Can't update user notification settings": "Het is niet gelukt om de gebruiker notificatie instellingen bij te werken",
+ "All notifications are currently disabled for all targets.": "Alle meldingen zijn momenteel uitgeschakeld voor alle doelen.",
+ "An error occurred whilst saving your email notification preferences.": "Er is een fout opgetreden tijdens het opslaan van uw e-mailmeldingsvoorkeuren.",
+ "Call invitation": "Oproep-uitnodiging",
+ "Cancel Sending": "Versturen annuleren",
+ "Can't update user notification settings": "Het is niet gelukt om de meldingsinstellingen van de gebruiker bij te werken",
"Close": "Sluiten",
- "Create new room": "Maak een nieuwe kamer",
- "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix kamer te vinden",
- "Custom Server Options": "Aangepaste server instellingen",
- "customServer_text": "Je kunt de aangepaste server instellingen gebruiken om in te loggen bij andere Matrix servers door een andere home server URL in te voeren. Dit maakt het mogelijk om Riot te gebruiken met een bestaand Matrix account op een andere home server.
Je kunt ook een aangepaste identiteit server instellen, maar het is dan niet mogelijk om gebruikers uit te nodigen met behulp van een email adres of zelf uitgenodigt te worden met een email adres.",
+ "Create new room": "Een nieuwe kamer maken",
+ "Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix-kamer te vinden",
+ "Custom Server Options": "Aangepaste serverinstellingen",
+ "customServer_text": "U kunt de aangepaste serverinstellingen gebruiken om in te loggen bij andere Matrix-servers door een andere homeserver-URL in te voeren. Dit maakt het mogelijk om Riot te gebruiken met een bestaand Matrix-account op een andere homeserver.
U kunt ook een aangepaste identiteitsserver instellen, maar het is dan niet mogelijk om gebruikers uit te nodigen met behulp van een e-mailadres of zelf uitgenodigd te worden met een e-mailadres.",
"delete the alias.": "verwijder de alias.",
- "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Verwijder de alias %(alias)s en verwijder %(name)s uit de map?",
- "Direct Chat": "Privé gesprek",
- "Directory": "Kamer lijst",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "De alias %(alias)s verwijderen en %(name)s uit de kamerlijst verwijderen?",
+ "Direct Chat": "Privégesprek",
+ "Directory": "Kamerlijst",
"Dismiss": "Afwijzen",
"Download this file": "Download dit bestand",
- "Enable audible notifications in web client": "Zet notificaties aan in de web client",
- "Enable desktop notifications": "Zet desktop notificaties aan",
- "Enable email notifications": "Zet email notificaties aan",
- "Enable notifications for this account": "Zet notificaties aan voor dit account",
- "Enable them now": "Zet ze nu aan",
- "Enter keywords separated by a comma:": "Voeg trefwoorden toe, gesplitst door een komma:",
+ "Enable audible notifications in web client": "Geluidsmeldingen in de webclient aanzetten",
+ "Enable desktop notifications": "Desktopmeldingen aanzetten",
+ "Enable email notifications": "E-mailmeldingen aanzetten",
+ "Enable notifications for this account": "Meldingen voor dit account aanzetten",
+ "Enable them now": "Deze nu aanzetten",
+ "Enter keywords separated by a comma:": "Voeg trefwoorden toe, gescheiden door een komma:",
"Error": "Fout",
- "Error saving email notification preferences": "Fout bij het opslaan van de email notificatie voorkeuren",
+ "Error saving email notification preferences": "Fout bij het opslaan van de meldingsvoorkeuren voor e-mail",
"#example": "#voorbeeld",
"Failed to": "Mislukt om",
"Failed to add tag %(tagName)s to room": "Mislukt om de label %(tagName)s aan de kamer toe te voegen",
- "Failed to change settings": "Het is mislukt om de instellingen te wijzigen",
- "Failed to forget room %(errCode)s": "Het is mislukt om de kamer te vergeten %(errCode)s",
- "Failed to update keywords": "Het is mislukt om de trefwoorden bij te werken",
- "Failed to get protocol list from Home Server": "Het is mislukt om de protocol lijst op te halen van de home server",
- "Failed to get public room list": "Het is mislukt om de lijst van publieke kamers op te halen",
- "Failed to join the room": "Het is mislukt om de kamer toe te treden",
- "Failed to remove tag %(tagName)s from room": "Het is mislukt om de label %(tagName)s van de kamer te verwijderen",
- "Failed to set direct chat tag": "Het is mislukt om de privé chat label weg te halen",
+ "Failed to change settings": "Instellingen wijzigen mislukt",
+ "Failed to forget room %(errCode)s": "Ruimte vergeten mislukt %(errCode)s",
+ "Failed to update keywords": "Trefwoorden bijwerken mislukt",
+ "Failed to get protocol list from Home Server": "Protocollijst ophalen van de homeserver mislukt",
+ "Failed to get public room list": "Lijst met publieke kamers ophalen mislukt",
+ "Failed to join the room": "Kamer binnengaan mislukt",
+ "Failed to remove tag %(tagName)s from room": "Label %(tagName)s van de kamer verwijderen mislukt",
+ "Failed to set direct chat tag": "Het is mislukt om het privéchatlabel weg te halen",
"Favourite": "Favoriet",
"Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt",
"Files": "Bestanden",
- "Filter room names": "Filter kamer namen",
+ "Filter room names": "Filter kamernamen",
"Forget": "Vergeten",
" from room": " van kamer",
- "Guests can join": "Gasten kunnen toe treden",
- "Guest users can't invite users. Please register to invite.": "Gasten kunnen geen gebruikers uitnodigen. Om anderen uit te nodigen zult u moeten registreren.",
+ "Guests can join": "Gasten kunnen deelnemen",
+ "Guest users can't invite users. Please register to invite.": "Gasten kunnen geen gebruikers uitnodigen. Om anderen uit te nodigen zult u zich moeten registreren.",
"Invite to this room": "Uitnodigen voor deze kamer",
"Keywords": "Trefwoorden",
"Leave": "Verlaten",
@@ -54,57 +54,57 @@
"Mentions only": "Alleen vermeldingen",
"Messages containing my display name": "Berichten die mijn weergavenaam bevatten",
"Messages containing my user name": "Berichten die mijn gebruikersnaam bevatten",
- "Messages in group chats": "Berichten in groep gesprekken",
- "Messages in one-to-one chats": "Berichten in één-op-één gesprekken",
- "Messages sent by bot": "Berichten verzonden bij een bot",
+ "Messages in group chats": "Berichten in groepsgesprekken",
+ "Messages in one-to-one chats": "Berichten in één-op-één-gesprekken",
+ "Messages sent by bot": "Berichten verzonden door een bot",
"more": "meer",
"Mute": "Dempen",
"No rooms to show": "Geen kamers om te laten zien",
"Noisy": "Luidruchtig",
- "Notification targets": "Notificatie doelen",
- "Notifications": "Notificaties",
- "Notifications on the following keywords follow rules which can’t be displayed here:": "Notificaties op de volgende trefwoorden volgen regels die hier niet kunnen worden laten zien:",
- "Notify for all other messages/rooms": "Informeer mij voor alle andere berichten/kamers",
- "Notify me for anything else": "Informeer mij voor al het andere",
+ "Notification targets": "Meldingsdoelen",
+ "Notifications": "Meldingen",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Meldingen op de volgende trefwoorden volgen regels die hier niet kunnen worden getoond:",
+ "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/kamers",
+ "Notify me for anything else": "Stuur een melding voor al het andere",
"Off": "Uit",
"On": "Aan",
"Operation failed": "Actie mislukt",
- "Permalink": "Permalink",
- "Please Register": "Registreer alsjeblieft",
- "powered by Matrix": "aangedreven door Matrix",
- "Quote": "Quote",
+ "Permalink": "Permanente link",
+ "Please Register": "Registreer Alstublieft",
+ "powered by Matrix": "mogelijk gemaakt door Matrix",
+ "Quote": "Citeer",
"Reject": "Afwijzen",
- "Remove %(name)s from the directory?": "Verwijder %(name)s uit de kamer lijst?",
- "Remove": "Verwijder",
- "remove %(name)s from the directory.": "verwijder %(name)s uit de kamer lijst.",
- "Remove from Directory": "Verwijder uit de kamer lijst",
+ "Remove %(name)s from the directory?": "%(name)s uit de kamerlijst verwijderen?",
+ "Remove": "Verwijderen",
+ "remove %(name)s from the directory.": "verwijder %(name)s uit de kamerlijst.",
+ "Remove from Directory": "Uit de kamerlijst verwijderen",
"Resend": "Opnieuw verzenden",
- "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet toetreden tot een kamer op dit netwerk",
- "Room directory": "Kamer lijst",
+ "Riot does not know how to join a room on this network": "Riot weet niet hoe het moet deelnemen in een kamer op dit netwerk",
+ "Room directory": "Kamerlijst",
"Room not found": "De kamer is niet gevonden",
- "Search for a room": "Zoek naar een kamer",
+ "Search for a room": "Een kamer opzoeken",
"Settings": "Instellingen",
- "Source URL": "Bron URL",
- "Start chat": "Start gesprek",
+ "Source URL": "Bron-URL",
+ "Start chat": "Gesprek starten",
"The Home Server may be too old to support third party networks": "De home server is misschien te oud om netwerken van derde partijen te ondersteunen",
- "There are advanced notifications which are not shown here": "Er zijn geavanceerde notificaties die hier niet worden laten zien",
- "The server may be unavailable or overloaded": "De server is misschien niet beschikbaar of overbeladen",
- "This room is inaccessible to guests. You may be able to join if you register.": "Deze kamer is niet toegankelijk voor gasten. Je zou misschien toe kunnen treden als je geregistreerd bent.",
+ "There are advanced notifications which are not shown here": "Er zijn geavanceerde notificaties die hier niet getoond worden",
+ "The server may be unavailable or overloaded": "De server is misschien niet beschikbaar of overbelast",
+ "This room is inaccessible to guests. You may be able to join if you register.": "Deze kamer is niet toegankelijk voor gasten. Je zou misschien kunnen deelnemen als je geregistreerd bent.",
" to room": " naar kamer",
- "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatie doelen op te halen",
+ "Unable to fetch notification target list": "Het is mislukt om de lijst van notificatiedoelen op te halen",
"Unable to join network": "Het is mislukt om toe te treden tot dit netwerk",
- "Unable to look up room ID from server": "Het is mislukt om de kamer ID op te halen van de server",
+ "Unable to look up room ID from server": "Het is mislukt om de kamer-ID op te halen van de server",
"Unhide Preview": "Zichtbaar maken preview",
- "unknown error code": "niet bekende foutcode",
+ "unknown error code": "onbekende foutcode",
"Unnamed room": "Kamer zonder naam",
"Uploaded on %(date)s by %(user)s": "Geüpload op %(date)s door %(user)s",
- "View Decrypted Source": "Bekijk gedecodeerde bron",
+ "View Decrypted Source": "Bekijk ontsleutelde bron",
"View Source": "Bekijk bron",
- "When I'm invited to a room": "Wanneer ik uitgenodigt wordt naar een kamer",
+ "When I'm invited to a room": "Wanneer ik uitgenodigd word voor een kamer",
"World readable": "Door iedereen leesbaar",
- "You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. %(code)s)",
+ "You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Je kunt dit bericht niet verwijderen. (%(code)s)",
- "You are not receiving desktop notifications": "Je ontvangt momenteel geen desktop notificaties",
+ "You are not receiving desktop notifications": "Je ontvangt momenteel geen desktopmeldingen",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Je hebt ze mogelijk ingesteld in een andere client dan Riot. Je kunt ze niet aanpassen in Riot maar ze zijn wel actief",
"Sunday": "Zondag",
"Monday": "Maandag",
@@ -115,11 +115,88 @@
"Saturday": "Zaterdag",
"Today": "Vandaag",
"Yesterday": "Gisteren",
- "Welcome page": "Welkom pagina",
- "Drop here %(toAction)s": "%(toAction)s hier naar toe verplaatsen",
- "Failed to set Direct Message status of room": "Het is mislukt om de directe berichten status van de kamer in te stellen",
+ "Welcome page": "Welkomstpagina",
+ "Drop here %(toAction)s": "%(toAction)s hier naartoe verplaatsen",
+ "Failed to set Direct Message status of room": "Het is mislukt om de directe-berichtenstatus van de kamer in te stellen",
"Redact": "Redigeren",
- "A new version of Riot is available.": "Nieuwe Riot versie is beschikbaar.",
- "All Rooms": "Alle Kamers",
- "Cancel": "Annuleer"
+ "A new version of Riot is available.": "Er is een nieuwe versie van Riot beschikbaar.",
+ "All Rooms": "Alle kamers",
+ "Cancel": "Annuleren",
+ "Safari and Opera work too.": "Safari en Opera werken ook.",
+ "Changelog": "Logboek van wijzigingen",
+ "Collapse panel": "Paneel inklappen",
+ "Collecting app version information": "App-versieinformatie verzamelen",
+ "Collecting logs": "Logboeken verzamelen",
+ "Describe your problem here.": "Beschrijf uw probleem hier.",
+ "Expand panel": "Paneel uitklappen",
+ "Failed to send report: ": "Rapport verzenden mislukt: ",
+ "Forward Message": "Bericht doorsturen",
+ "Hide panel": "Paneel verbergen",
+ "(HTTP status %(httpStatus)s)": "(HTTP-status %(httpStatus)s)",
+ "I understand the risks and wish to continue": "Ik begrijp de risico's en wil graag verder gaan",
+ "Login": "Aanmelden",
+ "Loading bug report module": "Bugrapporteermodule laden",
+ "Messages containing keywords": "Berichten die trefwoorden bevatten",
+ "Please install Chrome or Firefox for the best experience.": "Installeer Chrome of Firefox voor de beste ervaring.",
+ "Report a bug": "Een bug rapporteren",
+ "Riot Desktop on %(platformName)s": "Riot Desktop op %(platformName)s",
+ "Riot is not supported on mobile web. Install the app?": "Riot wordt niet ondersteund op het mobiele web. Wil je de app installeren?",
+ "Search": "Zoeken",
+ "Search…": "Zoeken…",
+ "Send": "Versturen",
+ "Send logs": "Logboeken versturen",
+ "Sorry, your browser is not able to run Riot.": "Sorry, uw browser werkt niet met Riot.",
+ "This Room": "Deze kamer",
+ "Unavailable": "Niet beschikbaar",
+ "Unknown device": "Onbekend apparaat",
+ "Update": "Bijwerken",
+ "Uploading report": "Rapport uploaden",
+ "What's New": "Wat is er nieuw",
+ "What's new?": "Wat is er nieuw?",
+ "Waiting for response from server": "Wachten op antwoord van de server",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "U gebruikt Riot als gast. Registreren of aanmelden om voor meer kamers en functies!",
+ "OK": "OK",
+ "You need to be using HTTPS to place a screen-sharing call.": "U moet HTTPS gebruiken om een oproep met schermdelen te kunnen starten.",
+ "Welcome to Riot.im": "Welkom bij Riot.im",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Gedecentaliseerd en versleuteld chatten & samenwerken mogelijk gemaakt door [matrix]",
+ "Search the room directory": "De kamerlijst doorzoeken",
+ "Chat with Riot Bot": "Met Riot Bot chatten",
+ "Get started with some tips from Riot Bot!": "Begin met enkele tips van Riot Bot!",
+ "General discussion about Matrix and Riot": "Algemene discussie over Matrix en Riot",
+ "Discussion of all things Matrix!": "Discussie over alles wat met Matrix te maken heeft!",
+ "Riot/Web & Desktop chat": "Riot/Web & Desktop-chat",
+ "Riot/iOS & matrix-ios-sdk chat": "Riot/iOS & matrix-ios-sdk-chat",
+ "Riot/Android & matrix-android-sdk chat": "Riot/Android & matrix-android-sdk-chat",
+ "Matrix technical discussions": "Technische discussies over Matrix",
+ "Running Matrix services": "Matrixdiensten beheren",
+ "Community-run support for Synapse": "Synapse-ondersteuning vanuit de gemeenschap",
+ "Admin support for Dendrite": "Beheerondersteuning voor Dendrite",
+ "Announcements about Synapse releases": "Aankondigingen over Synapse-uitgaven",
+ "Support for those using and running matrix-appservice-irc": "Ondersteuning voor gebruikers en beheerders van matrix-appservice-irc",
+ "Building services on Matrix": "Diensten op Matrix bouwen",
+ "Support for those using the Matrix spec": "Ondersteuning voor gebruikers van Matrix-specificatie",
+ "Contributing code to Matrix and Riot": "Code bijdragen aan Matrix en Riot",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Veel kamers bestaan al in Matrix, gelinkt aan bestaande netwerken (Slack, IRC, Gitter, enz.) of onafhankelijk. Bekijk de kamerlijst!",
+ "Failed to change password. Is your password correct?": "Wachtwoord wijzigen mislukt. Is uw wachtwoord juist?",
+ "You have successfully set a password!": "U heeft met succes een wachtwoord ingesteld!",
+ "You can now return to your account after signing out, and sign in on other devices.": "U kunt nu terugkeren naar uw account nadat u bent afgemeld, en u aanmelden op andere apparaten.",
+ "Continue": "Doorgaan",
+ "Please set a password!": "Stel een wachtwoord in!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Hiermee kunt u naar uw account terugkeren nadat u zich heeft afgemeld, en u aanmelden op andere apparaten.",
+ "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s op %(osName)s",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Beschrijf de bug. Wat deed u? Wat verwachtte u? Wat gebeurde er daadwerkelijk?",
+ "Please describe the bug and/or send logs.": "Beschrijf de bug en/of verstuur logboeken.",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot gebrukt veel geavanceerde browserfuncties, waarvan enkele niet (of experimenteel) in uw webbrowser beschikbaar zijn.",
+ "Co-ordination for Riot/Web translators": "Coördinatie voor Riot/Web-vertalers",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Om diagnose van het probleem mogelijk te maken worden logboeken van deze client met het bugrapport meegestuurd. Schakel dit vinkje uit als u slechts de bovenstaande tekst mee wil sturen:",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Met uw huidige browser kan de applicatie er volledig incorrect uitzien. Tevens is het mogelijk dat niet alle functies naar behoren werken. U kunt doorgaan als u het toch wil proberen, maar bij problemen bent u volledig op uzelf aangewezen!",
+ "Design and implementation of E2E in Matrix": "Ontwerp en implementatie van E2E in Matrix",
+ "Implementing VR services with Matrix": "Implementatie van VR-diensten met Matrix",
+ "Implementing VoIP services with Matrix": "Implementatie van VoIP-diensten met Matrix",
+ "Discussion of the Identity Service API": "Discussie over de Identity Service API",
+ "Support for those using, running and writing other bridges": "Ondersteuning voor het gebruiken, draaien en ontwikkelen aan andere bruggen",
+ "Dev chat for the Riot/Web dev team": "Dev-chat voor het Riot/Web ontwikkelteam",
+ "Dev chat for the Dendrite dev team": "Dev-chat voor het Dendrite ontwikkelteam",
+ "You have successfully set a password and an email address!": "Het instellen van een wachtwoord en e-mailadres is geslaagd!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Onthoud dat u altijd een e-mailadres in kan stellen in de gebruikersinstellingen als u zich bedenkt."
}
diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json
index 953aaa1f..c6086c98 100644
--- a/src/i18n/strings/pl.json
+++ b/src/i18n/strings/pl.json
@@ -25,12 +25,12 @@
"Directory": "Księga adresowa",
"Download this file": "Pobierz plik",
"Welcome page": "Strona powitalna",
- "Riot is not supported on mobile web. Install the app?": "Riot nie jest obsługiwany przez mobilną przeglądarkę internetową. Zainstaluj aplikację?",
- "Room directory": "Katalog pokojowy",
+ "Riot is not supported on mobile web. Install the app?": "Riot nie jest obsługiwany przez przeglądarki mobilne. Zainstaluj aplikację?",
+ "Room directory": "Spis pokojów",
"Search": "Szukaj",
"Search…": "Szukaj…",
"Search for a room": "Szukaj pokoju",
- "Send": "Wysłać",
+ "Send": "Wyślij",
"Settings": "Ustawienia",
"Collapse panel": "Ukryj panel",
"customServer_text": "Możesz używać opcji serwera niestandardowego do logowania się na inne serwery Matrix, określając inny adres URL serwera domowego. Pozwala to na wykorzystanie Riot z istniejącym kontem Matrix na innym serwerze domowym.
Można również ustawić niestandardowy serwer tożsamości, ale nie będzie można zapraszać użytkowników adresem e-mail, ani być zaproszony przez adres e-mailowy.",
@@ -70,9 +70,135 @@
"Keywords": "Słowa kluczowe",
"Loading bug report module": "Ładowanie modułu raportu błędów",
"Low Priority": "Niski priorytet",
- "Messages containing keywords": "Wiadomości zawierające słowa kluczowe",
- "Messages containing my user name": "Wiadomości zawierające mój użytkownik",
+ "Messages containing keywords": "Wiadomości zawierające słowa kluczowe",
+ "Messages containing my user name": "Wiadomości zawierające moją nazwę użytkownika",
"Messages in group chats": "Wiadomości w czatach grupowych",
- "Messages sent by bot": "Wiadomości wysłane przez robota",
- "more": "więcej"
+ "Messages sent by bot": "Wiadomości wysłane przez bota",
+ "more": "więcej",
+ "Enable desktop notifications": "Włącz powiadomienia",
+ "Guest users can't invite users. Please register to invite.": "Gość nie ma uprawnień dow wysyłania zaproszeń. Proszę się zarejestrować.",
+ "(HTTP status %(httpStatus)s)": "(status HTTP %(httpStatus)s)",
+ "Leave": "Opuść",
+ "Login": "Logowanie",
+ "Members": "Członkowie",
+ "Messages containing my display name": "Wiadomości zawierające moją wyświetlaną nazwę",
+ "Direct Chat": "Rozmowa bezpośrednia",
+ "Mute": "Wycisz",
+ "No rooms to show": "Brak pokoi do wyświetlenia",
+ "Notifications": "Powiadomienia",
+ "Failed to set direct chat tag": "Nie udało się ustawić znacznika rozmów bezpośrednich",
+ "Failed to set Direct Message status of room": "Nie udało się ustawić statusu Rozmów Bezpośrednich dla pokoju",
+ "Notification targets": "Cele powiadomień",
+ "Operation failed": "Operacja nieudana",
+ "Permalink": "Odnośnik bezpośredni",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Proszę opisz problem (w miarę możliwości po angielsku). Co doprowadziło do błędu? Jakie było Twoje oczekiwanie, a co stało się zamiast tego?",
+ "Please describe the bug and/or send logs.": "Proszę opisz błąd i/lub wyślij logi.",
+ "Please install Chrome or Firefox for the best experience.": "Zainstaluj proszę Chrome lub Firefox.",
+ "Please Register": "Proszę się zarejestrować",
+ "Quote": "Cytat",
+ "Remove %(name)s from the directory?": "Usunąć %(name)s z katalogu?",
+ "Remove from Directory": "Usuń z katalogu",
+ "Report a bug": "Zgłoś błąd",
+ "Resend": "Wyślij jeszcze raz",
+ "Riot Desktop on %(platformName)s": "Riot Desktop na %(platformName)s",
+ "Riot does not know how to join a room on this network": "Riot nie wie, jak dołączyć do pokoju w tej sieci",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot używa wiele zaawansowanych technologii, które nie są dostępne lub są w fazie testów w Twojej przeglądarce.",
+ "Room not found": "Pokój nie znaleziony",
+ "Send logs": "Wyślij logi",
+ "Sorry, your browser is not able to run Riot.": "Przepraszamy, Twoja przeglądarka nie jest w stanie uruchomić Riot.",
+ "Start chat": "Rozpocznij rozmowę",
+ "powered by Matrix": "zbudowane na Matrix",
+ "Redact": "Zredaguj",
+ "Reject": "Odrzuć",
+ "Remove": "Usuń",
+ "remove %(name)s from the directory.": "usuń %(name)s z katalogu.",
+ "The Home Server may be too old to support third party networks": "Serwer domowy może być za stary dla innych sieci",
+ "There are advanced notifications which are not shown here": "Masz zaawansowane powiadomienia, nie pokazane tutaj",
+ "The server may be unavailable or overloaded": "Serwer jest nieosiągalny lub jest przeciążony",
+ "This Room": "Ten pokój",
+ "This room is inaccessible to guests. You may be able to join if you register.": "Ten pokój jest niedostępny dla gości. Możliwe, że będziesz mógł dołączyć po rejestracji.",
+ "Unable to join network": "Nie można dołączyć do sieci",
+ "Unable to look up room ID from server": "Nie można wyszukać ID pokoju na serwerze",
+ "Unavailable": "Niedostępny",
+ "Unhide Preview": "Odkryj podgląd",
+ "Unknown device": "Nieznane urządzenie",
+ "unknown error code": "nieznany kod błędu",
+ "Unnamed room": "Pokój bez nazwy",
+ "Update": "Uaktualnienie",
+ "Uploaded on %(date)s by %(user)s": "Wysłane %(date)s przez %(user)s",
+ "Uploading report": "Raport wysyłania",
+ "Messages in one-to-one chats": "Wiadomości w rozmowach jeden-na-jeden",
+ "Noisy": "Głośny",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Powiadomienia o słowach kluczowych spełniają reguły, które nie mogą być tu wyświetlone:",
+ "Notify for all other messages/rooms": "Powiadamiaj o wszystkich innych wiadomośsciach/pokojach",
+ "Notify me for anything else": "Powiadom mnie o całej reszcie",
+ "Off": "Wyłącz",
+ "On": "Włącz",
+ "Source URL": "Źródłowy URL",
+ " to room": " do pokoju",
+ "Unable to fetch notification target list": "Nie można pobrać listy docelowej dla powiadomień",
+ "View Decrypted Source": "Pokaż zdeszyfrowane źródło",
+ "View Source": "Pokaż źródło",
+ "What's New": "Co nowego",
+ "What's new?": "Co nowego?",
+ "Waiting for response from server": "Czekam na odpowiedź serwera",
+ "When I'm invited to a room": "Kiedy zostanę zaproszony do pokoju",
+ "World readable": "Całkowicie publiczne",
+ "You cannot delete this image. (%(code)s)": "Nie możesz usunąć tego obrazka. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "Nie możesz usunąć tej wiadomości. (%(code)s)",
+ "You are not receiving desktop notifications": "Nie otrzymujesz powiadomień na pulpit",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "You are Rioting jako gość. Zarejestruj się albo zaloguj się aby uzyskać dostęp do pokojów lub dodatkowych możliwości!",
+ "Sunday": "Niedziela",
+ "Monday": "Poniedziałek",
+ "Tuesday": "Wtorek",
+ "Wednesday": "Środa",
+ "Thursday": "Czwartek",
+ "Friday": "Piątek",
+ "Saturday": "Sobota",
+ "Today": "Dzisiaj",
+ "Yesterday": "Wczoraj",
+ "OK": "OK",
+ "You need to be using HTTPS to place a screen-sharing call.": "Musisz używać bezpiecznego protokołu HTTPS aby użyć połączenia współdzielenia ekranu.",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Z Twoją obecną przeglądarką, wygląd oraz wrażenia z używania aplikacji mogą być niepoprawne, a niektóre funkcje wcale nie działać. Kontynuuj jeśli chcesz spróbować, jednak trudno będzie pomóc w przypadku błędów, które mogą nastąpić!",
+ "Welcome to Riot.im": "Witamy w Riot.im",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Zdecentralizowany, szyfrowany czat & współpraca wspierana przez [matrix]",
+ "Search the room directory": "Wyszukaj katalog pokojów",
+ "Chat with Riot Bot": "Rozmowa z Botem Riota",
+ "Get started with some tips from Riot Bot!": "Rozpocznij z wskazówkami Riot Bota!",
+ "General discussion about Matrix and Riot": "Generalna rozmowa o Matrix i Riot",
+ "Discussion of all things Matrix!": "Rozmowa o wszystkim Matrixowym!",
+ "Matrix technical discussions": "Dyskusje techniczne Matrixa",
+ "Fetching third party location failed": "Pobranie lokalizacji zewnętrznej nie powiodło się",
+ "Mentions only": "Tylko, gdy wymienieni",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Możliwe, że skofigurowałeś je w innym kliencie, niż Riot. Nie możesz ich zmieniać w Riot, ale nadal mają zastosowanie",
+ "Riot/Web & Desktop chat": "Czat o Riot/Web i Desktop",
+ "Riot/iOS & matrix-ios-sdk chat": "Czat o Riot/iOS i matrix-ios-sdk",
+ "Riot/Android & matrix-android-sdk chat": "Czat o Riot/Android i matrix-android-sdk",
+ "Running Matrix services": "Utrzymywanie usług Matrix",
+ "Community-run support for Synapse": "Wsparcie społeczności dla Synapse",
+ "Admin support for Dendrite": "Wsparcie administratorskie dla Dendrite",
+ "Announcements about Synapse releases": "Ogłoszenia na temat Synapse",
+ "Support for those using and running matrix-appservice-irc": "Wsparcie dla hostujących i korzystających z matrix-appservice-irc",
+ "Building services on Matrix": "Tworzenie usług w oparciu o Matrix",
+ "Support for those using the Matrix spec": "Wsparcie dla używających specyfikacji Matrix",
+ "Design and implementation of E2E in Matrix": "Projektowanie i implementacja szyfrowania klient-klient (end-to-end) w Matrix",
+ "Implementing VR services with Matrix": "Implementowanie usług wirtualnej rzeczywistości w oparciu o Matrix",
+ "Implementing VoIP services with Matrix": "Implementowanie usług telefonii internetowej VoIP w oparciu o Matrix",
+ "Discussion of the Identity Service API": "Dyskusja na temat API Identity Service",
+ "Support for those using, running and writing other bridges": "Wsparcie dla używających, zapewniających i piszących inne mosty",
+ "Contributing code to Matrix and Riot": "Dokładanie kodu do Matrix lub Riot",
+ "Dev chat for the Riot/Web dev team": "Czat deweloperów zespołu Riot/Web",
+ "Dev chat for the Dendrite dev team": "Czat deweloperów zespołu Dendrite",
+ "Co-ordination for Riot/Web translators": "Koordynacja tłumaczy Riot/Web",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Matrix ma wiele, już działających pokoi, połączonych z istniejącymi sieciami, takimi jak Slack, IRC lub Gitter, a także wiele zupełnie niezależnych. Możesz przejrzeć je wszystkie w spisie pokoi!",
+ "Failed to change password. Is your password correct?": "Zmiana hasła nie powiodła się. Czy Twoje hasło jest poprawne?",
+ "You have successfully set a password!": "Hasło zostało zmienione z powodzeniem!",
+ "You can now return to your account after signing out, and sign in on other devices.": "Teraz możesz powrócić do swojego konta na innych urządzeniach po wylogowaniu i ponownym zalogowaniu się.",
+ "Continue": "Kontynuuj",
+ "Please set a password!": "Proszę, ustaw hasło!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "To pozwoli Ci powrócić do Twojego konta po wylogowaniu i ponownym zalogowaniu się na innych urządzeniach.",
+ "You have successfully set a password and an email address!": "Z powodzeniem ustawiono hasło i adres e-mail dla Twojego konta!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Pamiętaj, że zawsze możesz zmienić swój e-mail lub hasło w panelu ustawień użytkownika.",
+ "To return to your account in future you need to set a password": "Aby wrócić do swojego konta w przyszłości musisz ustawić hasło ",
+ "Set Password": "Ustaw hasło"
}
diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json
index 436e15bc..819ac462 100644
--- a/src/i18n/strings/pt_BR.json
+++ b/src/i18n/strings/pt_BR.json
@@ -198,6 +198,10 @@
"Continue": "Continuar",
"Please set a password!": "Por favor, defina uma senha!",
"This will allow you to return to your account after signing out, and sign in on other devices.": "Isso permitirá que você possa retornar à sua conta após fazer logout, e também fazer login em outros dispositivos.",
- " (HTTP status %(httpStatus))": "(Status HTTP %(httpStatus))",
- "Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo impulsionado por [matrix]"
+ "(HTTP status %(httpStatus)s)": "(Status HTTP %(httpStatus)s)",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo impulsionado por [matrix]",
+ "You have successfully set a password and an email address!": "Você definiu uma senha e um endereço de e-mail com sucesso!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Lembre-se: você pode sempre definir um endereço de e-mail nas configurações de usuário, se mudar de ideia.",
+ "To return to your account in future you need to set a password": "Para poder, futuramente, retornar à sua conta, você precisa definir uma senha",
+ "Set Password": "Definir senha"
}
diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json
index b9dcf10d..d429b41d 100644
--- a/src/i18n/strings/ru.json
+++ b/src/i18n/strings/ru.json
@@ -5,9 +5,9 @@
"and remove": "и удалить",
"Can't update user notification settings": "Не возможно обновить пользовательские настройки оповещения",
"Create new room": "Создать новую комнату",
- "Couldn't find a matching Matrix room": "Не возможно найти подходящую Матриксу комнату",
- "Custom Server Options": "Расширенные настройки сервера",
- "delete the alias.": "удалить привязку.",
+ "Couldn't find a matching Matrix room": "Не возможно найти подходящую комнату Matrix",
+ "Custom Server Options": "Собственные настройки сервера",
+ "delete the alias.": "удалить псевдоним.",
"Delete the room alias": "Удалить привязку комнаты",
"Direct Chat": "Приватный чат",
"Directory": "Каталог",
@@ -30,16 +30,16 @@
"Failed to get public room list": "Не удалось получить список открытых комнат",
"Failed to join the room": "Не удалось войти в комнату",
"Failed to remove tag ": "Не удалось удалить тег ",
- "Failed to set Direct Message status of room": "Не удалось задать статус комнаты Персональное Сообщение",
+ "Failed to set Direct Message status of room": "Не удалось установить статус прямого сообщения в комнате",
"Favourite": "Избранное",
- "Fetching third party location failed": "Не удалось получить местоположение",
+ "Fetching third party location failed": "Не удалось получить другую локацию",
"Files": "Файлы",
- "Filter room names": "Фильтр по назв. комнаты",
- "Forget": "Забыть",
+ "Filter room names": "Фильтр по названию комнат",
+ "Forget": "Удалить",
"from the directory": "из каталога",
" from room": " из комнаты",
"Guests can join": "Гость может присоединиться",
- "Guest users can't invite users. Please register to invite.": "Гость не может приглашать пользователей. Зарегистрируйтесь для приглашений.",
+ "Guest users can't invite users. Please register to invite.": "Гость не может приглашать пользователей. Пожалуйста зарегистрируйтесь.",
"Invite to this room": "Пригласить",
"Keywords": "Ключевые слова",
"Leave": "Покинуть",
@@ -51,12 +51,12 @@
"Notifications": "Уведомления",
"Notifications on the following keywords follow rules which can’t be displayed here:": "Уведомления по следующим ключевым словам соответствуют правилам, которые нельзя отобразить здесь:",
"Notify for all other messages/rooms": "Уведомить обо всех других сообщениях/комнатах",
- "Notify me for anything else": "Уведомить меня обо всем кроме",
+ "Notify me for anything else": "Уведомить меня о чем либо еще",
"Off": "Выключить",
"On": "Включить",
"Operation failed": "Действие не удалось",
"Please Register": "Пожалуйста, зарегистрируйтесь",
- "powered by Matrix": "управляемый с Matrix",
+ "powered by Matrix": "Основано на Matrix",
"Reject": "Отклонить",
"Remove": "Удалить",
"remove": "удалить",
@@ -86,14 +86,14 @@
"Close": "Закрыть",
"Download this file": "Скачать этот файл",
"Drop here %(toAction)s": "Вставить сюда: %(toAction)s",
- "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Удалить псевдоним комнаты %(alias)s и очистить %(name)s из каталога?",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Удалить псевдоним комнаты %(alias)s и удалить %(name)s из каталога?",
"Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату",
- "Failed to forget room %(errCode)s": "Не удалось забыть комнату %(errCode)s",
+ "Failed to forget room %(errCode)s": "Не удалось удалить комнату %(errCode)s",
"Failed to remove tag %(tagName)s from room": "Не удалось убрать пометку %(tagName)s из комнаты",
- "Failed to set direct chat tag": "Не удалось пометить прямую беседу",
+ "Failed to set direct chat tag": "Не удалось установить тег прямого чата",
"Unhide Preview": "Показать анонс",
"Uploaded on %(date)s by %(user)s": "Загружено %(date)s %(user)s",
- "View Decrypted Source": "Просмотр зашифрованного источника",
+ "View Decrypted Source": "Просмотр расшифрованного источника",
"View Source": "Просмотр источника",
"You cannot delete this image. (%(code)s)": "Вы не можете удалить это изображение. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Вы не можете удалить это сообщение. (%(code)s)",
@@ -113,13 +113,13 @@
"Redact": "Удалить",
"Remove %(name)s from the directory?": "Удалить %(name)s из каталога?",
"remove %(name)s from the directory.": "удалить %(name)s из каталога.",
- "Resend": "Переслать снова",
+ "Resend": "Отправить снова",
"Source URL": "Исходный URL",
"Welcome page": "Домашняя страница",
"Advanced notification settings": "Настройки уведомлений",
"Call invitation": "Пригласительный звонок",
"customServer_text": "Вы можете войти с помощью вашего сервера. Это позволяет вам использовать Riot с уже существующей учетной записью на другом сервере.
Вы также можете задать свой сервер идентификации, но тогда вы не можете приглашать пользователей с помощью email-адреса и не можете быть приглашены по нему.",
- "Messages containing my display name": "Сообщения, содержащие мое отображаемое имя",
+ "Messages containing my display name": "Сообщения, содержащие мое имя",
"Messages containing my user name": "Сообщение, содержащие мое имя пользователя",
"Messages in group chats": "Сообщения в групповых чатах",
"Messages in one-to-one chats": "Сообщения в приватных чатах",
@@ -131,31 +131,31 @@
"Cancel": "Отмена",
"Changelog": "История изменений",
"Collapse panel": "Свернуть панель",
- "Collecting app version information": "Сбор информации о версиях программы",
+ "Collecting app version information": "Сбор информации о версии приложения",
"Collecting logs": "Сбор протоколов",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s с %(browserName)s на %(osName)s",
"Safari and Opera work too.": "Safari и Opera работают тоже.",
"Describe your problem here.": "Опиши здесь свою проблему.",
- "Expand panel": "Открыть панель",
+ "Expand panel": "Развернуть панель",
"Failed to send report: ": "Не удалось отослать отчет: ",
- "Forward Message": "Переслать сообщение дальше",
+ "Forward Message": "Переслать сообщение",
"Hide panel": "Скрыть панель",
- "I understand the risks and wish to continue": "Я понимаю риск и хочу продолжать",
- "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Что бы выявить проблему, будет отослан журнал этого клиента с сообщением о ошибке. Если ты только верхний текст отослать хочешь, отключи следующее:",
- "Loading bug report module": "Загрузи Модуль ошибок",
+ "I understand the risks and wish to continue": "Я понимаю риск и хочу продолжить",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Чтобы диагностировать проблемы, логи этого клиента будут отправляться с этим сообщением об ошибке. Если вы предпочитаете отправить только текст выше, пожалуйста, отключите:",
+ "Loading bug report module": "Загрузка Модуля отчета об ошибках",
"Messages containing keywords": "Сообщения, которые содержат определенные ключевые слова",
- "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Пожалуйста опиши (на Английском) ошибку. Что ты делал? Что ты ожидал получить? Что произошло?",
- "Please describe the bug and/or send logs.": "Пожалуйста опиши ошибку и/или перешли протоколы.",
- "Please install Chrome or Firefox for the best experience.": "Пожалуйста установите Chrome или Firefox для лучшего результата.",
- "Report a bug": "Отчет о ошибке",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Пожалуйста опишите (на Английском) ошибку. Что Вы делали? Что Вы ожидали получить? Что произошло?",
+ "Please describe the bug and/or send logs.": "Пожалуйста опишите ошибку и/или перешлите логи.",
+ "Please install Chrome or Firefox for the best experience.": "Пожалуйста установите Chrome или Firefox для корректной работы чата.",
+ "Report a bug": "Отчет об ошибке",
"Riot Desktop on %(platformName)s": "Riot Desktop на %(platformName)s",
- "Riot is not supported on mobile web. Install the app?": "Riot не будет на мобильном Интернете работать. Программу инсталлировать?",
- "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует некоторые расширенные функции интернет-проводника - некоторые из них отсутствуют или экспериментальные в этом проводнике.",
+ "Riot is not supported on mobile web. Install the app?": "Riot может некорректно работать в мобильном браузере. Установить мобильное приложение?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует много расширенных функции интернет-браузера - некоторые из них отсутствуют или экспериментальные в этом браузере.",
"Search": "Поиск",
"Search…": "Поиск.…",
"Send": "Отослать",
- "Send logs": "Отослать протокол",
- "Sorry, your browser is not able to run Riot.": "Извините, ваш браузер не может Riot запустить.",
+ "Send logs": "Отослать логи",
+ "Sorry, your browser is not able to run Riot.": "Извините, ваш браузер не может запустить Riot.",
"This Room": "Эта комната",
"Unavailable": "Недоступен",
"Unknown device": "Неизвестное устройство",
@@ -164,36 +164,36 @@
"What's New": "Что нового",
"What's new?": "Что нового?",
"Waiting for response from server": "Подождите ответа от сервера",
- "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Вы пользуетесь Riot как гость. Зарегистрируйтесь или войдите в систему и получите доступ к огромному количеству комнат и функций!",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Вы вошли в Riot как гость. Зарегистрируйтесь или войдите в систему и получите доступ к огромному количеству комнат и функций!",
"OK": "ОК",
- "You need to be using HTTPS to place a screen-sharing call.": "Вы должны пользоваться HTTPS чтобы пользоваться видео звонком.",
- "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Если ваш браузер не корректно отображает информацию и все или некоторые функции отключены, вы можете и дальше этим браузером пользоваться но ваши проблемы останутся с вами!",
+ "You need to be using HTTPS to place a screen-sharing call.": "Используйте протокол HTTPS чтобы совершать видео вызов.",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Если Ваш браузер не корректно отображает информацию и все или некоторые функции отключены, Вы можете и дальше этим браузером пользоваться но ваши проблемы останутся с вами!",
"Login": "Войти",
- "Welcome to Riot.im": "Добро пожаловать на Riot.im",
+ "Welcome to Riot.im": "Добро пожаловать в Riot.im",
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Децентрализованное, шифрованное общение и сотрудничество на основе [matrix]",
"Search the room directory": "Поиск по директории комнат",
- "Chat with Riot Bot": "Пообщаться с Riot Bot",
+ "Chat with Riot Bot": "Пообщаться с ботом Riot",
"Get started with some tips from Riot Bot!": "Начните с некоторых советов от Riot бота!",
"General discussion about Matrix and Riot": "Общая дискуссия о Matrix и Riot",
"Discussion of all things Matrix!": "Дискуссия обо всем Matrix!",
- "Riot/Web & Desktop chat": "Riot-Web & Desktop-Чат",
+ "Riot/Web & Desktop chat": "Riot-Web & Desktop чат",
"Matrix technical discussions": "Техническая дискуссия о Matrix",
- "Running Matrix services": "Предлагать Matrix-Сервис",
+ "Running Matrix services": "Запуск сервиса Matrix",
"Community-run support for Synapse": "Поддержка Synapse от сообщества",
"Admin support for Dendrite": "Админ. помощь для Dendrite",
- "Building services on Matrix": "Построить услуги для Matrix",
+ "Building services on Matrix": "Разработка сервисов на Matrix",
"Implementing VoIP services with Matrix": "Внедрение услуги VoIP с Matrix",
- " (HTTP status %(httpStatus))": "(HTTP-Состояние %(httpStatus))",
- "Riot/iOS & matrix-ios-sdk chat": "Riot-iOS & \"matrix-ios-sdk\"-Чат",
- "Riot/Android & matrix-android-sdk chat": "Riot-Android & matrix-android-sdk-Чат",
+ "(HTTP status %(httpStatus)s)": "(HTTP-статус %(httpStatus)s)",
+ "Riot/iOS & matrix-ios-sdk chat": "Riot-iOS & matrix-ios-sdk чат",
+ "Riot/Android & matrix-android-sdk chat": "Riot-Android & matrix-android-sdk чат",
"Announcements about Synapse releases": "Объявления релизов Synapse",
- "Support for those using and running matrix-appservice-irc": "Поддержка тех, кто matrix-appservice-irc эксплуатирует и использует",
+ "Support for those using and running matrix-appservice-irc": "Поддержка тех, кто использует matrix-appservice-irc",
"You have successfully set a password!": "Вы успешно установили пароль!",
"Continue": "Продолжить",
"Please set a password!": "Задайте пароль!",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "В Matrix существует множество комнат, связанных с существующими сетями (Slack, IRC, Gitter и т.д.) Или независимыми. Ищите в каталоге!",
"Failed to change password. Is your password correct?": "Не удалось сменить пароль. Вы правильно ввели текущий пароль?",
- "You can now return to your account after signing out, and sign in on other devices.": "Теперь вы можете вернуться в свою учетную запись после выхода из системы, и войти в систему на других устройствах.",
+ "You can now return to your account after signing out, and sign in on other devices.": "Теперь Вы можете вернуться в свою учетную запись после выхода из системы, и войти в систему на других устройствах.",
"Support for those using the Matrix spec": "Поддержка для тех, кто использует спецификацию Matrix",
"Design and implementation of E2E in Matrix": "Разработка и внедрение E2E в Matrix",
"Implementing VR services with Matrix": "Внедрение служб VR с помощью Matrix",
@@ -203,5 +203,9 @@
"Dev chat for the Riot/Web dev team": "Dev chat для группы разработчиков Riot/Web",
"Dev chat for the Dendrite dev team": "Dev chat для группы разработчиков Dendrite",
"Co-ordination for Riot/Web translators": "Координирование для переводчиков Riot / Web",
- "This will allow you to return to your account after signing out, and sign in on other devices.": "Это позволит Вам вернуться в свою учетную запись после выхода, и войти в систему на других устройствах."
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Это позволит Вам вернуться в свою учетную запись после выхода, и войти в систему на других устройствах.",
+ "You have successfully set a password and an email address!": "Пароль и адрес электронной почты успешно сохранены!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Помните, Вы всегда можете указать адрес электронной почты в пользовательских настройках, если передумаете.",
+ "Set Password": "Задать пароль",
+ "To return to your account in future you need to set a password": "Чтобы в будущем вернутся к вашей учётной записи, вы должны задать пароль"
}
diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json
index c770dc3e..2465d0ff 100644
--- a/src/i18n/strings/th.json
+++ b/src/i18n/strings/th.json
@@ -171,7 +171,7 @@
"Riot/Web & Desktop chat": "แชทเกี่ยวกับ Riot บนเว็บและเดสก์ทอป",
"Riot/iOS & matrix-ios-sdk chat": "แชทเกี่ยวกับ Riot บน iOS และ matrix-ios-sdk",
"Riot/Android & matrix-android-sdk chat": "แชทเกี่ยวกับ Riot บน Android และ matrix-android-sdk",
- "Matrix technical discussions": "พูดคุยเรื่อง Matrix ทางเทคนิค",
+ "Matrix technical discussions": "พูดคุยเรื่อง Matrix เชิงเทคนิค",
"Running Matrix services": "การติดตั้งบริการ Matrix",
"Community-run support for Synapse": "ฝ่ายสนับสนุน Synapse โดยชุมชนผู้ใช้",
"Admin support for Dendrite": "ฝ่ายสนับสนุน Dendrite จากผู้ดูแล",
@@ -182,7 +182,7 @@
"Implementing VR services with Matrix": "การอิมพลีเมนต์บริการ VR ด้วย Matrix",
"Implementing VoIP services with Matrix": "การอิมพลีเมนต์บริการ VoIP ด้วย Matrix",
"Support for those using, running and writing other bridges": "ฝ่ายสนับสนุนสำหรับผู้ใช้หรือพัฒนาตัวเชื่อมอื่น ๆ",
- "Contributing code to Matrix and Riot": "สมทบโค๊ดกับ Matrix และ Riot",
+ "Contributing code to Matrix and Riot": "สมทบโค๊ดให้ Matrix และ Riot",
"Dev chat for the Riot/Web dev team": "แชทสำหรับทีมพัฒนา Riot บนเว็บ",
"Dev chat for the Dendrite dev team": "แชทสำหรับทีมพัฒนา Dendrite",
"Co-ordination for Riot/Web translators": "แชทสำหรับประสานงานการแปล Riot บนเว็บ",
@@ -197,5 +197,14 @@
"Discussion of the Identity Service API": "พูดคุยเกี่ยวกับ Identity Service API",
"Decentralised, encrypted chat & collaboration powered by [matrix]": "ระบบแชทและประสานงาน ไร้ศูนย์กลางและเข้ารหัสได้ โดยใช้เทคโนโลยีจาก [matrix]",
"General discussion about Matrix and Riot": "พูดคุยเรื่องทั่วไป ทั้ง Matrix และ Riot",
- " (HTTP status %(httpStatus))": "(สถานะ HTTP %(httpStatus))"
+ "(HTTP status %(httpStatus)s)": "(สถานะ HTTP %(httpStatus)s)",
+ "Remember, you can always set an email address in user settings if you change your mind.": "อย่าลืม คุณสามารถตั้งที่อยู่อีเมลในการตั้งค่าผู้ใช้ได้ทุกเมื่อหากคุณเปลี่ยนใจ",
+ "You have successfully set a password and an email address!": "ตั้งรหัสผ่านและที่อยู่อีเมลสำเร็จแล้ว!",
+ "Warning": "คำเตือน",
+ "Checking for an update...": "กำลังตรวจหาอัปเดต...",
+ "Error encountered (%(errorDetail)s).": "เกิดข้อผิดพลาด (%(errorDetail)s)",
+ "No update available.": "ไม่มีอัปเดตที่ใหม่กว่า",
+ "Downloading update...": "กำลังดาวน์โหลดอัปเดต...",
+ "To return to your account in future you need to set a password": "คุณต้องตั้งรหัสผ่านเพื่อจะกลับมาที่บัญชีนี้ในอนาคต",
+ "Set Password": "ตั้งรหัสผ่าน"
}
diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json
new file mode 100644
index 00000000..e62c0d3f
--- /dev/null
+++ b/src/i18n/strings/tr.json
@@ -0,0 +1,202 @@
+{
+ "%(appName)s via %(browserName)s on %(osName)s": "%(osName)s işletim sisteminde %(browserName)s ile %(appName)s",
+ "Safari and Opera work too.": " Safari ve Opera da çalışıyor.",
+ "A new version of Riot is available.": "Riot'un yeni bir versiyonu mevcuttur.",
+ "Add an email address above to configure email notifications": "E-posta bildirimlerini yapılandırmak için yukarıya bir e-posta adresi ekleyin",
+ "Advanced notification settings": "Gelişmiş bildirim ayarları",
+ "All messages": "Tüm mesajlar",
+ "All messages (loud)": "Tüm mesajlar (uzun)",
+ "All Rooms": "Tüm Odalar",
+ "All notifications are currently disabled for all targets.": "Tüm bildirimler şu anda tüm hedefler için devre dışı bırakılmıştır.",
+ "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.",
+ "Call invitation": "Arama davetiyesi",
+ "Cancel": "İptal Et",
+ "Cancel Sending": "Göndermeyi İptal Et",
+ "Can't update user notification settings": "Kullanıcı bildirim ayarları güncellenemiyor",
+ "Changelog": "Değişiklikler",
+ "Close": "Kapat",
+ "Collapse panel": "Katlanır panel",
+ "Collecting app version information": "Uygulama sürümü bilgileri toplanıyor",
+ "Collecting logs": "Kayıtlar toplanıyor",
+ "Create new room": "Yeni Oda Oluştur",
+ "Couldn't find a matching Matrix room": "Eşleşen bir Matrix odası bulunamadı",
+ "Custom Server Options": "Özel Sunucu Seçenekleri",
+ "customServer_text": "Farklı bir Ana Sunucu URL'si belirleyerek başka bir Matrix sunucusunda oturum açmak için Özel Sunucu Seçeneklerini kullanabilirsiniz. Bu , Riot'u mevcut Matrix hesabı ile farklı bir Ana Sunucuda kullanmanıza olanak tanır.
Ayrıca Özel Kimlik Sunucu'da ayarlayabilirsiniz ama kullanıcıları e-posta adresleriyle veya kendi e-posta adresinizle davet edemezsiniz.",
+ "delete the alias.": "Tüm rumuzları sil.",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "%(alias)s oda rumuzu silinsin ve %(name)s dizinden kaldırılsın mı ?",
+ "Describe your problem here.": "Probleminizi burada açıklayın.",
+ "Direct Chat": "Doğrudan Sohbet",
+ "Directory": "Dizin",
+ "Dismiss": "Uzaklaştır",
+ "Download this file": "Bu dosyayı indir",
+ "Drop here %(toAction)s": "%(toAction)s'ı buraya bırak",
+ "Enable audible notifications in web client": "Web istemcisinde sesli bildirimleri etkinleştir",
+ "Enable desktop notifications": "Masaüstü bildirimlerini etkinleştir",
+ "Enable email notifications": "E-posta bildirimlerini etkinleştir",
+ "Enable notifications for this account": "Bu hesap için bildirimleri etkinleştir",
+ "Enable them now": "Onları şimdi etkinleştir",
+ "Enter keywords separated by a comma:": "Anahtar kelimeleri virgül ile ayırarak girin:",
+ "Error": "Hata",
+ "Error saving email notification preferences": "E-posta bildirim tercihlerini kaydetme hatası",
+ "#example": "örnek",
+ "Expand panel": "Genişletme paneli",
+ "Failed to": "Başaramadı",
+ "Failed to add tag %(tagName)s to room": "%(tagName)s etiketi odaya eklenemedi",
+ "Failed to change settings": "Ayarlar değiştirilemedi",
+ "Failed to forget room %(errCode)s": "Oda unutulması başarısız oldu %(errCode)s",
+ "Failed to update keywords": "Anahtar kelimeler güncellenemedi",
+ "Failed to get protocol list from Home Server": "Ana Sunucu'dan protokol listesi alınamadı",
+ "Failed to get public room list": "Genel odalar listesi alınamadı",
+ "Failed to join the room": "Odaya girme başarısız oldu",
+ "Failed to remove tag %(tagName)s from room": "Odadan %(tagName)s etiketi kaldırılamadı",
+ "Failed to send report: ": "Rapor gönderilemedi: ",
+ "Failed to set direct chat tag": "Direkt sohbet etiketi ayarlanamadı",
+ "Failed to set Direct Message status of room": "Odanın Direkt Mesaj durumu ayarlanamadı",
+ "Favourite": "Favori",
+ "Fetching third party location failed": "Üçüncü parti konumunu çekemedi",
+ "Files": "Dosyalar",
+ "Filter room names": "Oda isimlerini filtrele",
+ "Forget": "Unut",
+ "Forward Message": "Mesajı İlet",
+ " from room": " Odadan",
+ "Guests can join": "Misafirler katılabilirler",
+ "Guest users can't invite users. Please register to invite.": "Misafir kullanıcılar kullanıcıları davet edemezler . Davet etmek için lütfen kayıt olun.",
+ "Hide panel": "Paneli gizle",
+ "(HTTP status %(httpStatus)s)": "(HTTP durumu %(httpStatus)s)",
+ "I understand the risks and wish to continue": "Riskleri anlıyorum ve devam etmek istiyorum",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Sorunları teşhis etmek için , bu istemciden kayıtlar hata raporu ile beraber gönderilecek . Yalnızca yukarıdaki metni göndermek isterseniz , lütfen işareti kaldırın:",
+ "Invite to this room": "Bu odaya davet et",
+ "Keywords": "Anahtar kelimeler",
+ "Leave": "Ayrıl",
+ "Login": "Oturum aç",
+ "Loading bug report module": "Hata raporlama modülü yükleniyor",
+ "Low Priority": "Düşük Öncelikli",
+ "Members": "Üyeler",
+ "Mentions only": "Sadece Mention'lar",
+ "Messages containing my display name": "İsmimi içeren mesajlar",
+ "Messages containing keywords": " anahtar kelimeleri içeren mesajlar",
+ "Messages containing my user name": "Kullanıcı ismimi içeren mesajlar",
+ "Messages in group chats": "Grup sohbetlerindeki mesajlar",
+ "Messages in one-to-one chats": "Bire bir sohbetlerdeki mesajlar",
+ "Messages sent by bot": "Bot tarafından gönderilen mesajlar",
+ "more": "Daha",
+ "Mute": "Sessiz",
+ "No rooms to show": "Gösterilecek oda yok",
+ "Noisy": "Gürültülü",
+ "Notification targets": "Bildirim hedefleri",
+ "Notifications": "Bildirimler",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Aşağıdaki anahtar kelimeleri ile ilgili bildirimler burada gösterilemeyen kuralları takip eder:",
+ "Notify for all other messages/rooms": "Diğer tüm mesajlar / odalar için bildirim yapın",
+ "Notify me for anything else": "Başka herhangi bir şey için bana bildirim yap",
+ "Off": "Kapalı",
+ "On": "Açık",
+ "Operation failed": "Operasyon başarısız oldu",
+ "Permalink": "Kalıcı Bağlantı(permalink)",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Lütfen hatayı tanımlayın. Ne yaptınız ? Ne gerçekleşmesini beklediniz ? Ne gerçekleşti ?",
+ "Please describe the bug and/or send logs.": "Lütfen hatayı tanımlayın ve/veya kayıtları gönderin.",
+ "Please install Chrome or Firefox for the best experience.": "Lütfen Chrome ya da Firefox 'u en iyi deneyim için yükleyin.",
+ "Please Register": "Lütfen Kaydolun",
+ "powered by Matrix": "Matrix tarafından desteklenmektedir",
+ "Quote": "Alıntı",
+ "Redact": "Yazıya Dökme",
+ "Reject": "Reddet",
+ "Remove %(name)s from the directory?": "%(name)s'i dizinden kaldırılsın mı ?",
+ "Remove": "Kaldır",
+ "remove %(name)s from the directory.": "%(name)s'i dizinden kaldır.",
+ "Remove from Directory": "Dizinden Kaldır",
+ "Report a bug": "Hata Bildir",
+ "Resend": "Yeniden Gönder",
+ "Riot Desktop on %(platformName)s": "%(platformName)s platformunda Riot Masaüstü",
+ "Riot does not know how to join a room on this network": "Riot bu ağdaki bir odaya nasıl gireceğini bilmiyor",
+ "Riot is not supported on mobile web. Install the app?": "Riot mobil web'de desteklenmiyor . Uygulamayı yükle ?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot geçerli tarayıcınızda mevcut olmayan veya denemelik olan birçok gelişmiş tarayıcı özelliği kullanıyor.",
+ "Room directory": "Oda Rehberi",
+ "Room not found": "Oda bulunamadı",
+ "Search": "Ara",
+ "Search…": "Arama…",
+ "Search for a room": "Oda ara",
+ "Send": "Gönder",
+ "Send logs": "Kayıtları gönder",
+ "Settings": "Ayarlar",
+ "Source URL": "Kaynak URL",
+ "Sorry, your browser is not able to run Riot.": "Üzgünüz , tarayıcınız Riot'u çalıştıramıyor .",
+ "Start chat": "Sohbet Başlat",
+ "The Home Server may be too old to support third party networks": "Ana Sunucu 3. parti ağları desteklemek için çok eski olabilir",
+ "There are advanced notifications which are not shown here": "Burada gösterilmeyen gelişmiş bildirimler var",
+ "The server may be unavailable or overloaded": "Sunucu kullanılamıyor veya aşırı yüklenmiş olabilir",
+ "This Room": "Bu Oda",
+ "This room is inaccessible to guests. You may be able to join if you register.": "Bu odaya misafirler tarafından erişilemez . Kaydolursanız katılabilirsiniz.",
+ " to room": " odasına",
+ "Unable to fetch notification target list": "Bildirim hedef listesi çekilemedi",
+ "Unable to join network": "Ağa bağlanılamıyor",
+ "Unable to look up room ID from server": "Sunucudan oda ID'si aranamadı",
+ "Unavailable": "Kullanım dışı",
+ "Unhide Preview": "Önizlemeyi Göster",
+ "Unknown device": "Bilinmeyen aygıt",
+ "unknown error code": "bilinmeyen hata kodu",
+ "Unnamed room": "İsimsiz oda",
+ "Update": "Güncelleştirme",
+ "Uploaded on %(date)s by %(user)s": "%(user)s tarafında %(date)s e yüklendi",
+ "Uploading report": "Rapor yükleniyor",
+ "View Decrypted Source": "Şifresi Çözülmüş(Decrypted) Kaynağı Görüntüle",
+ "View Source": "Kaynağı Görüntüle",
+ "What's New": "Yenilikler",
+ "What's new?": "Yeni olan ne ?",
+ "Waiting for response from server": "Sunucudan yanıt bekleniyor",
+ "When I'm invited to a room": "Bir odaya davet edildiğimde",
+ "World readable": "Okunabilir dünya",
+ "You cannot delete this image. (%(code)s)": "Bu resmi silemezsiniz. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "Bu mesajı silemezsiniz (%(code)s)",
+ "You are not receiving desktop notifications": "Masaüstü bildirimleri almıyorsunuz",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Konuk olarak Riotluyorsunuz. Daha fazla odaya ve özelliğe erişmek için Kayıt Ol ya da Oturum Aç !",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Onları Riot dışında bir istemciden yapılandırmış olabilirsiniz . Onları Riot içersinide ayarlayamazsınız ama hala geçerlidirler",
+ "Sunday": "Pazar",
+ "Monday": "Pazartesi",
+ "Tuesday": "Salı",
+ "Wednesday": "Çarşamba",
+ "Thursday": "Perşembe",
+ "Friday": "Cuma",
+ "Saturday": "Cumartesi",
+ "Today": "Bugün",
+ "Yesterday": "Dün",
+ "OK": "Tamam",
+ "You need to be using HTTPS to place a screen-sharing call.": "Ekran paylaşımlı arama yapmak için HTTPS kullanıyor olmalısınız.",
+ "Welcome page": "Karşılama sayfası",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Geçerli tarayıcınız ile birlikte , uygulamanın görünüş ve kullanım hissi tamamen hatalı olabilir ve bazı ya da tüm özellikler çalışmayabilir. Yine de denemek isterseniz devam edebilirsiniz ancak karşılaşabileceğiniz sorunlar karşısında kendi başınasınız !",
+ "Welcome to Riot.im": "Riot.im'e Hoş Geldiniz",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Dağıtık , şifreli sohbet & işbirliği ile Matrix tarafından desteklenmektedir",
+ "Search the room directory": "Oda dizinini ara",
+ "Chat with Riot Bot": "Riot Bot ile Sohbet Et",
+ "Get started with some tips from Riot Bot!": "Bazı Riot Bot ipuçları ile başlayın !",
+ "General discussion about Matrix and Riot": "Matrix ve Riot hakkında genel tartışma",
+ "Discussion of all things Matrix!": "Matrix'in tüm tartışması!",
+ "Riot/Web & Desktop chat": "Riot/Web & Masaüstü sohbet",
+ "Riot/iOS & matrix-ios-sdk chat": "Riot/iOS & matrix-ios-sdk sohbet",
+ "Riot/Android & matrix-android-sdk chat": "Riot/Android & matrix-android-sdk sohbet",
+ "Matrix technical discussions": "Matrix teknik tartışmalar",
+ "Running Matrix services": "Çalışan Matrix hizmetleri",
+ "Community-run support for Synapse": "Synapse için topluluk tarafından işlenen destek",
+ "Admin support for Dendrite": "Dendrite için Admin desteği",
+ "Announcements about Synapse releases": "Synapse sürümleri hakkında duyurular",
+ "Support for those using and running matrix-appservice-irc": "matrix-appservice-irc kullanan ve çalıştıran kullanıcılar için destek",
+ "Building services on Matrix": "Matrix üzerinde Yapı hizmetleri",
+ "Support for those using the Matrix spec": "Matrix teknik özelliklerini kullananlar için destek",
+ "Design and implementation of E2E in Matrix": "Matrix'te E2E ' nin Tasarım ve İmplementasyonu",
+ "Implementing VR services with Matrix": "Matrix'te VR hizmetlerini implement etmek",
+ "Implementing VoIP services with Matrix": "Matrix'te VoIP hizmetlerini implement etmek",
+ "Discussion of the Identity Service API": "Kimlik Hizmet API ( Identity Service API ) Tartışması",
+ "Support for those using, running and writing other bridges": "Diğer köprüleri kullanan , çalıştıran ve yazanlar için destek",
+ "Contributing code to Matrix and Riot": "Matrix ve Riot'a kod katkısı (contribution) sağla",
+ "Dev chat for the Riot/Web dev team": "Riot/Web Geliştirici takımı için Geliştirici sohbeti",
+ "Dev chat for the Dendrite dev team": "Dendrite Geliştirici Takımı için Geliştirici sohbeti",
+ "Co-ordination for Riot/Web translators": "Riot/Web çevirmenleri için koordinasyon",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Matrix'te varolan ağlara (Slack , IRC , Gitter vb.) bağlı ya da bağımsız bir çok oda var . Dizini kontrol edin!",
+ "Failed to change password. Is your password correct?": "Şifreniz değiştirilemedi . Şifreniz doğru mu ?",
+ "You have successfully set a password!": "Başarıyla bir şifre ayarladınız!",
+ "You can now return to your account after signing out, and sign in on other devices.": "Şimdi oturumunuzu iptal ettikten sonra başka cihazda oturum açarak hesabınıza dönebilirsiniz.",
+ "Continue": "Devam Et",
+ "Please set a password!": "Lütfen bir şifre ayarlayın !",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Bu oturumunuzu kapattıktan sonra hesabınıza dönmenizi ve diğer cihazlarda oturum açmanızı sağlar.",
+ "You have successfully set a password and an email address!": "Başarıyla bir şifre ve e-posta adresi ayarladın !",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Unutmayın , fikrinizi değiştirirseniz her zaman bir şifre ve e-posta adresi ayarlayabilirsiniz."
+}
diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json
index 9e26dfee..29e7a700 100644
--- a/src/i18n/strings/uk.json
+++ b/src/i18n/strings/uk.json
@@ -1 +1,204 @@
-{}
\ No newline at end of file
+{
+ "A new version of Riot is available.": "Доступне оновлення для Riot.",
+ "All messages": "Усі повідомлення",
+ "All messages (loud)": "Усі повідомлення (гучно)",
+ "All Rooms": "Усі кімнати",
+ "All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.",
+ "An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.",
+ "Cancel": "Скасувати",
+ "Cancel Sending": "Скасувати надсилання",
+ "Can't update user notification settings": "Неможливо оновити налаштування користувацьких сповіщень",
+ "Changelog": "Журнал змін",
+ "Close": "Закрити",
+ "Collapse panel": "Згорнути панель",
+ "Collecting app version information": "Збір інформації про версію застосунка",
+ "Collecting logs": "Збір журналів",
+ "Create new room": "Створити нову кімнату",
+ "Couldn't find a matching Matrix room": "Неможливо знайти відповідну кімнату",
+ "Custom Server Options": "Нетипові параметри сервера",
+ "customServer_text": "Ви можете скористатись нетиповими параметрами сервера щоб увійти в інші сервери Matrix, зазначивши посилання на окремий Домашній сервер Це дозволяє вам використовувати Riot із вже існуючою обліковкою Matrix на іншому Домашньому сервері.
Ви також можете зазначити нетиповий сервер ідентифікації, але ви не матимете змоги ані запрошувати користувачів за е-поштою, ані бути запрошеними за е-поштою самі.",
+ "delete the alias.": "видалити псевдонім.",
+ "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s через %(browserName)s на %(osName)s",
+ "Safari and Opera work too.": "Safari та Opera також підтримуються.",
+ "Add an email address above to configure email notifications": "Додайте вище адресу е-пошти щоб налаштувати сповіщення е-поштою",
+ "Advanced notification settings": "Додаткові налаштування сповіщень",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Видалити псевдонім %(alias)s та прибрати з каталогу %(name)s?",
+ "Describe your problem here.": "Опишіть вашу проблему тут.",
+ "Direct Chat": "Прямий чат",
+ "Directory": "Каталог",
+ "Dismiss": "Відхилити",
+ "Download this file": "Звантажити цей файл",
+ "Enable audible notifications in web client": "Увімкнути звукові сповіщення у мережевому застосунку",
+ "Enable desktop notifications": "Увімкнути сповіщення на стільниці",
+ "Enable email notifications": "Увімкнути сповіщення е-поштою",
+ "Enable notifications for this account": "Увімкнути сповіщення для цієї обліковки",
+ "Enable them now": "Увімкнути їх зараз",
+ "Enter keywords separated by a comma:": "Введіть ключові слова через кому:",
+ "Error": "Помилка",
+ "Error saving email notification preferences": "Помилка при збереженні параметрів сповіщень е-поштою",
+ "#example": "#зразок",
+ "Expand panel": "Розгорнути панель",
+ "Failed to": "Не вдалось",
+ "Failed to add tag %(tagName)s to room": "Не вдалось додати до кімнати мітку %(tagName)s",
+ "Failed to change settings": "Не вдалось змінити налаштування",
+ "Failed to forget room %(errCode)s": "Не вдалось забути кімнату %(errCode)s",
+ "Failed to update keywords": "Не вдалось оновити ключові слова",
+ "Failed to get protocol list from Home Server": "Не вдалось отримати перелік протоколів з Домашнього серверу",
+ "Failed to get public room list": "Не вдалось отримати перелік прилюдних кімнат",
+ "Failed to join the room": "Не вдалося приєднатись до кімнати",
+ "Failed to remove tag %(tagName)s from room": "Не вдалося прибрати з кімнати мітку %(tagName)s",
+ "Failed to send report: ": "Не вдалося надіслати звіт: ",
+ "Failed to set direct chat tag": "Не вдалося встановити мітку прямого чату",
+ "Favourite": "Вибране",
+ "Fetching third party location failed": "Не вдалось отримати стороннє місцеперебування",
+ "Files": "Файли",
+ "Filter room names": "Відфільтрувати назви кімнат",
+ "Forget": "Забути",
+ "Forward Message": "Переслати повідомлення",
+ " from room": " з кімнати",
+ "Guests can join": "Гості можуть приєднуватися",
+ "Guest users can't invite users. Please register to invite.": "Гості не можуть запрошувати користувачів. Зареєструйтесь, будь ласка, для видачі запрошень.",
+ "Hide panel": "Сховати панель",
+ "(HTTP status %(httpStatus)s)": "(статус HTTP %(httpStatus)s)",
+ "I understand the risks and wish to continue": "Я ознайомлений з ризиками і хочу продовжити",
+ "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "З метою діагностики проблем журнали з цього застосунку будуть надіслані разом зі звітом про вади. Якщо ви бажаєте надіслати лише вищенаведений текст, відозначте, будь ласка:",
+ "Invite to this room": "Запросити до цієї кімнати",
+ "Keywords": "Ключові слова",
+ "Leave": "Вийти",
+ "Login": "Зайти",
+ "Loading bug report module": "Завантаження модуля звітів про вади",
+ "Low Priority": "Неважливі",
+ "Members": "Члени",
+ "Mentions only": "Тільки згадки",
+ "Messages containing keywords": "Повідомлення, що містять ключові слова",
+ "Messages containing my user name": "Повідомлення, що містять моє ім'я користувача",
+ "Messages in group chats": "Повідомлення у групових чатах",
+ "Messages sent by bot": "Повідомлення, надіслані ботом",
+ "more": "докладніше",
+ "Mute": "Стишити",
+ "Notification targets": "Цілі сповіщень",
+ "Notifications": "Сповіщення",
+ "Notify for all other messages/rooms": "Сповіщати щодо всіх повідомлень/кімнат",
+ "Notify me for anything else": "Сповіщати мене про будь-що інше",
+ "Off": "Вимкнено",
+ "On": "Увімкнено",
+ "Operation failed": "Не вдалося виконати дію",
+ "Permalink": "Постійне посилання",
+ "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Опишіть, будь ласка, ваду. Що ви зробили? На що ви очікували? Що трапилось натомість?",
+ "Please describe the bug and/or send logs.": "Опишіть, будь ласка, ваду та/або надішліть журнали.",
+ "Please install Chrome or Firefox for the best experience.": "Для більшої зручності у використанні встановіть, будь ласка, Chrome або Firefox.",
+ "Please Register": "Зареєструйтеся, будь ласка",
+ "powered by Matrix": "працює на Matrix",
+ "Quote": "Цитувати",
+ "Redact": "Видалити",
+ "Reject": "Відмовитись",
+ "Remove %(name)s from the directory?": "Прибрати %(name)s з каталогу?",
+ "Remove": "Прибрати",
+ "remove %(name)s from the directory.": "прибрати %(name)s з каталогу.",
+ "Remove from Directory": "Прибрати з каталогу",
+ "Report a bug": "Звітувати про вади",
+ "Resend": "Перенадіслати",
+ "Riot Desktop on %(platformName)s": "Riot Desktop на %(platformName)s",
+ "Call invitation": "Запрошення до виклику",
+ "Drop here %(toAction)s": "Кидайте сюди %(toAction)s",
+ "Riot does not know how to join a room on this network": "Riot не знає як приєднатись до кімнати у цій мережі",
+ "Riot is not supported on mobile web. Install the app?": "Riot не працює через оглядач на мобільних пристроях. Встановити застосунок?",
+ "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot використовує багато новітніх функцій, деякі з яких не доступні або є експериментальними у вашому оглядачі.",
+ "Room directory": "Каталог кімнат",
+ "Room not found": "Кімнату не знайдено",
+ "Search": "Пошук",
+ "Search…": "Пошук…",
+ "Search for a room": "Пошук кімнати",
+ "Send": "Надіслати",
+ "Send logs": "Надіслати журнали",
+ "Settings": "Налаштування",
+ "Source URL": "Джерельне посилання",
+ "Sorry, your browser is not able to run Riot.": "Вибачте, ваш оглядач не спроможний запустити Riot.",
+ "Start chat": "Почати розмову",
+ "The Home Server may be too old to support third party networks": "Домашній сервер може бути застарим для підтримки сторонніх мереж",
+ "There are advanced notifications which are not shown here": "Є додаткові сповіщення, що не показуються тут",
+ "The server may be unavailable or overloaded": "Сервер може бути недосяжним або перевантаженим",
+ "This Room": "Ця кімната",
+ "This room is inaccessible to guests. You may be able to join if you register.": "Ця кімната є недосяжною для гостей. Напевно ви матимете змогу приєднатись, якщо зареєструєтесь.",
+ " to room": " до кімнати",
+ "Unable to fetch notification target list": "Неможливо отримати перелік цілей сповіщення",
+ "Unable to join network": "Неможливо приєднатись до мережі",
+ "Unable to look up room ID from server": "Неможливо знайти ID кімнати на сервері",
+ "Unknown device": "Невідомий пристрій",
+ "unknown error code": "невідомий код помилки",
+ "Unnamed room": "Неназвана кімната",
+ "Update": "Оновити",
+ "Uploaded on %(date)s by %(user)s": "Завантажено %(date)s користувачем %(user)s",
+ "Uploading report": "Завантаження звіту",
+ "View Decrypted Source": "Переглянути розшифроване джерело",
+ "View Source": "Переглянути джерело",
+ "What's New": "Що нового",
+ "What's new?": "Що нового?",
+ "Waiting for response from server": "Очікується відповідь від сервера",
+ "When I'm invited to a room": "Коли мене запрошено до кімнати",
+ "World readable": "Відкрито для світу",
+ "You cannot delete this image. (%(code)s)": "Ви не можете видалити це зображення. (%(code)s)",
+ "You cannot delete this message. (%(code)s)": "Ви не можете видалити це повідомлення. (%(code)s)",
+ "You are not receiving desktop notifications": "Ви не отримуєте сповіщення на стільниці",
+ "You are Rioting as a guest. Register or sign in to access more rooms and features!": "Ви Riot'уєте як гість. Зареєструйтеся або увійдіть щоб мати ширший доступ до кімнат та функцій!",
+ "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можливо, ви налаштували їх не у Riot, а у іншому застосунку. Ви не можете регулювати їх у Riot, але вони все ще мають силу",
+ "Sunday": "Неділя",
+ "Monday": "Понеділок",
+ "Tuesday": "Вівторок",
+ "Wednesday": "Середа",
+ "Thursday": "Четвер",
+ "Friday": "П'ятниця",
+ "Saturday": "Субота",
+ "Today": "Сьогодні",
+ "Yesterday": "Вчора",
+ "OK": "Гаразд",
+ "You need to be using HTTPS to place a screen-sharing call.": "Ви маєте використовувати HTTPS щоб зробити виклик із поширенням екрану.",
+ "Welcome page": "Ласкаво просимо",
+ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "У вашому оглядачі вигляд застосунку може бути повністю іншим, а деякі або навіть усі функції можуть не працювати. Якщо ви наполягаєте, то можете продовжити користування, але ви маєте впоратись з усіма можливими проблемами власноруч!",
+ "Welcome to Riot.im": "Ласкаво просимо до Riot.im",
+ "Decentralised, encrypted chat & collaboration powered by [matrix]": "Децентралізований, шифрований чат та засіб для співробітництва, що працює на [matrix]",
+ "Search the room directory": "Шукати у каталозі кімнат",
+ "Chat with Riot Bot": "Розмовляти з Riot-ботом",
+ "Get started with some tips from Riot Bot!": "Розпочніть за допомогою декількох підказок від Riot-боту!",
+ "General discussion about Matrix and Riot": "Загальне обговорення Matrix та Riot",
+ "Discussion of all things Matrix!": "Обговорення усіх деталей про Matrix!",
+ "Riot/Web & Desktop chat": "Обговорення Riot для оглядачів та стільниці",
+ "Riot/iOS & matrix-ios-sdk chat": "Обговорення Riot/iOS та matrix-ios-sdk",
+ "Riot/Android & matrix-android-sdk chat": "Обговорення Riot/Android та matrix-android-sdk",
+ "Matrix technical discussions": "Технічні обговорення Matrix",
+ "Community-run support for Synapse": "Спільнота підтримки Synapse",
+ "Admin support for Dendrite": "Адміністрування Dendrite",
+ "Announcements about Synapse releases": "Оголошення випусків Synapse",
+ "Support for those using and running matrix-appservice-irc": "Підтримка користувачів matrix-appservice-irc",
+ "Building services on Matrix": "Створення служб на основі Matrix",
+ "Support for those using the Matrix spec": "Підтримка користувачів специфікацій Matrix",
+ "Design and implementation of E2E in Matrix": "Планування та впровадження E2E шифрування у Matrix",
+ "Implementing VR services with Matrix": "Впровадження служб віртуальної реальності в рамках Matrix",
+ "Implementing VoIP services with Matrix": "Впровадження служб VoIP через Matrix",
+ "Discussion of the Identity Service API": "Обговорення Identity Service API",
+ "Support for those using, running and writing other bridges": "Підтримка користувачів, адміністраторів та розробників інших Matrix-мостів",
+ "Contributing code to Matrix and Riot": "Тим, хто хоче долучитись до розробки Matrix та Riot",
+ "Dev chat for the Riot/Web dev team": "Чат команди розробників Riot/Web",
+ "Dev chat for the Dendrite dev team": "Чат команди розробників Dendrite",
+ "Co-ordination for Riot/Web translators": "Координація для перекладачів Riot/Web",
+ "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "У мережі Matrix вже існує багато кімнат, що з'єднані як з існуючими мережами (Slack, IRC, Gitter тощо), так і незалежними. Подивіться у каталозі кімнат!",
+ "Failed to change password. Is your password correct?": "Не вдалось змінити пароль. Ви впевнені, що пароль введено правильно?",
+ "You have successfully set a password!": "Пароль успішно встановлено!",
+ "You can now return to your account after signing out, and sign in on other devices.": "Тепер ви можете повернутися до своєї обліковки після виходу з неї, та зайти з інших пристроїв.",
+ "Continue": "Продовжити",
+ "Please set a password!": "Встановіть пароль, будь ласка!",
+ "This will allow you to return to your account after signing out, and sign in on other devices.": "Це дозволить вам повернутися до своєї обліковки після виходу з неї, та заходити з інших пристроїв.",
+ "You have successfully set a password and an email address!": "Пароль та адресу е-пошти успішно встановлено!",
+ "Remember, you can always set an email address in user settings if you change your mind.": "Пам'ятайте, що ви завжди можете встановити адресу е-пошти у налаштуваннях, якщо передумаєте.",
+ "Messages in one-to-one chats": "Повідомлення у чатах \"сам на сам\"",
+ "No rooms to show": "Кімнати відсутні",
+ "Noisy": "Шумний",
+ "Unavailable": "Нема в наявності",
+ "Unhide Preview": "Відкрити попередній перегляд",
+ "Failed to set Direct Message status of room": "Не вдалось встановити статус прямого спілкування в кімнаті",
+ "Messages containing my display name": "Повідомлення, вміщає моє ім'я",
+ "Running Matrix services": "Запуск служби Matrix",
+ "Set Password": "Задати пароль",
+ "Notifications on the following keywords follow rules which can’t be displayed here:": "Сповіщення з наступних ключових слів дотримуються правил, що не можуть бути показані тут:",
+ "To return to your account in future you need to set a password": "Щоб мати змогу використовувати вашу обліковку у майбутньому, зазначте пароль"
+}
diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json
index f76aa160..646cfc68 100644
--- a/src/i18n/strings/zh_Hans.json
+++ b/src/i18n/strings/zh_Hans.json
@@ -3,5 +3,32 @@
"Mute": "静音",
"Notifications": "通知",
"OK": "确定",
- "Operation failed": "操作失败"
+ "Operation failed": "操作失败",
+ "%(appName)s via %(browserName)s on %(osName)s": "应用%(appName)s通过%(osName)s上的%(browserName)s浏览器运行",
+ "Safari and Opera work too.": "Safari和Opera均可运行。",
+ "A new version of Riot is available.": "Riot 有更新可用。",
+ "Add an email address above to configure email notifications": "请在上方输入电子邮件地址以接收邮件通知",
+ "Advanced notification settings": "通知高级设置",
+ "All messages": "全部消息",
+ "All messages (loud)": "全部消息(高亮)",
+ "All Rooms": "全部房间",
+ "All notifications are currently disabled for all targets.": "当前所有目标的通知均已禁用。",
+ "An error occurred whilst saving your email notification preferences.": "保存邮件通知偏好设定时出现错误。",
+ "Call invitation": "语音邀请",
+ "Cancel": "取消",
+ "Cancel Sending": "取消发送",
+ "Can't update user notification settings": "不能更新用户通知设置",
+ "Changelog": "变更日志",
+ "Collecting app version information": "正在收集应用版本信息",
+ "Collecting logs": "正在收集日志",
+ "Create new room": "创建新房间",
+ "Couldn't find a matching Matrix room": "未找到符合的 Matrix 房间",
+ "Custom Server Options": "自定义服务器选项",
+ "customServer_text": "你可以通过指定自定义服务器选项中的其他 Home server URL 来登录其他 Matrix 服务器。 该选项允许你在 Riot 上使用其他 Home server 上的帐号。
你也可以自定义身份验证服务器,但你将不能通过邮件邀请其他用户,同样的,你也不能通过邮件被其他用户邀请。",
+ "delete the alias.": "删除别名。",
+ "Delete the room alias %(alias)s and remove %(name)s from the directory?": "确定要删除房间别名 %(alias)s 并将 %(name)s 从列表中删除吗?",
+ "Describe your problem here.": "在这里描述你的问题。",
+ "Directory": "房间列表",
+ "Dismiss": "设为已读",
+ "Download this file": "下载该文件"
}
diff --git a/src/skins/vector/css/_components.scss b/src/skins/vector/css/_components.scss
index a4154f20..0b7be8b0 100644
--- a/src/skins/vector/css/_components.scss
+++ b/src/skins/vector/css/_components.scss
@@ -72,11 +72,13 @@
@import "./vector-web/views/context_menus/_MessageContextMenu.scss";
@import "./vector-web/views/context_menus/_RoomTileContextMenu.scss";
@import "./vector-web/views/dialogs/_ChangelogDialog.scss";
+@import "./vector-web/views/dialogs/_SetEmailDialog.scss";
@import "./vector-web/views/dialogs/_SetPasswordDialog.scss";
@import "./vector-web/views/directory/_NetworkDropdown.scss";
@import "./vector-web/views/elements/_ImageView.scss";
@import "./vector-web/views/elements/_Spinner.scss";
@import "./vector-web/views/globals/_MatrixToolbar.scss";
+@import "./vector-web/views/messages/_DateSeparator.scss";
@import "./vector-web/views/messages/_MessageTimestamp.scss";
@import "./vector-web/views/messages/_SenderProfile.scss";
@import "./vector-web/views/rooms/_RoomDropTarget.scss";
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/_LoginBox.scss b/src/skins/vector/css/matrix-react-sdk/structures/_LoginBox.scss
index 3c8091fe..92d8833b 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/_LoginBox.scss
+++ b/src/skins/vector/css/matrix-react-sdk/structures/_LoginBox.scss
@@ -19,13 +19,15 @@ limitations under the License.
width: 100%;
}
-.mx_LoginBox_loginButton {
+.mx_LoginBox_loginButton,
+.mx_LoginBox_registerButton {
margin-top: -8px;
height: 40px;
border: 0px;
border-radius: 40px;
- padding-left: 1em;
- padding-right: 1em;
+ margin-left: 4px;
+ margin-right: 4px;
+ width: 80px;
background-color: $accent-color;
color: $primary-bg-color;
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss b/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss
index 6fd44d26..ae7735de 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss
+++ b/src/skins/vector/css/matrix-react-sdk/structures/_RoomView.scss
@@ -127,15 +127,6 @@ limitations under the License.
clear: both;
}
-.mx_RoomView_MessageList h2 {
- clear: both;
- margin-top: 32px;
- margin-bottom: 8px;
- margin-left: 63px;
- padding-bottom: 6px;
- border-bottom: 1px solid $primary-hairline-color;
-}
-
.mx_RoomView_invitePrompt {
order: 2;
diff --git a/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss b/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss
index 9809a81a..31686a7c 100644
--- a/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss
+++ b/src/skins/vector/css/matrix-react-sdk/structures/_UserSettings.scss
@@ -102,6 +102,13 @@ limitations under the License.
padding-right: 1em;
}
+.mx_UserSettings_passwordWarning {
+ /* To move the "Sign out" button out of the way */
+ clear: both;
+ color: $warning-color;
+ margin-bottom: 5px;
+}
+
.mx_UserSettings_importExportButtons {
padding-top: 10px;
padding-left: 40px;
diff --git a/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss b/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss
index a980d1f9..7d8e4ba2 100644
--- a/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss
+++ b/src/skins/vector/css/matrix-react-sdk/views/rooms/_EventTile.scss
@@ -345,6 +345,11 @@ limitations under the License.
}
.mx_EventTile_body pre {
position: relative;
+ border: 1px solid transparent;
+}
+.mx_EventTile:hover .mx_EventTile_body pre
+{
+ border: 1px solid $primary-hairline-color;
}
.mx_EventTile_body pre:hover .mx_EventTile_copyButton
{
diff --git a/src/skins/vector/css/vector-web/views/dialogs/_SetEmailDialog.scss b/src/skins/vector/css/vector-web/views/dialogs/_SetEmailDialog.scss
new file mode 100644
index 00000000..588f10c9
--- /dev/null
+++ b/src/skins/vector/css/vector-web/views/dialogs/_SetEmailDialog.scss
@@ -0,0 +1,36 @@
+/*
+Copyright 2017 Vector Creations Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+.mx_SetEmailDialog_email_input {
+ border-radius: 3px;
+ border: 1px solid $input-border-color;
+ padding: 9px;
+ color: $input-fg-color;
+ background-color: $primary-bg-color;
+ font-size: 15px;
+ width: 100%;
+ max-width: 280px;
+ margin-bottom: 10px;
+}
+
+.mx_SetEmailDialog_email_input:focus {
+ outline: none;
+ box-shadow: none;
+ border: 1px solid $accent-color;
+}
+
+.mx_SetEmailDialog_email_input_placeholder {
+}
diff --git a/src/vector/updater.js b/src/skins/vector/css/vector-web/views/messages/_DateSeparator.scss
similarity index 60%
rename from src/vector/updater.js
rename to src/skins/vector/css/vector-web/views/messages/_DateSeparator.scss
index 19d40b4f..f676d24b 100644
--- a/src/vector/updater.js
+++ b/src/skins/vector/css/vector-web/views/messages/_DateSeparator.scss
@@ -1,5 +1,5 @@
/*
-Copyright 2016 OpenMarket Ltd
+Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,17 +14,12 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
+.mx_DateSeparator {
+ clear: both;
+ margin-top: 32px;
+ margin-bottom: 8px;
+ margin-left: 63px;
+ padding-bottom: 6px;
+ border-bottom: 1px solid $primary-hairline-color;
+}
-var POKE_RATE_MS = 10 * 60 * 1000; // 10 min
-
-module.exports = {
- start: function() {
- module.exports.poll();
- setInterval(module.exports.poll, POKE_RATE_MS);
- },
-
- poll: function() {
- PlatformPeg.get().pollForUpdate();
- }
-};
diff --git a/src/vector/index.js b/src/vector/index.js
index 9f162051..81d329c0 100644
--- a/src/vector/index.js
+++ b/src/vector/index.js
@@ -45,6 +45,12 @@ rageshake.init().then(() => {
console.error("Failed to initialise rageshake: " + err);
});
+window.addEventListener('beforeunload', (e) => {
+ console.log('riot-web closing');
+ // try to flush the logs to indexeddb
+ rageshake.flush();
+});
+
// add React and ReactPerf to the global namespace, to make them easier to
// access via the console
@@ -59,7 +65,6 @@ var sdk = require("matrix-react-sdk");
const PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg");
sdk.loadSkin(require('../component-index'));
var VectorConferenceHandler = require('../VectorConferenceHandler');
-var UpdateChecker = require("./updater");
var q = require('q');
var request = require('browser-request');
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
@@ -216,18 +221,16 @@ function getConfig() {
return deferred.promise;
}
-function onLoadCompleted() {
+function onTokenLoginCompleted() {
// if we did a token login, we're now left with the token, hs and is
// url as query params in the url; a little nasty but let's redirect to
// clear them.
- if (window.location.search) {
- var parsedUrl = url.parse(window.location.href);
- parsedUrl.search = "";
- var formatted = url.format(parsedUrl);
- console.log("Redirecting to " + formatted + " to drop loginToken " +
- "from queryparams");
- window.location.href = formatted;
- }
+ var parsedUrl = url.parse(window.location.href);
+ parsedUrl.search = "";
+ var formatted = url.format(parsedUrl);
+ console.log("Redirecting to " + formatted + " to drop loginToken " +
+ "from queryparams");
+ window.location.href = formatted;
}
async function loadApp() {
@@ -277,7 +280,9 @@ async function loadApp() {
Unable to load config file: please refresh the page to try again.
, document.getElementById('matrixchat'));
} else if (validBrowser) {
- UpdateChecker.start();
+ const platform = PlatformPeg.get();
+ platform.startUpdater();
+
const MatrixChat = sdk.getComponent('structures.MatrixChat');
window.matrixChat = ReactDOM.render(
,
document.getElementById('matrixchat')
);
diff --git a/src/vector/platform/ElectronPlatform.js b/src/vector/platform/ElectronPlatform.js
index fa0f999c..4f0ffae7 100644
--- a/src/vector/platform/ElectronPlatform.js
+++ b/src/vector/platform/ElectronPlatform.js
@@ -17,14 +17,21 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import VectorBasePlatform from './VectorBasePlatform';
+import VectorBasePlatform, {updateCheckStatusEnum} from './VectorBasePlatform';
import dis from 'matrix-react-sdk/lib/dispatcher';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import q from 'q';
-import electron, {remote, ipcRenderer} from 'electron';
+import {remote, ipcRenderer} from 'electron';
+import rageshake from '../rageshake';
remote.autoUpdater.on('update-downloaded', onUpdateDownloaded);
+// try to flush the rageshake logs to indexeddb before quit.
+ipcRenderer.on('before-quit', function () {
+ console.log('riot-desktop closing');
+ rageshake.flush();
+});
+
function onUpdateDownloaded(ev: Event, releaseNotes: string, ver: string, date: Date, updateURL: string) {
dis.dispatch({
action: 'new_version',
@@ -62,10 +69,42 @@ function _onAction(payload: Object) {
}
}
+function getUpdateCheckStatus(status) {
+ if (status === true) {
+ return { status: updateCheckStatusEnum.DOWNLOADING };
+ } else if (status === false) {
+ return { status: updateCheckStatusEnum.NOTAVAILABLE };
+ } else {
+ return {
+ status: updateCheckStatusEnum.ERROR,
+ detail: status,
+ };
+ }
+}
+
export default class ElectronPlatform extends VectorBasePlatform {
constructor() {
super();
dis.register(_onAction);
+ this.updatable = Boolean(remote.autoUpdater.getFeedURL());
+
+ /*
+ IPC Call `check_updates` returns:
+ true if there is an update available
+ false if there is not
+ or the error if one is encountered
+ */
+ ipcRenderer.on('check_updates', (event, status) => {
+ if (!this.showUpdateCheck) return;
+ dis.dispatch({
+ action: 'check_updates',
+ value: getUpdateCheckStatus(status),
+ });
+ this.showUpdateCheck = false;
+ });
+
+ this.startUpdateCheck = this.startUpdateCheck.bind(this);
+ this.stopUpdateCheck = this.stopUpdateCheck.bind(this);
}
getHumanReadableName(): string {
@@ -137,17 +176,18 @@ export default class ElectronPlatform extends VectorBasePlatform {
return q(remote.app.getVersion());
}
- pollForUpdate() {
- // In electron we control the update process ourselves, since
- // it needs to run in the main process, so we just run the timer
- // loop in the main electron process instead.
+ startUpdateCheck() {
+ if (this.showUpdateCheck) return;
+ super.startUpdateCheck();
+
+ ipcRenderer.send('check_updates');
}
installUpdate() {
// IPC to the main process to install the update, since quitAndInstall
// doesn't fire the before-quit event so the main process needs to know
// it should exit.
- electron.ipcRenderer.send('install_update');
+ ipcRenderer.send('install_update');
}
getDefaultDeviceDisplayName(): string {
diff --git a/src/vector/platform/VectorBasePlatform.js b/src/vector/platform/VectorBasePlatform.js
index 76707d1d..c3df04f5 100644
--- a/src/vector/platform/VectorBasePlatform.js
+++ b/src/vector/platform/VectorBasePlatform.js
@@ -19,9 +19,18 @@ limitations under the License.
import BasePlatform from 'matrix-react-sdk/lib/BasePlatform';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
+import dis from 'matrix-react-sdk/lib/dispatcher';
import Favico from 'favico.js';
+export const updateCheckStatusEnum = {
+ CHECKING: 'CHECKING',
+ ERROR: 'ERROR',
+ NOTAVAILABLE: 'NOTAVAILABLE',
+ DOWNLOADING: 'DOWNLOADING',
+ READY: 'READY',
+};
+
/**
* Vector-specific extensions to the BasePlatform template
*/
@@ -34,7 +43,12 @@ export default class VectorBasePlatform extends BasePlatform {
// and we set the state each time, even if the value hasn't changed,
// so we'd need to fix that if enabling the animation.
this.favicon = new Favico({animation: 'none'});
+ this.showUpdateCheck = false;
this._updateFavicon();
+ this.updatable = true;
+
+ this.startUpdateCheck = this.startUpdateCheck.bind(this);
+ this.stopUpdateCheck = this.stopUpdateCheck.bind(this);
}
getHumanReadableName(): string {
@@ -75,12 +89,32 @@ export default class VectorBasePlatform extends BasePlatform {
}
/**
- * Check for the availability of an update to the version of the
- * app that's currently running.
- * If an update is available, this function should dispatch the
- * 'new_version' action.
+ * Begin update polling, if applicable
*/
- pollForUpdate() {
+ startUpdater() {
+ }
+
+ /**
+ * Whether we can call checkForUpdate on this platform build
+ */
+ canSelfUpdate(): boolean {
+ return this.updatable;
+ }
+
+ startUpdateCheck() {
+ this.showUpdateCheck = true;
+ dis.dispatch({
+ action: 'check_updates',
+ value: { status: updateCheckStatusEnum.CHECKING },
+ });
+ }
+
+ stopUpdateCheck() {
+ this.showUpdateCheck = false;
+ dis.dispatch({
+ action: 'check_updates',
+ value: false,
+ })
}
/**
diff --git a/src/vector/platform/WebPlatform.js b/src/vector/platform/WebPlatform.js
index b9e941e6..ae1e54b3 100644
--- a/src/vector/platform/WebPlatform.js
+++ b/src/vector/platform/WebPlatform.js
@@ -17,7 +17,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import VectorBasePlatform from './VectorBasePlatform';
+import VectorBasePlatform, {updateCheckStatusEnum} from './VectorBasePlatform';
import request from 'browser-request';
import dis from 'matrix-react-sdk/lib/dispatcher.js';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
@@ -26,10 +26,15 @@ import q from 'q';
import url from 'url';
import UAParser from 'ua-parser-js';
+var POKE_RATE_MS = 10 * 60 * 1000; // 10 min
+
export default class WebPlatform extends VectorBasePlatform {
constructor() {
super();
this.runningVersion = null;
+
+ this.startUpdateCheck = this.startUpdateCheck.bind(this);
+ this.stopUpdateCheck = this.stopUpdateCheck.bind(this);
}
getHumanReadableName(): string {
@@ -132,8 +137,13 @@ export default class WebPlatform extends VectorBasePlatform {
return this._getVersion();
}
+ startUpdater() {
+ this.pollForUpdate();
+ setInterval(this.pollForUpdate.bind(this), POKE_RATE_MS);
+ }
+
pollForUpdate() {
- this._getVersion().done((ver) => {
+ return this._getVersion().then((ver) => {
if (this.runningVersion === null) {
this.runningVersion = ver;
} else if (this.runningVersion !== ver) {
@@ -142,9 +152,29 @@ export default class WebPlatform extends VectorBasePlatform {
currentVersion: this.runningVersion,
newVersion: ver,
});
+ // Return to skip a MatrixChat state update
+ return;
}
+ return { status: updateCheckStatusEnum.NOTAVAILABLE };
}, (err) => {
console.error("Failed to poll for update", err);
+ return {
+ status: updateCheckStatusEnum.ERROR,
+ detail: err.message || err.status ? err.status.toString() : 'Unknown Error',
+ };
+ });
+ }
+
+ startUpdateCheck() {
+ if (this.showUpdateCheck) return;
+ super.startUpdateCheck();
+ this.pollForUpdate().then((updateState) => {
+ if (!this.showUpdateCheck) return;
+ if (!updateState) return;
+ dis.dispatch({
+ action: 'check_updates',
+ value: updateState,
+ });
});
}
diff --git a/src/vector/rageshake.js b/src/vector/rageshake.js
index 0138d624..07726f68 100644
--- a/src/vector/rageshake.js
+++ b/src/vector/rageshake.js
@@ -410,8 +410,16 @@ module.exports = {
}
logger = new ConsoleLogger();
logger.monkeyPatch(window.console);
- if (window.indexedDB) {
- store = new IndexedDBLogStore(window.indexedDB, logger);
+
+ // just *accessing* indexedDB throws an exception in firefox with
+ // indexeddb disabled.
+ let indexedDB;
+ try {
+ indexedDB = window.indexedDB;
+ } catch(e) {}
+
+ if (indexedDB) {
+ store = new IndexedDBLogStore(indexedDB, logger);
initPromise = store.connect();
return initPromise;
}
@@ -419,6 +427,13 @@ module.exports = {
return initPromise;
},
+ flush: function() {
+ if (!store) {
+ return;
+ }
+ store.flush();
+ },
+
/**
* Clean up old logs.
* @return Promise Resolves if cleaned logs.
diff --git a/test/app-tests/joining.js b/test/app-tests/joining.js
index e835ebb9..d9670125 100644
--- a/test/app-tests/joining.js
+++ b/test/app-tests/joining.js
@@ -68,7 +68,7 @@ describe('joining a room', function () {
}
});
- it('should not get stuck at a spinner', function(done) {
+ it('should not get stuck at a spinner', function() {
var ROOM_ALIAS = '#alias:localhost';
var ROOM_ID = '!id:localhost';
@@ -119,8 +119,8 @@ describe('joining a room', function () {
httpBackend.when('POST', '/publicRooms').respond(200, {chunk: []});
httpBackend.when('GET', '/thirdparty/protocols').respond(200, {});
return q.all([
- httpBackend.flush('/publicRooms'),
httpBackend.flush('/thirdparty/protocols'),
+ httpBackend.flush('/publicRooms'),
]);
}).then(() => {
var roomDir = ReactTestUtils.findRenderedComponentWithType(
@@ -140,12 +140,14 @@ describe('joining a room', function () {
.respond(401, {errcode: 'M_GUEST_ACCESS_FORBIDDEN'});
return q.all([
- httpBackend.flush('/directory/room/'+encodeURIComponent(ROOM_ALIAS)),
- httpBackend.flush('/rooms/'+encodeURIComponent(ROOM_ID)+"/initialSync"),
+ httpBackend.flush('/directory/room/'+encodeURIComponent(ROOM_ALIAS), 1, 200),
+ httpBackend.flush('/rooms/'+encodeURIComponent(ROOM_ID)+"/initialSync", 1, 200),
]);
}).then(() => {
httpBackend.verifyNoOutstandingExpectation();
+ return q.delay(1);
+ }).then(() => {
// we should now have a roomview, with a preview bar
roomView = ReactTestUtils.findRenderedComponentWithType(
matrixChat, RoomView);
@@ -208,7 +210,7 @@ describe('joining a room', function () {
}).then(() => {
// now the room should have loaded
expect(roomView.state.room).toExist();
- }).done(done, done);
+ });
});
});
});
diff --git a/test/app-tests/loading.js b/test/app-tests/loading.js
index b6e4324f..54e98760 100644
--- a/test/app-tests/loading.js
+++ b/test/app-tests/loading.js
@@ -29,8 +29,10 @@ import jssdk from 'matrix-js-sdk';
import sdk from 'matrix-react-sdk';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import * as languageHandler from 'matrix-react-sdk/lib/languageHandler';
+import {VIEWS} from 'matrix-react-sdk/lib/components/structures/MatrixChat';
+import dis from 'matrix-react-sdk/lib/dispatcher';
-import test_utils from '../test-utils';
+import * as test_utils from '../test-utils';
import MockHttpBackend from '../mock-request';
import {parseQs, parseQsFromFragment} from '../../src/vector/url_utils';
@@ -47,8 +49,8 @@ describe('loading:', function () {
// the mounted MatrixChat
let matrixChat;
- // a promise which resolves when the MatrixChat calls onLoadCompleted
- let loadCompletePromise;
+ // a promise which resolves when the MatrixChat calls onTokenLoginCompleted
+ let tokenLoginCompletePromise;
beforeEach(function() {
test_utils.beforeEach(this);
@@ -68,12 +70,21 @@ describe('loading:', function () {
});
});
- afterEach(function() {
+ afterEach(async function () {
+ console.log(`${Date.now()}: loading: afterEach`);
if (parentDiv) {
ReactDOM.unmountComponentAtNode(parentDiv);
parentDiv.remove();
parentDiv = null;
}
+
+ // unmounting should have cleared the MatrixClientPeg
+ expect(MatrixClientPeg.get()).toBe(null);
+
+ // clear the indexeddbs so we can start from a clean slate next time.
+ await test_utils.deleteIndexedDB('matrix-js-sdk:crypto');
+ await test_utils.deleteIndexedDB('matrix-js-sdk:riot-web-sync');
+ console.log(`${Date.now()}: loading: afterEach complete`);
});
/* simulate the load process done by index.js
@@ -92,21 +103,14 @@ describe('loading:', function () {
toString: function() { return this.search + this.hash; },
};
- let lastLoadedScreen = null;
- let appLoaded = false;
-
- let loadCompleteDefer = q.defer();
- loadCompletePromise = loadCompleteDefer.promise;
+ let tokenLoginCompleteDefer = q.defer();
+ tokenLoginCompletePromise = tokenLoginCompleteDefer.promise;
function onNewScreen(screen) {
console.log(Date.now() + " newscreen "+screen);
- if (!appLoaded) {
- lastLoadedScreen = screen;
- } else {
- var hash = '#/' + screen;
- windowLocation.hash = hash;
- console.log(Date.now() + " browser URI now "+ windowLocation);
- }
+ var hash = '#/' + screen;
+ windowLocation.hash = hash;
+ console.log(Date.now() + " browser URI now "+ windowLocation);
}
// Parse the given window.location and return parameters that can be used when calling
@@ -119,42 +123,27 @@ describe('loading:', function () {
}
}
- function routeUrl(location, matrixChat) {
- console.log(Date.now() + ` routing URL '${location}'`);
- const s = getScreenFromLocation(location);
- console.log("Showing screen ", s);
- matrixChat.showScreen(s.screen, s.params);
- }
-
const MatrixChat = sdk.getComponent('structures.MatrixChat');
const fragParts = parseQsFromFragment(windowLocation);
+
+ const config = Object.assign({
+ default_hs_url: DEFAULT_HS_URL,
+ default_is_url: DEFAULT_IS_URL,
+ }, opts.config || {});
+
var params = parseQs(windowLocation);
matrixChat = ReactDOM.render(
{throw new Error('Not implemented');}}
/>, parentDiv
);
-
- // pause for a cycle, then simulate the window.onload handler
- window.setTimeout(() => {
- console.log(Date.now() + " simulating window.onload");
- routeUrl(windowLocation, matrixChat);
- appLoaded = true;
- if (lastLoadedScreen) {
- onNewScreen(lastLoadedScreen);
- lastLoadedScreen = null;
- }
- }, 0);
}
// set an expectation that we will get a call to /sync, then flush
@@ -168,8 +157,8 @@ describe('loading:', function () {
.check((r) => {syncRequest = r;})
.respond(200, response);
- console.log("waiting for /sync");
for (let attempts = 10; attempts > 0; attempts--) {
+ console.log(Date.now() + " waiting for /sync");
if (syncRequest) {
return syncRequest;
}
@@ -194,12 +183,12 @@ describe('loading:', function () {
return httpBackend.flush();
}).then(() => {
// Wait for another trip around the event loop for the UI to update
- return q.delay(1);
+ return q.delay(10);
}).then(() => {
// we expect a single component following session load
ReactTestUtils.findRenderedComponentWithType(
matrixChat, sdk.getComponent('structures.login.Login'));
- expect(windowLocation.hash).toEqual("");
+ expect(windowLocation.hash).toEqual("#/login");
}).done(done, done);
});
@@ -220,35 +209,9 @@ describe('loading:', function () {
return httpBackend.flush();
}).then(() => {
// Wait for another trip around the event loop for the UI to update
- return q.delay(1);
+ return q.delay(10);
}).then(() => {
- // we expect a single component
- let login = ReactTestUtils.findRenderedComponentWithType(
- matrixChat, sdk.getComponent('structures.login.Login'));
- httpBackend.when('POST', '/login').check(function(req) {
- console.log(req);
- expect(req.data.type).toEqual('m.login.password');
- expect(req.data.identifier.type).toEqual('m.id.user');
- expect(req.data.identifier.user).toEqual('user');
- expect(req.data.password).toEqual('pass');
- }).respond(200, {
- user_id: '@user:id',
- device_id: 'DEVICE_ID',
- access_token: 'access_token',
- });
- login.onPasswordLogin("user", undefined, undefined, "pass")
- return httpBackend.flush();
- }).then(() => {
- // Wait for another trip around the event loop for the UI to update
- return q.delay(1);
- }).then(() => {
- // we expect a spinner
- ReactTestUtils.findRenderedComponentWithType(
- matrixChat, sdk.getComponent('elements.Spinner'));
-
- httpBackend.when('GET', '/pushrules').respond(200, {});
- httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
- return expectAndAwaitSync();
+ return completeLogin(matrixChat);
}).then(() => {
// once the sync completes, we should have a room view
return awaitRoomView(matrixChat);
@@ -263,6 +226,36 @@ describe('loading:', function () {
expect(localStorage.getItem('mx_is_url')).toEqual(DEFAULT_IS_URL);
}).done(done, done);
});
+
+ it('should not register as a guest when using a #/login link', function() {
+ loadApp({
+ uriFragment: "#/login",
+ });
+
+ return q.delay(100).then(() => {
+ // we expect a single component
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.login.Login'));
+
+ // the only outstanding request should be a GET /login
+ // (in particular there should be no /register request for
+ // guest registration).
+ for (const req of httpBackend.requests) {
+ if (req.method === 'GET' && req.path.endsWith('/_matrix/client/r0/login')) {
+ continue;
+ }
+
+ throw new Error(`Unexpected HTTP request to ${req}`);
+ }
+ return completeLogin(matrixChat);
+ }).then(() => {
+
+ // once the sync completes, we should have a room view
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.HomePage'));
+ expect(windowLocation.hash).toEqual("#/home");
+ });
+ });
});
describe("MatrixClient rehydrated from stored credentials:", function() {
@@ -271,9 +264,30 @@ describe('loading:', function () {
localStorage.setItem("mx_is_url", "http://localhost" );
localStorage.setItem("mx_access_token", "access_token");
localStorage.setItem("mx_user_id", "@me:localhost");
+ localStorage.setItem("mx_last_room_id", "!last_room:id");
+ });
+
+ it('shows the last known room by default', function() {
+ httpBackend.when('GET', '/pushrules').respond(200, {});
+ httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
+
+ loadApp();
+
+ return awaitSyncingSpinner(matrixChat).then(() => {
+ // we got a sync spinner - let the sync complete
+ return expectAndAwaitSync();
+ }).then(() => {
+ // once the sync completes, we should have a room view
+ return awaitRoomView(matrixChat);
+ }).then(() => {
+ httpBackend.verifyNoOutstandingExpectation();
+ expect(windowLocation.hash).toEqual("#/room/!last_room:id");
+ });
});
it('shows a home page by default if we have no joined rooms', function(done) {
+ localStorage.removeItem("mx_last_room_id");
+
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
@@ -309,7 +323,79 @@ describe('loading:', function () {
httpBackend.verifyNoOutstandingExpectation();
expect(windowLocation.hash).toEqual("#/room/!room:id");
}).done(done, done);
+ });
+ it("logs in correctly with a Riot Team Server", function() {
+ sdk.setFetch(httpBackend.fetchFn); // XXX: ought to restore this!
+
+ httpBackend.when('GET', '/pushrules').respond(200, {});
+ httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
+
+ loadApp({
+ config: {
+ teamServerConfig: {
+ teamServerURL: 'http://my_team_server',
+ },
+ },
+ });
+
+ return q.delay(1).then(() => {
+ // we expect a loading spinner while we log into the RTS
+ assertAtLoadingSpinner(matrixChat);
+
+ httpBackend.when('GET', 'my_team_server/login').respond(200, {
+ team_token: 'nom',
+ });
+ return httpBackend.flush();
+ }).then(() => {
+ return awaitSyncingSpinner(matrixChat)
+ }).then(() => {
+ // we got a sync spinner - let the sync complete
+ return expectAndAwaitSync();
+ }).then(() => {
+ // once the sync completes, we should have a home page
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.HomePage'));
+ });
+ });
+
+ describe('/#/login link:', function() {
+ beforeEach(function() {
+ loadApp({
+ uriFragment: "#/login",
+ });
+
+ // give the UI a chance to display
+ return q.delay(50);
+ });
+
+ it('shows a login view', function() {
+ // we expect a single component
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.login.Login')
+ );
+
+ // the only outstanding request should be a GET /login
+ // (in particular there should be no /register request for
+ // guest registration, nor /sync, etc).
+ for (const req of httpBackend.requests) {
+ if (req.method === 'GET' && req.path.endsWith('/_matrix/client/r0/login')) {
+ continue;
+ }
+
+ throw new Error(`Unexpected HTTP request to ${req}`);
+ }
+ });
+
+ it('shows the homepage after login', function() {
+ return completeLogin(matrixChat).then(() => {
+ // we should see a home page, even though we previously had
+ // a stored mx_last_room_id
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.HomePage'));
+ expect(windowLocation.hash).toEqual("#/home");
+ });
+ });
});
});
@@ -410,6 +496,76 @@ describe('loading:', function () {
expect(windowLocation.hash).toEqual("#/room/!room:id");
}).done(done, done);
});
+
+ describe('Login as user', function() {
+ beforeEach(function() {
+ // first we have to load the homepage
+ loadApp();
+
+ httpBackend.when('POST', '/register').check(function(req) {
+ expect(req.queryParams.kind).toEqual('guest');
+ }).respond(200, {
+ user_id: "@guest:localhost",
+ access_token: "secret_token",
+ });
+
+ return httpBackend.flush().then(() => {
+ return awaitSyncingSpinner(matrixChat);
+ }).then(() => {
+ // we got a sync spinner - let the sync complete
+ return expectAndAwaitSync();
+ }).then(() => {
+ // once the sync completes, we should have a home page
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.HomePage'));
+
+ // we simulate a click on the 'login' button by firing off
+ // the relevant dispatch.
+ //
+ // XXX: is it an anti-pattern to access the react-sdk's
+ // dispatcher in this way? Is it better to find the login
+ // button and simulate a click? (we might have to arrange
+ // for it to be shown - it's not always, due to the
+ // collapsing left panel
+
+ dis.dispatch({ action: 'start_login' });
+
+ return q.delay(1);
+ });
+ });
+
+ it('should give us a login page', function() {
+ expect(windowLocation.hash).toEqual("#/login");
+
+ // we expect a single component
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.login.Login')
+ );
+ });
+
+ it('should allow us to return to the app', function() {
+ const login = ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.login.Login')
+ );
+
+ const linkText = 'Return to app';
+
+ const returnToApp = ReactTestUtils.scryRenderedDOMComponentsWithTag(
+ login, 'a').find((e) => e.innerText === linkText);
+
+ if (!returnToApp) {
+ throw new Error(`Couldn't find '${linkText}' link`);
+ }
+
+ ReactTestUtils.Simulate.click(returnToApp);
+
+ return q.delay(1).then(() => {
+ // we should be straight back into the home page
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.HomePage'));
+ });
+ });
+ });
});
describe('Token login:', function() {
@@ -434,12 +590,12 @@ describe('loading:', function () {
return httpBackend.flush();
}).then(() => {
- // at this point, MatrixChat should fire onLoadCompleted, which
+ // at this point, MatrixChat should fire onTokenLoginCompleted, which
// makes index.js reload the app. We're not going to attempt to
// simulate the reload - just check that things are left in the
// right state for the reloaded app.
- return loadCompletePromise;
+ return tokenLoginCompletePromise;
}).then(() => {
// check that the localstorage has been set up in such a way that
// the reloaded app can pick up where we leave off.
@@ -450,6 +606,44 @@ describe('loading:', function () {
}).done(done, done);
});
});
+
+
+ // check that we have a Login component, send a 'user:pass' login,
+ // and await the HTTP requests.
+ function completeLogin(matrixChat) {
+ // we expect a single component
+ const login = ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('structures.login.Login'));
+
+ httpBackend.when('POST', '/login').check(function(req) {
+ expect(req.data.type).toEqual('m.login.password');
+ expect(req.data.identifier.type).toEqual('m.id.user');
+ expect(req.data.identifier.user).toEqual('user');
+ expect(req.data.password).toEqual('pass');
+ }).respond(200, {
+ user_id: '@user:id',
+ device_id: 'DEVICE_ID',
+ access_token: 'access_token',
+ });
+ login.onPasswordLogin("user", undefined, undefined, "pass");
+
+ return httpBackend.flush().then(() => {
+ // Wait for another trip around the event loop for the UI to update
+ return q.delay(1);
+ }).then(() => {
+ // we expect a spinner
+ ReactTestUtils.findRenderedComponentWithType(
+ matrixChat, sdk.getComponent('elements.Spinner'));
+
+ httpBackend.when('GET', '/pushrules').respond(200, {});
+ httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
+ return expectAndAwaitSync().catch((e) => {
+ throw new Error("Never got /sync after login: did the client start?");
+ });
+ }).then(() => {
+ httpBackend.verifyNoOutstandingExpectation();
+ });
+ }
});
// assert that we are on the loading page
@@ -465,19 +659,22 @@ function assertAtLoadingSpinner(matrixChat) {
// the page includes a logout link.
function awaitSyncingSpinner(matrixChat, retryLimit, retryCount) {
if (retryLimit === undefined) {
- retryLimit = 5;
+ retryLimit = 10;
}
if (retryCount === undefined) {
retryCount = 0;
}
- if (matrixChat.state.loading || matrixChat.state.loggingIn) {
+ if (matrixChat.state.view === VIEWS.LOADING ||
+ matrixChat.state.view === VIEWS.LOGGING_IN) {
console.log(Date.now() + " Awaiting sync spinner: still loading.");
if (retryCount >= retryLimit) {
throw new Error("MatrixChat still not loaded after " +
retryCount + " tries");
}
- return q.delay(0).then(() => {
+ // loading can take quite a long time, because we delete the
+ // indexedDB store.
+ return q.delay(5).then(() => {
return awaitSyncingSpinner(matrixChat, retryLimit, retryCount + 1);
});
}
@@ -508,8 +705,7 @@ function awaitRoomView(matrixChat, retryLimit, retryCount) {
retryCount = 0;
}
- if (matrixChat.state.loading ||
- !(matrixChat.state.loggedIn && matrixChat.state.ready)) {
+ if (matrixChat.state.view !== VIEWS.LOGGED_IN || !matrixChat.state.ready) {
console.log(Date.now() + " Awaiting room view: not ready yet.");
if (retryCount >= retryLimit) {
throw new Error("MatrixChat still not ready after " +
diff --git a/test/mock-request.js b/test/mock-request.js
index 0ebabb03..64ac6c06 100644
--- a/test/mock-request.js
+++ b/test/mock-request.js
@@ -13,7 +13,7 @@ function HttpBackend() {
// the request function dependency that the SDK needs.
this.requestFn = function(opts, callback) {
const req = new Request(opts, callback);
- console.log("HTTP backend received request: " + req);
+ console.log(`${Date.now()} HTTP backend received request: ${req}`);
self.requests.push(req);
const abort = function() {
@@ -30,6 +30,33 @@ function HttpBackend() {
abort: abort,
};
};
+
+ // very simplistic mapping from the whatwg fetch interface onto the request
+ // interface, so we can use the same mock backend for both.
+ this.fetchFn = function(input, init) {
+ init = init || {};
+ const requestOpts = {
+ uri: input,
+ method: init.method || 'GET',
+ body: init.body,
+ };
+
+ return new Promise((resolve, reject) => {
+ function callback(err, response, body) {
+ if (err) {
+ reject(err);
+ }
+ resolve({
+ ok: response.statusCode >= 200 && response.statusCode < 300,
+ json: () => body,
+ });
+ };
+
+ const req = new Request(requestOpts, callback);
+ console.log(`HTTP backend received request: ${req}`);
+ self.requests.push(req);
+ });
+ };
}
HttpBackend.prototype = {
/**
@@ -37,7 +64,7 @@ HttpBackend.prototype = {
* @param {string} path The path to flush (optional) default: all.
* @param {integer} numToFlush The number of things to flush (optional), default: all.
* @param {integer=} waitTime The time (in ms) to wait for a request to happen.
- * default: 5
+ * default: 100
*
* @return {Promise} resolves when there is nothing left to flush, with the
* number of requests flushed
@@ -46,49 +73,46 @@ HttpBackend.prototype = {
const defer = q.defer();
const self = this;
let flushed = 0;
- let triedWaiting = false;
if (waitTime === undefined) {
- waitTime = 5;
+ waitTime = 100;
}
- console.log(
- "HTTP backend flushing... (path=" + path
+
+ function log(msg) {
+ console.log(`${Date.now()} flush[${path || ''}]: ${msg}`);
+ }
+
+ log("HTTP backend flushing... (path=" + path
+ " numToFlush=" + numToFlush
+ " waitTime=" + waitTime
+ ")",
);
+ const endTime = waitTime + Date.now();
+
const tryFlush = function() {
// if there's more real requests and more expected requests, flush 'em.
- console.log(
- " trying to flush queue => reqs=[" + self.requests
- + "] expected=[" + self.expectedRequests
- + "]",
+ log(` trying to flush => reqs=[${self.requests}] ` +
+ `expected=[${self.expectedRequests}]`,
);
if (self._takeFromQueue(path)) {
// try again on the next tick.
flushed += 1;
if (numToFlush && flushed === numToFlush) {
- console.log(" Flushed assigned amount:", numToFlush);
+ log(`Flushed assigned amount: ${numToFlush}`);
defer.resolve(flushed);
} else {
- console.log(" flushed. Trying for more.");
+ log(` flushed. Trying for more.`);
setTimeout(tryFlush, 0);
}
- } else if (flushed === 0 && !triedWaiting) {
+ } else if (flushed === 0 && Date.now() < endTime) {
// we may not have made the request yet, wait a generous amount of
// time before giving up.
- console.log(
- " nothing to flush yet; waiting " + waitTime +
- "ms for requests.")
- setTimeout(tryFlush, waitTime);
- triedWaiting = true;
+ log(` nothing to flush yet; waiting for requests.`);
+ setTimeout(tryFlush, 5);
} else {
if (flushed === 0) {
- console.log(" nothing to flush; giving up");
+ log("nothing to flush; giving up");
} else {
- console.log(
- " no more flushes after flushing", flushed,
- "requests",
- );
+ log(`no more flushes after flushing ${flushed} requests`);
}
defer.resolve(flushed);
}
@@ -138,7 +162,7 @@ HttpBackend.prototype = {
matchingReq.checks[j](req);
}
testResponse = matchingReq.response;
- console.log(" responding to %s", matchingReq.path);
+ console.log(`${Date.now()} responding to ${matchingReq.path}`);
let body = testResponse.body;
if (Object.prototype.toString.call(body) == "[object Function]") {
body = body(req.path, req.data);
diff --git a/test/test-utils.js b/test/test-utils.js
index 53528e5c..cda9a017 100644
--- a/test/test-utils.js
+++ b/test/test-utils.js
@@ -7,7 +7,7 @@ var q = require('q');
* name to stdout.
* @param {Mocha.Context} context The test context
*/
-module.exports.beforeEach = function(context) {
+export function beforeEach(context) {
var desc = context.currentTest.fullTitle();
console.log();
console.log(desc);
@@ -16,13 +16,43 @@ module.exports.beforeEach = function(context) {
// some tests store things in localstorage. Improve independence of tests
// by making sure that they don't inherit any old state.
window.localStorage.clear();
-};
+}
/**
* returns true if the current environment supports webrtc
*/
-module.exports.browserSupportsWebRTC = function() {
+export function browserSupportsWebRTC() {
var n = global.window.navigator;
return n.getUserMedia || n.webkitGetUserMedia ||
n.mozGetUserMedia;
-};
+}
+
+export function deleteIndexedDB(dbName) {
+ return new q.Promise((resolve, reject) => {
+ if (!window.indexedDB) {
+ resolve();
+ return;
+ }
+
+ console.log(`${Date.now()}: Removing indexeddb instance: ${dbName}`);
+ const req = window.indexedDB.deleteDatabase(dbName);
+
+ req.onblocked = () => {
+ console.log(`${Date.now()}: can't yet delete indexeddb ${dbName} because it is open elsewhere`);
+ };
+
+ req.onerror = (ev) => {
+ reject(new Error(
+ `${Date.now()}: unable to delete indexeddb ${dbName}: ${ev.target.error}`,
+ ));
+ };
+
+ req.onsuccess = () => {
+ console.log(`${Date.now()}: Removed indexeddb instance: ${dbName}`);
+ resolve();
+ };
+ }).catch((e) => {
+ console.error(`${Date.now()}: Error removing indexeddb instance ${dbName}: ${e}`);
+ throw e;
+ });
+}