Merge branch 'develop' into patch-2

This commit is contained in:
rugk 2018-02-15 13:16:34 +01:00 committed by GitHub
commit e3dcaebe9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
142 changed files with 3675 additions and 1349 deletions

View File

@ -1,3 +1,5 @@
<!-- Please report security issues by email to security@matrix.org -->
<!-- This is a bug report template. By following the instructions below and <!-- This is a bug report template. By following the instructions below and
filling out the sections with your information, you will help the us to get all filling out the sections with your information, you will help the us to get all
the necessary data to fix your issue. the necessary data to fix your issue.

View File

@ -3,7 +3,10 @@ dist: trusty
# we don't need sudo, so can run in a container, which makes startup much # we don't need sudo, so can run in a container, which makes startup much
# quicker. # quicker.
sudo: false #
# unfortunately we do temporarily require sudo as a workaround for
# https://github.com/travis-ci/travis-ci/issues/8836
sudo: required
language: node_js language: node_js
node_js: node_js:

View File

@ -13,3 +13,6 @@ include:
* Michael Telatynski (https://github.com/t3chguy) * Michael Telatynski (https://github.com/t3chguy)
Improved consistency of inverted elements in dark theme across browsers Improved consistency of inverted elements in dark theme across browsers
* Alexandr Korsak (https://github.com/oivoodoo)
Improved multiple file uploading

View File

@ -128,8 +128,13 @@ You can configure the app by copying `config.sample.json` to
1. `cross_origin_renderer_url`: URL to a static HTML page hosting code to help display 1. `cross_origin_renderer_url`: URL to a static HTML page hosting code to help display
encrypted file attachments. This MUST be hosted on a completely separate domain to encrypted file attachments. This MUST be hosted on a completely separate domain to
anything else since it is used to isolate the privileges of file attachments to this anything else since it is used to isolate the privileges of file attachments to this
domain. Default: `usercontent.riot.im`. This needs to contain v1.html from domain. Default: `https://usercontent.riot.im/v1.html`. This needs to contain v1.html from
https://github.com/matrix-org/usercontent/blob/master/v1.html https://github.com/matrix-org/usercontent/blob/master/v1.html
1. `piwik`: an object containing the following properties:
1. `url`: The URL of the Piwik instance to use for collecting Analytics
1. `whitelistedHSUrls`: a list of HS URLs to not redact from the Analytics
1. `whitelistedISUrls`: a list of IS URLs to not redact from the Analytics
1. `siteId`: The Piwik Site ID to use when sending Analytics to the Piwik server configured above
Running as a Desktop app Running as a Desktop app
======================== ========================
@ -314,31 +319,51 @@ For a developer guide, see the [translating dev doc](docs/translating-dev.md).
Triaging issues Triaging issues
=============== ===============
Issues will be triaged by the core team using the following primary set of tags: Issues will be triaged by the core team using the below set of tags.
priority: Tags are meant to be used in combination - e.g.:
* P1 critical bug == really urgent stuff that should be next in the bugfixing todo list
* "release blocker" == stuff which is blocking us from cutting the next release.
* P1 feature type:voip == what VoIP features should we be working on next?
* P1: top priority; typically blocks releases priority: **compulsory**
* P1: top priority - i.e. pool of stuff which we should be working on next
* P2: still need to fix, but lower than P1 * P2: still need to fix, but lower than P1
* P3: non-urgent * P3: non-urgent
* P4: intereseting idea - bluesky some day * P4: interesting idea - bluesky some day
* P5: recorded for posterity/to avoid duplicates. No intention to resolves right now. * P5: recorded for posterity/to avoid duplicates. No intention to resolves right now.
bug or feature: bug or feature: **compulsory**
* bug * bug
* feature * feature
bug severity: bug severity: **compulsory, if bug**
* cosmetic - feature works functionally but UI/UX is broken
* critical - whole app doesn't work * critical - whole app doesn't work
* major - entire feature doesn't work * major - entire feature doesn't work
* minor - partially broken feature (but still usable) * minor - partially broken feature (but still usable)
* cosmetic - feature works functionally but UI/UX is broken
additional categories: types
* type:* - refers to a particular part of the app; used to filter bugs
on a given topic - e.g. VOIP, signup, timeline, etc.
additional categories (self-explanatory):
* release blocker * release blocker
* ui/ux (think of this as cosmetic) * ui/ux (think of this as cosmetic)
* network (specific to network conditions) * network (specific to network conditions)
* platform (platform specific) * platform specific
* accessibility
* maintenance
* performance
* i18n
* blocked - whether this issue currently can't be progressed due to outside factors
community engagement
* easy
* hacktoberfest
* bounty? - proposal to be included in a bounty programme
* bounty - included in Status Open Bounty

View File

@ -1,6 +1,10 @@
{ {
"default_hs_url": "https://matrix.org", "default_hs_url": "https://matrix.org",
"default_is_url": "https://vector.im", "default_is_url": "https://vector.im",
"disable_custom_urls": false,
"disable_guests": false,
"disable_login_language_selector": false,
"disable_3pid_login": false,
"brand": "Riot", "brand": "Riot",
"integrations_ui_url": "https://scalar.vector.im/", "integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api", "integrations_rest_url": "https://scalar.vector.im/api",
@ -10,6 +14,8 @@
"feature_pinning": "labs" "feature_pinning": "labs"
}, },
"default_federate": true, "default_federate": true,
"welcomePageUrl": "home.html",
"default_theme": "light",
"roomDirectory": { "roomDirectory": {
"servers": [ "servers": [
"matrix.org" "matrix.org"
@ -18,6 +24,8 @@
"welcomeUserId": "@riot-bot:matrix.org", "welcomeUserId": "@riot-bot:matrix.org",
"piwik": { "piwik": {
"url": "https://piwik.riot.im/", "url": "https://piwik.riot.im/",
"whitelistedHSUrls": ["https://matrix.org"],
"whitelistedISUrls": ["https://vector.im", "https://matrix.org"],
"siteId": 1 "siteId": 1
} }
} }

68
docs/skinning thoughts.md Normal file
View File

@ -0,0 +1,68 @@
== Skinning refactor ==
matrix-react-sdk
- base images
- base CSS
- all the components needed to build a workable app (including the top layer)
riot-web: the riot skin
- riot-specific classes (e.g. login header/footer)
- riot-specific themes
- light
- dark
i.e. the only things which should go into riot-web are bits which apply vector-specific skinning
specifically "Stuff that any other brand would not want to use. (e.g. riot logos, links, T&Cs)"
- Questions:
- Electron app? (should probably be a separate repo in its own right? but might as well go here for now)
- index.html & index.js? (should be in matrix-react-sdk, given the SDK is useless without them?)
ideally matrix-react-sdk itself should ship with a default skin which actually works built in.
status skin (can go in the same app for now)
- has status theme
- which inherits from riot light theme
- how do we share graphics between skins?
- shove them into react-sdk, or...
- guess we do ../../vector/img
- this means keeping the skin name in the images (unless /img is a shortcut to the right skin's images)
out of scope:
- making the components more independent, so they can be used in isolation.
- that said, the bits which should probably be used by being embeded into a different app:
- login/reg
- RoomView + RoomSettings
- MessageComposer
- RoomList
- MemberList
- MemberInfo
- Voip UI
- UserSettings
- sharing different js-sdks between the different isolated modules
other changes:
- how do we handle i18n?
- each skin should really be its own i18n project. As long as all the commonality stuff is in matrix-react-sdk this shouldn't be too bad.
- ability to associate components with a given skin
- skins/vector/src <-- components
- skins/vector/css
- skins/vector/img
- skins/vector/fonts
- gather together themes (per skin) into a single place too
- skins/vector/themes/foo/css
- skins/vector/themes/foo/img
- skins/vector/themes/foo/fonts
- ideally riot-web would contain almost nothing but skins/vector directory.
- ability to entirely replace CSS rather than override it for a given theme
- e.g. if we replace `Login.js` with `StatusLogin.js`, then we should similarly be able to replace `_Login.scss` with `_StatusLogin.scss`.
random thoughts;
- should we be able to change the entire skin at runtime (more like wordpress) - to the extent of replacing entire components?
- might pose security issues if a theme can be swapped out to replace MatrixChat or other fundamental functionality at runtime
- if so, perhaps skins & themes should converge...
-----------------
Immediate plan for Status:
* Implement it as a theme for the riot skin
* Ideally move skins to a sensible level (possibly even including src?)

View File

@ -36,9 +36,13 @@ function getColorName(hex) {
## Adding variables inside a string. ## Adding variables inside a string.
1. Extend your ``_t()`` call. Instead of ``_t(STRING)`` use ``_t(STRING, {})`` 1. Extend your ``_t()`` call. Instead of ``_t(STRING)`` use ``_t(STRING, {})``
2. Decide how to name it. Please think about if the person who has to translate it can understand what it does. 1. Decide how to name it. Please think about if the person who has to translate it can understand what it does. E.g. using the name 'recipient' is bad, because a translator does not know if it is the name of a person, an email address, a user ID, etc. Rather use e.g. recipientEmailAddress.
3. Add it to the array in ``_t`` for example ``_t(STRING, {variable: this.variable})`` 1. Add it to the array in ``_t`` for example ``_t(STRING, {variable: this.variable})``
4. Add the variable inside the string. The syntax for variables is ``%(variable)s``. Please note the s at the end. The name of the variable has to match the previous used name. 1. Add the variable inside the string. The syntax for variables is ``%(variable)s``. Please note the _s_ at the end. The name of the variable has to match the previous used name.
- You can use the special ``count`` variable to choose between multiple versions of the same string, in order to get the correct pluralization. E.g. ``_t('You have %(count)s new messages', { count: 2 })`` would show 'You have 2 new messages', while ``_t('You have %(count)s new messages', { count: 1 })`` would show 'You have one new message' (assuming a singular version of the string has been added to the translation file. See above). Passing in ``count`` is much prefered over having an if-statement choose the correct string to use, because some languages have much more complicated plural rules than english (e.g. they might need a completely different form if there are three things rather than two).
- If you want to translate text that includes e.g. hyperlinks or other HTML you have to also use tag substitution, e.g. ``_t('<a>Click here!</a>', {}, { 'a': (sub) => <a>{sub}</a> })``. If you don't do the tag substitution you will end up showing literally '<a>' rather than making a hyperlink.
- You can also use React components with normal variable substitution if you want to insert HTML markup, e.g. ``_t('Your email address is %(emailAddress)s', { emailAddress: <i>{userEmailAddress}</i> })``.
## Things to know/Style Guides ## Things to know/Style Guides
@ -47,3 +51,5 @@ function getColorName(hex) {
- If a string is presented in the UI with punctuation like a full stop, include this in the translation strings, since punctuation varies between languages too. - If a string is presented in the UI with punctuation like a full stop, include this in the translation strings, since punctuation varies between languages too.
- Avoid "translation in parts", i.e. concatenating translated strings or using translated strings in variable substitutions. Context is important for translations, and translating partial strings this way is simply not always possible. - Avoid "translation in parts", i.e. concatenating translated strings or using translated strings in variable substitutions. Context is important for translations, and translating partial strings this way is simply not always possible.
- Concatenating strings often also introduces an implicit assumption about word order (e.g. that the subject of the sentence comes first), which is incorrect for many languages. - Concatenating strings often also introduces an implicit assumption about word order (e.g. that the subject of the sentence comes first), which is incorrect for many languages.
- Translation 'smell test': If you have a string that does not begin with a capital letter (is not the start of a sentence) or it ends with e.g. ':' or a preposition (e.g. 'to') you should recheck that you are not trying to translate a partial sentence.
- If you have multiple strings, that are almost identical, except some part (e.g. a word or two) it is still better to translate the full sentence multiple times. It may seem like inefficient repetion, but unlike programming where you try to minimize repetition, translation is much faster if you have many, full, clear, sentences to work with, rather than fewer, but incomplete sentence fragments.

View File

@ -35,7 +35,7 @@ Head to the explanations under Steb 2b
## Step 2b: Adding a new language ## Step 2b: Adding a new language
1. Go to one of the projects listed https://translate.riot.im/projects/riot-web/ 1. Go to one of the projects listed https://translate.riot.im/projects/riot-web/
2. Click the ``Start new language`` button at the bottom 2. Click the ``Start new translation`` button at the bottom
3. Select a language 3. Select a language
4. Start translating like in 2a.3 4. Start translating like in 2a.3
5. Repeat these steps for the other projects which are listed at the link of step 2b.1 5. Repeat these steps for the other projects which are listed at the link of step 2b.1

View File

@ -4,7 +4,7 @@
"main": "electron_app/src/electron-main.js", "main": "electron_app/src/electron-main.js",
"version": "0.13.5", "version": "0.13.5",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.", "author": "New Vector Ltd.",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/vector-im/riot-web" "url": "https://github.com/vector-im/riot-web"
@ -74,8 +74,7 @@
"pako": "^1.0.5", "pako": "^1.0.5",
"prop-types": "^15.5.10", "prop-types": "^15.5.10",
"react": "^15.6.0", "react": "^15.6.0",
"react-dnd": "^2.1.4", "react-beautiful-dnd": "^4.0.1",
"react-dnd-html5-backend": "^2.1.2",
"react-dom": "^15.6.0", "react-dom": "^15.6.0",
"react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef", "react-gemini-scrollbar": "matrix-org/react-gemini-scrollbar#5e97aef",
"sanitize-html": "^1.11.1", "sanitize-html": "^1.11.1",

192
res/home-status.html Normal file
View File

@ -0,0 +1,192 @@
<style type="text/css">
/* we deliberately inline style here to avoid flash-of-CSS problems, and to avoid
* voodoo where we have to set display: none by default
*/
.mx_HomePage_container {
text-align: center;
display: block ! important;
width: 690px;
margin: 20px;
}
.mx_HomePage_header {
margin-top: 37px;
margin-left: 10px;
width: 670px;
box-sizing: border-box;
font-size: 18px;
background-color: #fff;
box-shadow: 0px 2px 10px 0px rgba(48,55,81,0.05);
border-radius: 5px;
padding: 20px 80px 20px 80px;
align-items: center;
}
.mx_HomePage_header h1 {
font-size: 29px;
margin-bottom: 10px;
}
.mx_HomePage_intro h2 {
margin-top: 32px;
font-size: 25px;
color: #49555F;
}
.mx_HomePage_intro {
margin: auto;
width: 600px;
margin-top: 40px;
margin-bottom: 40px;
font-size: 18px;
}
.mx_HomePage_coc {
font-size: 16px;
}
.mx_HomePage_coc a {
color: #4360DF;
}
.mx_HomePage_room, .mx_HomePage_telegram {
float: left;
background-color: #fff;
box-shadow: 0px 2px 10px 0px rgba(48,55,81,0.05);
border-radius: 5px;
margin: 10px;
width: 210px;
height: 250px;
display: flex;
flex-direction: column;
align-items: center;
}
.mx_HomePage_telegram {
background-color: transparent;
border: 1px solid rgba(113, 129, 142, 0.2);
box-shadow: none;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
font-size: 16px;
line-height: 25px;
box-sizing: border-box;
}
.mx_HomePage_telegram a {
text-transform: uppercase;
color: #4360DF;
font-size: 13px;
font-family: PostGrotesk-Medium, Arial, Helvetica, Sans-Serif;
font-weight: 600;
opacity: 1.0;
transition: opacity .2s ease;
}
.mx_HomePage_telegram a:hover {
opacity: 0.5;
}
.mx_HomePage_room .mx_HomePage_icon {
margin-top: 24px;
margin-bottom: 16px;
width: 50px;
height: 50px;
}
.mx_HomePage_room .mx_HomePage_name {
display: block;
font-family: PostGrotesk-Medium, Arial, Helvetica, Sans-Serif;
font-weight: 600;
font-size: 15px;
color: #49555F;
line-height: 25px;
margin: 0px 12px 0px 12px;
}
.mx_HomePage_room .mx_HomePage_desc {
flex: 1;
display: block;
margin: 0px 12px 0px 12px;
font-size: 14px;
line-height: 20px;
}
.mx_HomePage_button {
align-self: normal;
margin: 12px;
border-radius: 8px;
border: 1px solid rgba(199, 206, 209, 0.12);
background-color: #6CC1F6;
font-size: 13px;
font-family: PostGrotesk-Medium, Arial, Helvetica, Sans-Serif;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
color: #fff ! important;
cursor: pointer;
outline: none;
padding: 14px;
box-sizing: border-box;
padding-left: 1.5em;
padding-right: 1.5em;
}
</style>
<div class="mx_HomePage_container">
<div class="mx_HomePage_header">
<div>
<h1>Welcome to Status Community Chat, powered by Riot.</h1>
<p>For contributors, developers and Ethereum-enthusiasts who care about the movement for decentralization.</p>
</div>
</div>
<div class="mx_HomePage_intro">
<h2>Our rooms</h2>
<p>Please abide by the channels discussion categories and remain on topic to the specific category details listed.</p>
<p class="mx_HomePage_coc">Before posting please refer to our <a href="https://wiki.status.im/Code_of_conduct">Code of Conduct</a></p>
</div>
<div class="mx_HomePage_room">
<img class="mx_HomePage_icon" src="themes/status/img/a.png">
<span class="mx_HomePage_name">#announcements</span>
<span class="mx_HomePage_desc">Company wide announcements.</span>
<a class="mx_HomePage_button" href="#/room/#announcements:status.im">Join</a>
</div>
<div class="mx_HomePage_room">
<img class="mx_HomePage_icon" src="themes/status/img/i.png">
<span class="mx_HomePage_name">#introductions</span>
<span class="mx_HomePage_desc">Newcomer introductions.</span>
<a class="mx_HomePage_button" href="#/room/#introductions:status.im">Join</a>
</div>
<div class="mx_HomePage_room">
<img class="mx_HomePage_icon" src="themes/status/img/g.png">
<span class="mx_HomePage_name">#general</span>
<span class="mx_HomePage_desc">General discussions of Status.</span>
<a class="mx_HomePage_button" href="#/room/#general:status.im">Join</a>
</div>
<div class="mx_HomePage_room">
<img class="mx_HomePage_icon" src="themes/status/img/d.png">
<span class="mx_HomePage_name">#dev-status</span>
<span class="mx_HomePage_desc">Contributing to our codebase? Building a DApp or a chatbot? We're here to help.</span>
<a class="mx_HomePage_button" href="#/room/#dev-status:status.im">Join</a>
</div>
<div class="mx_HomePage_room">
<img class="mx_HomePage_icon" src="themes/status/img/n.png">
<span class="mx_HomePage_name">#news-articles</span>
<span class="mx_HomePage_desc">Share news, articles related to Ethereum or projects you're excited about</span>
<a class="mx_HomePage_button" href="#/room/#news-articles:status.im">Join</a>
</div>
<div class="mx_HomePage_telegram">
<p>
Interested in market and cryptocurrency type discussions?
</p>
<a href="https://t.me/StatusNetworkChat">Join Telegram</a>
</div>
</div>

View File

@ -9,6 +9,7 @@
// This could readily be automated, but it's nice to explicitly // This could readily be automated, but it's nice to explicitly
// control when we languages are available. // control when we languages are available.
const INCLUDE_LANGS = [ const INCLUDE_LANGS = [
{'value': 'ca', 'label': 'Català'},
{'value': 'da', 'label': 'Dansk'}, {'value': 'da', 'label': 'Dansk'},
{'value': 'de_DE', 'label': 'Deutsch'}, {'value': 'de_DE', 'label': 'Deutsch'},
{'value': 'en_EN', 'label': 'English'}, {'value': 'en_EN', 'label': 'English'},
@ -16,7 +17,7 @@ const INCLUDE_LANGS = [
{'value': 'el', 'label': 'Ελληνικά'}, {'value': 'el', 'label': 'Ελληνικά'},
{'value': 'eo', 'label': 'Esperanto'}, {'value': 'eo', 'label': 'Esperanto'},
{'value': 'es', 'label': 'Español'}, {'value': 'es', 'label': 'Español'},
{'value': 'eu', 'label': 'Euskal'}, {'value': 'eu', 'label': 'Euskara'},
{'value': 'fi', 'label': 'Suomi'}, {'value': 'fi', 'label': 'Suomi'},
{'value': 'fr', 'label': 'Français'}, {'value': 'fr', 'label': 'Français'},
{'value': 'hu', 'label': 'Magyar'}, {'value': 'hu', 'label': 'Magyar'},
@ -43,10 +44,11 @@ const INCLUDE_LANGS = [
const COPY_LIST = [ const COPY_LIST = [
["res/manifest.json", "webapp"], ["res/manifest.json", "webapp"],
["res/home.html", "webapp"], ["res/home.html", "webapp"],
["res/home-status.html", "webapp"],
["res/home/**", "webapp/home"], ["res/home/**", "webapp/home"],
["res/{media,vector-icons}/**", "webapp"], ["res/{media,vector-icons}/**", "webapp"],
["res/flags/*", "webapp/flags/"], ["res/flags/*", "webapp/flags/"],
["src/skins/vector/{fonts,img}/**", "webapp"], ["src/skins/vector/{fonts,img,themes}/**", "webapp"],
["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"], ["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"],
["node_modules/emojione/assets/png/*", "webapp/emojione/png/"], ["node_modules/emojione/assets/png/*", "webapp/emojione/png/"],
["./config.json", "webapp", { directwatch: 1 }], ["./config.json", "webapp", { directwatch: 1 }],

View File

@ -21,7 +21,7 @@ import sdk from 'matrix-react-sdk';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import Velocity from 'velocity-vector'; import Velocity from 'velocity-vector';
import 'velocity-vector/velocity.ui'; import 'velocity-vector/velocity.ui';
import UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore'; import SettingsStore from "matrix-react-sdk/lib/settings/SettingsStore";
const CALLOUT_ANIM_DURATION = 1000; const CALLOUT_ANIM_DURATION = 1000;
@ -167,7 +167,6 @@ module.exports = React.createClass({
const StartChatButton = sdk.getComponent('elements.StartChatButton'); const StartChatButton = sdk.getComponent('elements.StartChatButton');
const RoomDirectoryButton = sdk.getComponent('elements.RoomDirectoryButton'); const RoomDirectoryButton = sdk.getComponent('elements.RoomDirectoryButton');
const CreateRoomButton = sdk.getComponent('elements.CreateRoomButton'); const CreateRoomButton = sdk.getComponent('elements.CreateRoomButton');
const GroupsButton = sdk.getComponent('elements.GroupsButton');
const SettingsButton = sdk.getComponent('elements.SettingsButton'); const SettingsButton = sdk.getComponent('elements.SettingsButton');
return ( return (
@ -183,7 +182,6 @@ module.exports = React.createClass({
<div ref={this._collectCreateRoomButton}> <div ref={this._collectCreateRoomButton}>
<CreateRoomButton tooltip={true} /> <CreateRoomButton tooltip={true} />
</div> </div>
<GroupsButton tooltip={true} />
<span className="mx_BottomLeftMenu_settings"> <span className="mx_BottomLeftMenu_settings">
<SettingsButton tooltip={true} /> <SettingsButton tooltip={true} />
</span> </span>

View File

@ -17,7 +17,7 @@ limitations under the License.
'use strict'; 'use strict';
var React = require('react'); var React = require('react');
import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'CompatibilityPage', displayName: 'CompatibilityPage',
@ -40,30 +40,24 @@ module.exports = React.createClass({
return ( return (
<div className="mx_CompatibilityPage"> <div className="mx_CompatibilityPage">
<div className="mx_CompatibilityPage_box"> <div className="mx_CompatibilityPage_box">
<p>{ _tJsx("Sorry, your browser is <b>not</b> able to run Riot.", /<b>(.*?)<\/b>/, (sub) => <b>{sub}</b>) } </p> <p>{ _t("Sorry, your browser is <b>not</b> able to run Riot.", {}, { 'b': (sub) => <b>{sub}</b> }) } </p>
<p> <p>
{ _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") } { _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") }
</p> </p>
<p> <p>
{ _tJsx('Please install <a href="https://www.google.com/chrome">Chrome</a> or <a href="https://getfirefox.com">Firefox</a> for the best experience.', { _t('Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.',
[ {},
/<a href="https:\/\/www.google.com\/chrome">(.*?)<\/a>/, {
/<a href="https:\/\/getfirefox.com">(.*?)<\/a>/, 'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
], 'firefoxLink': (sub) => <a href="https://getfirefox.com">{sub}</a>,
[ },
(sub) => <a href="https://www.google.com/chrome">{sub}</a>,
(sub) => <a href="https://getfirefox.com">{sub}</a>,
]
)} )}
{ _tJsx('<a href="http://apple.com/safari">Safari</a> and <a href="http://opera.com">Opera</a> work too.', { _t('<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.',
[ {},
/<a href="http:\/\/apple\.com\/safari">(.*?)<\/a>/, {
/<a href="http:\/\/opera\.com">(.*?)<\/a>/, 'safariLink': (sub) => <a href="http://apple.com/safari">{sub}</a>,
], 'operaLink': (sub) => <a href="http://opera.com">{sub}</a>,
[ },
(sub) => <a href="http://apple.com/safari">{sub}</a>,
(sub) => <a href="http://opera.com">{sub}</a>,
]
)} )}
</p> </p>
<p> <p>

View File

@ -17,24 +17,28 @@ limitations under the License.
'use strict'; 'use strict';
import React from 'react'; import React from 'react';
import { DragDropContext } from 'react-dnd'; import PropTypes from 'prop-types';
import HTML5Backend from 'react-dnd-html5-backend';
import classNames from 'classnames'; import classNames from 'classnames';
import KeyCode from 'matrix-react-sdk/lib/KeyCode'; import { MatrixClient } from 'matrix-js-sdk';
import { KeyCode } from 'matrix-react-sdk/lib/Keyboard';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import CallHandler from 'matrix-react-sdk/lib/CallHandler';
import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton';
import VectorConferenceHandler from '../../VectorConferenceHandler'; import VectorConferenceHandler from '../../VectorConferenceHandler';
import SettingsStore from 'matrix-react-sdk/lib/settings/SettingsStore';
var LeftPanel = React.createClass({ var LeftPanel = React.createClass({
displayName: 'LeftPanel', displayName: 'LeftPanel',
// NB. If you add props, don't forget to update // NB. If you add props, don't forget to update
// shouldComponentUpdate! // shouldComponentUpdate!
propTypes: { propTypes: {
collapsed: React.PropTypes.bool.isRequired, collapsed: PropTypes.bool.isRequired,
},
contextTypes: {
matrixClient: PropTypes.instanceOf(MatrixClient),
}, },
getInitialState: function() { getInitialState: function() {
@ -163,13 +167,18 @@ var LeftPanel = React.createClass({
this.setState({ searchFilter: term }); this.setState({ searchFilter: term });
}, },
collectRoomList: function(ref) {
this._roomList = ref;
},
render: function() { render: function() {
const RoomList = sdk.getComponent('rooms.RoomList'); const RoomList = sdk.getComponent('rooms.RoomList');
const TagPanel = sdk.getComponent('structures.TagPanel');
const BottomLeftMenu = sdk.getComponent('structures.BottomLeftMenu'); const BottomLeftMenu = sdk.getComponent('structures.BottomLeftMenu');
const CallPreview = sdk.getComponent('voip.CallPreview'); const CallPreview = sdk.getComponent('voip.CallPreview');
let topBox; let topBox;
if (MatrixClientPeg.get().isGuest()) { if (this.context.matrixClient.isGuest()) {
const LoginBox = sdk.getComponent('structures.LoginBox'); const LoginBox = sdk.getComponent('structures.LoginBox');
topBox = <LoginBox collapsed={ this.props.collapsed }/>; topBox = <LoginBox collapsed={ this.props.collapsed }/>;
} else { } else {
@ -185,18 +194,33 @@ var LeftPanel = React.createClass({
} }
); );
const tagPanelEnabled = SettingsStore.isFeatureEnabled("feature_tag_panel");
const tagPanel = tagPanelEnabled ? <TagPanel /> : <div />;
const containerClasses = classNames(
"mx_LeftPanel_container",
{
"mx_LeftPanel_container_collapsed": this.props.collapsed,
"mx_LeftPanel_container_hasTagPanel": tagPanelEnabled,
},
);
return ( return (
<aside className={classes} onKeyDown={ this._onKeyDown } onFocus={ this._onFocus } onBlur={ this._onBlur }> <div className={containerClasses}>
{ topBox } { tagPanel }
<CallPreview ConferenceHandler={VectorConferenceHandler} /> <aside className={classes} onKeyDown={ this._onKeyDown } onFocus={ this._onFocus } onBlur={ this._onBlur }>
<RoomList { topBox }
collapsed={this.props.collapsed} <CallPreview ConferenceHandler={VectorConferenceHandler} />
searchFilter={this.state.searchFilter} <RoomList
ConferenceHandler={VectorConferenceHandler} /> ref={this.collectRoomList}
<BottomLeftMenu collapsed={this.props.collapsed}/> collapsed={this.props.collapsed}
</aside> searchFilter={this.state.searchFilter}
ConferenceHandler={VectorConferenceHandler} />
<BottomLeftMenu collapsed={this.props.collapsed}/>
</aside>
</div>
); );
} }
}); });
module.exports = DragDropContext(HTML5Backend)(LeftPanel); module.exports = LeftPanel;

View File

@ -24,11 +24,13 @@ import sdk from 'matrix-react-sdk';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import { MatrixClient } from 'matrix-js-sdk'; import { MatrixClient } from 'matrix-js-sdk';
import Analytics from 'matrix-react-sdk/lib/Analytics'; import Analytics from 'matrix-react-sdk/lib/Analytics';
import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc'; import RateLimitedFunc from 'matrix-react-sdk/lib/ratelimitedfunc';
import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton'; import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton';
import { showGroupInviteDialog, showGroupAddRoomDialog } from 'matrix-react-sdk/lib/GroupAddressPicker'; import { showGroupInviteDialog, showGroupAddRoomDialog } from 'matrix-react-sdk/lib/GroupAddressPicker';
import GroupStoreCache from 'matrix-react-sdk/lib/stores/GroupStoreCache'; import GroupStoreCache from 'matrix-react-sdk/lib/stores/GroupStoreCache';
import { formatCount } from 'matrix-react-sdk/lib/utils/FormattingUtils';
class HeaderButton extends React.Component { class HeaderButton extends React.Component {
constructor() { constructor() {
super(); super();
@ -47,13 +49,19 @@ class HeaderButton extends React.Component {
const TintableSvg = sdk.getComponent("elements.TintableSvg"); const TintableSvg = sdk.getComponent("elements.TintableSvg");
const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); const AccessibleButton = sdk.getComponent("elements.AccessibleButton");
return <AccessibleButton className="mx_RightPanel_headerButton" onClick={this.onClick} > return <AccessibleButton
<div className="mx_RightPanel_headerButton_badge"> aria-label={this.props.title}
{ this.props.badge ? this.props.badge : <span>&nbsp;</span> } title={this.props.title}
</div> className="mx_RightPanel_headerButton"
<TintableSvg src={this.props.iconSrc} width="25" height="25"/> onClick={this.onClick} >
{ this.props.isHighlighted ? <div className="mx_RightPanel_headerButton_highlight"></div> : <div/> }
</AccessibleButton>; <div className="mx_RightPanel_headerButton_badge">
{ this.props.badge ? this.props.badge : <span>&nbsp;</span> }
</div>
<TintableSvg src={this.props.iconSrc} width="25" height="25" />
{ this.props.isHighlighted ? <div className="mx_RightPanel_headerButton_highlight" /> : <div /> }
</AccessibleButton>;
} }
} }
@ -69,6 +77,9 @@ HeaderButton.propTypes = {
badge: PropTypes.node, badge: PropTypes.node,
// The parameters to track the click event // The parameters to track the click event
analytics: PropTypes.arrayOf(PropTypes.string).isRequired, analytics: PropTypes.arrayOf(PropTypes.string).isRequired,
// Button title
title: PropTypes.string.isRequired,
}; };
module.exports = React.createClass({ module.exports = React.createClass({
@ -116,7 +127,7 @@ module.exports = React.createClass({
return { return {
phase: this.props.groupId ? this.Phase.GroupMemberList : this.Phase.RoomMemberList, phase: this.props.groupId ? this.Phase.GroupMemberList : this.Phase.RoomMemberList,
isUserPrivilegedInGroup: null, isUserPrivilegedInGroup: null,
} };
}, },
componentWillReceiveProps(newProps) { componentWillReceiveProps(newProps) {
@ -128,9 +139,7 @@ module.exports = React.createClass({
_initGroupStore(groupId) { _initGroupStore(groupId) {
if (!groupId) return; if (!groupId) return;
this._groupStore = GroupStoreCache.getGroupStore( this._groupStore = GroupStoreCache.getGroupStore(groupId);
this.context.matrixClient, groupId,
);
this._groupStore.registerListener(this.onGroupStoreUpdated); this._groupStore.registerListener(this.onGroupStoreUpdated);
}, },
@ -140,7 +149,7 @@ module.exports = React.createClass({
} }
}, },
onGroupStoreUpdated: function(){ onGroupStoreUpdated: function() {
this.setState({ this.setState({
isUserPrivilegedInGroup: this._groupStore.isUserPrivileged(), isUserPrivilegedInGroup: this._groupStore.isUserPrivileged(),
}); });
@ -175,18 +184,17 @@ module.exports = React.createClass({
onRoomStateMember: function(ev, state, member) { onRoomStateMember: function(ev, state, member) {
// redraw the badge on the membership list // redraw the badge on the membership list
if (this.state.phase == this.Phase.RoomMemberList && member.roomId === this.props.roomId) { if (this.state.phase === this.Phase.RoomMemberList && member.roomId === this.props.roomId) {
this._delayedUpdate(); this._delayedUpdate();
} } else if (this.state.phase === this.Phase.RoomMemberInfo && member.roomId === this.props.roomId &&
else if (this.state.phase === this.Phase.RoomMemberInfo && member.roomId === this.props.roomId &&
member.userId === this.state.member.userId) { member.userId === this.state.member.userId) {
// refresh the member info (e.g. new power level) // refresh the member info (e.g. new power level)
this._delayedUpdate(); this._delayedUpdate();
} }
}, },
_delayedUpdate: new rate_limited_func(function() { _delayedUpdate: new RateLimitedFunc(function() {
this.forceUpdate(); this.forceUpdate(); // eslint-disable-line babel/no-invalid-this
}, 500), }, 500),
onAction: function(payload) { onAction: function(payload) {
@ -257,22 +265,23 @@ module.exports = React.createClass({
let inviteGroup; let inviteGroup;
let membersBadge; let membersBadge;
if ((this.state.phase == this.Phase.RoomMemberList || this.state.phase === this.Phase.RoomMemberInfo) let membersTitle = _t('Members');
if ((this.state.phase === this.Phase.RoomMemberList || this.state.phase === this.Phase.RoomMemberInfo)
&& this.props.roomId && this.props.roomId
) { ) {
const cli = this.context.matrixClient; const cli = this.context.matrixClient;
const room = cli.getRoom(this.props.roomId); const room = cli.getRoom(this.props.roomId);
let userIsInRoom; let isUserInRoom;
if (room) { if (room) {
membersBadge = room.getJoinedMembers().length; const numMembers = room.getJoinedMembers().length;
userIsInRoom = room.hasMembershipState( membersTitle = _t('%(count)s Members', { count: numMembers });
this.context.matrixClient.credentials.userId, 'join', membersBadge = <div title={membersTitle}>{ formatCount(numMembers) }</div>;
); isUserInRoom = room.hasMembershipState(this.context.matrixClient.credentials.userId, 'join');
} }
if (userIsInRoom) { if (isUserInRoom) {
inviteGroup = inviteGroup =
<AccessibleButton className="mx_RightPanel_invite" onClick={ this.onInviteButtonClick } > <AccessibleButton className="mx_RightPanel_invite" onClick={this.onInviteButtonClick}>
<div className="mx_RightPanel_icon" > <div className="mx_RightPanel_icon" >
<TintableSvg src="img/icon-invite-people.svg" width="35" height="35" /> <TintableSvg src="img/icon-invite-people.svg" width="35" height="35" />
</div> </div>
@ -283,13 +292,13 @@ module.exports = React.createClass({
const isPhaseGroup = [ const isPhaseGroup = [
this.Phase.GroupMemberInfo, this.Phase.GroupMemberInfo,
this.Phase.GroupMemberList this.Phase.GroupMemberList,
].includes(this.state.phase); ].includes(this.state.phase);
let headerButtons = []; let headerButtons = [];
if (this.props.roomId) { if (this.props.roomId) {
headerButtons = [ headerButtons = [
<HeaderButton key="_membersButton" title={_t('Members')} iconSrc="img/icons-people.svg" <HeaderButton key="_membersButton" title={membersTitle} iconSrc="img/icons-people.svg"
isHighlighted={[this.Phase.RoomMemberList, this.Phase.RoomMemberInfo].includes(this.state.phase)} isHighlighted={[this.Phase.RoomMemberList, this.Phase.RoomMemberInfo].includes(this.state.phase)}
clickPhase={this.Phase.RoomMemberList} clickPhase={this.Phase.RoomMemberList}
badge={membersBadge} badge={membersBadge}
@ -327,54 +336,54 @@ module.exports = React.createClass({
// button on these 2 screens or you won't be able to re-expand the panel. // button on these 2 screens or you won't be able to re-expand the panel.
headerButtons.push( headerButtons.push(
<div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" key="_minimizeButton" <div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" key="_minimizeButton"
title={ _t("Hide panel") } onClick={ this.onCollapseClick } title={_t("Hide panel")} aria-label={_t("Hide panel")} onClick={this.onCollapseClick}
> >
<TintableSvg src="img/minimise.svg" width="10" height="16"/> <TintableSvg src="img/minimise.svg" width="10" height="16" />
</div>, </div>,
); );
} }
let panel = <div />; let panel = <div />;
if (!this.props.collapsed) { if (!this.props.collapsed) {
if (this.props.roomId && this.state.phase == this.Phase.RoomMemberList) { if (this.props.roomId && this.state.phase === this.Phase.RoomMemberList) {
panel = <MemberList roomId={this.props.roomId} key={this.props.roomId} />; panel = <MemberList roomId={this.props.roomId} key={this.props.roomId} />;
} else if (this.props.groupId && this.state.phase == this.Phase.GroupMemberList) { } else if (this.props.groupId && this.state.phase === this.Phase.GroupMemberList) {
panel = <GroupMemberList groupId={this.props.groupId} key={this.props.groupId} />; panel = <GroupMemberList groupId={this.props.groupId} key={this.props.groupId} />;
} else if (this.state.phase === this.Phase.GroupRoomList) { } else if (this.state.phase === this.Phase.GroupRoomList) {
panel = <GroupRoomList groupId={this.props.groupId} key={this.props.groupId} />; panel = <GroupRoomList groupId={this.props.groupId} key={this.props.groupId} />;
} else if (this.state.phase == this.Phase.RoomMemberInfo) { } else if (this.state.phase === this.Phase.RoomMemberInfo) {
panel = <MemberInfo member={this.state.member} key={this.props.roomId || this.state.member.userId} />; panel = <MemberInfo member={this.state.member} key={this.props.roomId || this.state.member.userId} />;
} else if (this.state.phase == this.Phase.GroupMemberInfo) { } else if (this.state.phase === this.Phase.GroupMemberInfo) {
panel = <GroupMemberInfo panel = <GroupMemberInfo
groupMember={this.state.member} groupMember={this.state.member}
groupId={this.props.groupId} groupId={this.props.groupId}
key={this.state.member.user_id} />; key={this.state.member.user_id} />;
} else if (this.state.phase == this.Phase.GroupRoomInfo) { } else if (this.state.phase === this.Phase.GroupRoomInfo) {
panel = <GroupRoomInfo panel = <GroupRoomInfo
groupRoomId={this.state.groupRoomId} groupRoomId={this.state.groupRoomId}
groupId={this.props.groupId} groupId={this.props.groupId}
key={this.state.groupRoomId} />; key={this.state.groupRoomId} />;
} else if (this.state.phase == this.Phase.NotificationPanel) { } else if (this.state.phase === this.Phase.NotificationPanel) {
panel = <NotificationPanel />; panel = <NotificationPanel />;
} else if (this.state.phase == this.Phase.FilePanel) { } else if (this.state.phase === this.Phase.FilePanel) {
panel = <FilePanel roomId={this.props.roomId} />; panel = <FilePanel roomId={this.props.roomId} />;
} }
} }
if (!panel) { if (!panel) {
panel = <div className="mx_RightPanel_blank"></div>; panel = <div className="mx_RightPanel_blank" />;
} }
if (this.props.groupId && this.state.isUserPrivilegedInGroup) { if (this.props.groupId && this.state.isUserPrivilegedInGroup) {
inviteGroup = isPhaseGroup ? ( inviteGroup = isPhaseGroup ? (
<AccessibleButton className="mx_RightPanel_invite" onClick={ this.onInviteButtonClick } > <AccessibleButton className="mx_RightPanel_invite" onClick={this.onInviteButtonClick}>
<div className="mx_RightPanel_icon" > <div className="mx_RightPanel_icon" >
<TintableSvg src="img/icon-invite-people.svg" width="35" height="35" /> <TintableSvg src="img/icon-invite-people.svg" width="35" height="35" />
</div> </div>
<div className="mx_RightPanel_message">{ _t('Invite to this community') }</div> <div className="mx_RightPanel_message">{ _t('Invite to this community') }</div>
</AccessibleButton> </AccessibleButton>
) : ( ) : (
<AccessibleButton className="mx_RightPanel_invite" onClick={ this.onInviteButtonClick } > <AccessibleButton className="mx_RightPanel_invite" onClick={this.onInviteButtonClick}>
<div className="mx_RightPanel_icon" > <div className="mx_RightPanel_icon" >
<TintableSvg src="img/icons-room-add.svg" width="35" height="35" /> <TintableSvg src="img/icons-room-add.svg" width="35" height="35" />
</div> </div>
@ -383,19 +392,16 @@ module.exports = React.createClass({
); );
} }
let classes = classNames( const classes = classNames("mx_RightPanel", "mx_fadable", {
"mx_RightPanel", "mx_fadable", "collapsed": this.props.collapsed,
{ "mx_fadable_faded": this.props.disabled,
"collapsed": this.props.collapsed, });
"mx_fadable_faded": this.props.disabled,
}
);
return ( return (
<aside className={classes}> <aside className={classes}>
<div className="mx_RightPanel_header"> <div className="mx_RightPanel_header">
<div className="mx_RightPanel_headerButtonGroup"> <div className="mx_RightPanel_headerButtonGroup">
{headerButtons} { headerButtons }
</div> </div>
</div> </div>
{ panel } { panel }

View File

@ -20,8 +20,8 @@ limitations under the License.
var React = require('react'); var React = require('react');
var ReactDOM = require('react-dom'); var ReactDOM = require('react-dom');
var classNames = require('classnames'); var classNames = require('classnames');
var DropTarget = require('react-dnd').DropTarget;
var sdk = require('matrix-react-sdk'); var sdk = require('matrix-react-sdk');
import { Droppable } from 'react-beautiful-dnd';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
var dis = require('matrix-react-sdk/lib/dispatcher'); var dis = require('matrix-react-sdk/lib/dispatcher');
var Unread = require('matrix-react-sdk/lib/Unread'); var Unread = require('matrix-react-sdk/lib/Unread');
@ -30,38 +30,14 @@ var RoomNotifs = require('matrix-react-sdk/lib/RoomNotifs');
var FormattingUtils = require('matrix-react-sdk/lib/utils/FormattingUtils'); var FormattingUtils = require('matrix-react-sdk/lib/utils/FormattingUtils');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton'); var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
import Modal from 'matrix-react-sdk/lib/Modal'; import Modal from 'matrix-react-sdk/lib/Modal';
import KeyCode from 'matrix-react-sdk/lib/KeyCode'; import { KeyCode } from 'matrix-react-sdk/lib/Keyboard';
// turn this on for drop & drag console debugging galore // turn this on for drop & drag console debugging galore
var debug = false; var debug = false;
const TRUNCATE_AT = 10; const TRUNCATE_AT = 10;
var roomListTarget = {
canDrop: function() {
return true;
},
drop: function(props, monitor, component) {
if (debug) console.log("dropped on sublist")
},
hover: function(props, monitor, component) {
var item = monitor.getItem();
if (component.state.sortedList.length == 0 && props.editable) {
if (debug) console.log("hovering on sublist " + props.label + ", isOver=" + monitor.isOver());
if (item.targetList !== component) {
item.targetList.removeRoomTile(item.room);
item.targetList = component;
}
component.moveRoomTile(item.room, 0);
}
},
};
var RoomSubList = React.createClass({ var RoomSubList = React.createClass({
displayName: 'RoomSubList', displayName: 'RoomSubList',
@ -109,13 +85,17 @@ var RoomSubList = React.createClass({
}, },
componentWillMount: function() { componentWillMount: function() {
this.sortList(this.applySearchFilter(this.props.list, this.props.searchFilter), this.props.order); this.setState({
sortedList: this.applySearchFilter(this.props.list, this.props.searchFilter),
});
}, },
componentWillReceiveProps: function(newProps) { componentWillReceiveProps: function(newProps) {
// order the room list appropriately before we re-render // order the room list appropriately before we re-render
//if (debug) console.log("received new props, list = " + newProps.list); //if (debug) console.log("received new props, list = " + newProps.list);
this.sortList(this.applySearchFilter(newProps.list, newProps.searchFilter), newProps.order); this.setState({
sortedList: this.applySearchFilter(newProps.list, newProps.searchFilter),
});
}, },
applySearchFilter: function(list, filter) { applySearchFilter: function(list, filter) {
@ -163,71 +143,6 @@ var RoomSubList = React.createClass({
}); });
}, },
tsOfNewestEvent: function(room) {
for (var i = room.timeline.length - 1; i >= 0; --i) {
var ev = room.timeline[i];
if (ev.getTs() &&
(Unread.eventTriggersUnreadCount(ev) ||
(ev.getSender() === MatrixClientPeg.get().credentials.userId))
) {
return ev.getTs();
}
}
// we might only have events that don't trigger the unread indicator,
// in which case use the oldest event even if normally it wouldn't count.
// This is better than just assuming the last event was forever ago.
if (room.timeline.length && room.timeline[0].getTs()) {
return room.timeline[0].getTs();
} else {
return Number.MAX_SAFE_INTEGER;
}
},
// TODO: factor the comparators back out into a generic comparator
// so that view_prev_room and view_next_room can do the right thing
recentsComparator: function(roomA, roomB) {
return this.tsOfNewestEvent(roomB) - this.tsOfNewestEvent(roomA);
},
lexicographicalComparator: function(roomA, roomB) {
return roomA.name > roomB.name ? 1 : -1;
},
// Generates the manual comparator using the given list
manualComparator: function(roomA, roomB) {
if (!roomA.tags[this.props.tagName] || !roomB.tags[this.props.tagName]) return 0;
// Make sure the room tag has an order element, if not set it to be the bottom
var a = roomA.tags[this.props.tagName].order;
var b = roomB.tags[this.props.tagName].order;
// Order undefined room tag orders to the bottom
if (a === undefined && b !== undefined) {
return 1;
} else if (a !== undefined && b === undefined) {
return -1;
}
return a == b ? this.lexicographicalComparator(roomA, roomB) : ( a > b ? 1 : -1);
},
sortList: function(list, order) {
if (list === undefined) list = this.state.sortedList;
if (order === undefined) order = this.props.order;
var comparator;
list = list || [];
if (order === "manual") comparator = this.manualComparator;
if (order === "recent") comparator = this.recentsComparator;
// Fix undefined orders here, and make sure the backend gets updated as well
this._fixUndefinedOrder(list);
//if (debug) console.log("sorting list for sublist " + this.props.label + " with length " + list.length + ", this.props.list = " + this.props.list);
this.setState({ sortedList: list.sort(comparator) });
},
_shouldShowNotifBadge: function(roomNotifState) { _shouldShowNotifBadge: function(roomNotifState) {
const showBadgeInStates = [RoomNotifs.ALL_MESSAGES, RoomNotifs.ALL_MESSAGES_LOUD]; const showBadgeInStates = [RoomNotifs.ALL_MESSAGES, RoomNotifs.ALL_MESSAGES_LOUD];
return showBadgeInStates.indexOf(roomNotifState) > -1; return showBadgeInStates.indexOf(roomNotifState) > -1;
@ -278,106 +193,17 @@ var RoomSubList = React.createClass({
this.setState(this.state); this.setState(this.state);
}, },
moveRoomTile: function(room, atIndex) {
if (debug) console.log("moveRoomTile: id " + room.roomId + ", atIndex " + atIndex);
//console.log("moveRoomTile before: " + JSON.stringify(this.state.rooms));
var found = this.findRoomTile(room);
var rooms = this.state.sortedList;
if (found.room) {
if (debug) console.log("removing at index " + found.index + " and adding at index " + atIndex);
rooms.splice(found.index, 1);
rooms.splice(atIndex, 0, found.room);
}
else {
if (debug) console.log("Adding at index " + atIndex);
rooms.splice(atIndex, 0, room);
}
this.setState({ sortedList: rooms });
// console.log("moveRoomTile after: " + JSON.stringify(this.state.rooms));
},
// XXX: this isn't invoked via a property method but indirectly via
// the roomList property method. Unsure how evil this is.
removeRoomTile: function(room) {
if (debug) console.log("remove room " + room.roomId);
var found = this.findRoomTile(room);
var rooms = this.state.sortedList;
if (found.room) {
rooms.splice(found.index, 1);
}
else {
console.warn("Can't remove room " + room.roomId + " - can't find it");
}
this.setState({ sortedList: rooms });
},
findRoomTile: function(room) {
var index = this.state.sortedList.indexOf(room);
if (index >= 0) {
// console.log("found: room: " + room.roomId + " with index " + index);
}
else {
if (debug) console.log("didn't find room");
room = null;
}
return ({
room: room,
index: index,
});
},
calcManualOrderTagData: function(room) {
var index = this.state.sortedList.indexOf(room);
// we sort rooms by the lexicographic ordering of the 'order' metadata on their tags.
// for convenience, we calculate this for now a floating point number between 0.0 and 1.0.
var orderA = 0.0; // by default we're next to the beginning of the list
if (index > 0) {
var prevTag = this.state.sortedList[index - 1].tags[this.props.tagName];
if (!prevTag) {
console.error("Previous room in sublist is not tagged to be in this list. This should never happen.")
}
else if (prevTag.order === undefined) {
console.error("Previous room in sublist has no ordering metadata. This should never happen.");
}
else {
orderA = prevTag.order;
}
}
var orderB = 1.0; // by default we're next to the end of the list too
if (index < this.state.sortedList.length - 1) {
var nextTag = this.state.sortedList[index + 1].tags[this.props.tagName];
if (!nextTag) {
console.error("Next room in sublist is not tagged to be in this list. This should never happen.")
}
else if (nextTag.order === undefined) {
console.error("Next room in sublist has no ordering metadata. This should never happen.");
}
else {
orderB = nextTag.order;
}
}
var order = (orderA + orderB) / 2.0;
if (order === orderA || order === orderB) {
console.error("Cannot describe new list position. This should be incredibly unlikely.");
// TODO: renumber the list
}
return order;
},
makeRoomTiles: function() { makeRoomTiles: function() {
var self = this; var self = this;
var DNDRoomTile = sdk.getComponent("rooms.DNDRoomTile"); var DNDRoomTile = sdk.getComponent("rooms.DNDRoomTile");
return this.state.sortedList.map(function(room) { return this.state.sortedList.map(function(room, index) {
// XXX: is it evil to pass in self as a prop to RoomTile? // XXX: is it evil to pass in self as a prop to RoomTile?
return ( return (
<DNDRoomTile <DNDRoomTile
index={index} // For DND
room={ room } room={ room }
roomSubList={ self } roomSubList={ self }
tagName={self.props.tagName}
key={ room.roomId } key={ room.roomId }
collapsed={ self.props.collapsed || false} collapsed={ self.props.collapsed || false}
unread={ Unread.doesRoomHaveUnreadMessages(room) } unread={ Unread.doesRoomHaveUnreadMessages(room) }
@ -493,47 +319,6 @@ var RoomSubList = React.createClass({
this.props.onHeaderClick(false); this.props.onHeaderClick(false);
}, },
// Fix any undefined order elements of a room in a manual ordered list
// room.tag[tagname].order
_fixUndefinedOrder: function(list) {
if (this.props.order === "manual") {
var order = 0.0;
var self = this;
// Find the highest (lowest position) order of a room in a manual ordered list
list.forEach(function(room) {
if (room.tags.hasOwnProperty(self.props.tagName)) {
if (order < room.tags[self.props.tagName].order) {
order = room.tags[self.props.tagName].order;
}
}
});
// Fix any undefined order elements of a room in a manual ordered list
// Do this one at a time, as each time a rooms tag data is updated the RoomList
// gets triggered and another list is passed in. Doing it one at a time means that
// we always correctly calculate the highest order for the list - stops multiple
// rooms getting the same order. This is only really relevant for the first time this
// is run with historical room tag data, after that there should only be undefined
// in the list at a time anyway.
for (let i = 0; i < list.length; i++) {
if (list[i].tags[self.props.tagName] && list[i].tags[self.props.tagName].order === undefined) {
MatrixClientPeg.get().setRoomTag(list[i].roomId, self.props.tagName, {order: (order + 1.0) / 2.0}).finally(function() {
// Do any final stuff here
}).catch(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + self.props.tagName + " to room" + err);
Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, {
title: _t('Failed to add tag %(tagName)s to room', {tagName: self.props.tagName}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
break;
};
};
}
},
render: function() { render: function() {
var connectDropTarget = this.props.connectDropTarget; var connectDropTarget = this.props.connectDropTarget;
var TruncatedList = sdk.getComponent('elements.TruncatedList'); var TruncatedList = sdk.getComponent('elements.TruncatedList');
@ -563,12 +348,22 @@ var RoomSubList = React.createClass({
</TruncatedList>; </TruncatedList>;
} }
return connectDropTarget( const subListContent = <div>
<div> { this._getHeaderJsx() }
{ this._getHeaderJsx() } { subList }
{ subList } </div>;
</div>
); return this.props.editable ?
<Droppable
droppableId={"room-sub-list-droppable_" + this.props.tagName}
type="draggable-RoomTile"
>
{ (provided, snapshot) => (
<div ref={provided.innerRef}>
{ subListContent }
</div>
) }
</Droppable> : subListContent;
} }
else { else {
var Loader = sdk.getComponent("elements.Spinner"); var Loader = sdk.getComponent("elements.Spinner");
@ -582,11 +377,4 @@ var RoomSubList = React.createClass({
} }
}); });
// Export the wrapped version, inlining the 'collect' functions module.exports = RoomSubList;
// to more closely resemble the ES7
module.exports =
DropTarget('RoomTile', roomListTarget, function(connect) {
return {
connectDropTarget: connect.dropTarget(),
}
})(RoomSubList);

View File

@ -18,7 +18,7 @@ limitations under the License.
import React from 'react'; import React from 'react';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import KeyCode from 'matrix-react-sdk/lib/KeyCode'; import { KeyCode } from 'matrix-react-sdk/lib/Keyboard';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc'; import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc';

View File

@ -16,14 +16,17 @@ limitations under the License.
'use strict'; 'use strict';
var React = require('react'); import React from 'react';
import PropTypes from 'prop-types';
import SyntaxHighlight from '../views/elements/SyntaxHighlight';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'ViewSource', displayName: 'ViewSource',
propTypes: { propTypes: {
content: React.PropTypes.object.isRequired, content: PropTypes.object.isRequired,
onFinished: React.PropTypes.func.isRequired, onFinished: PropTypes.func.isRequired,
}, },
componentDidMount: function() { componentDidMount: function() {
@ -45,9 +48,9 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_ViewSource"> <div className="mx_ViewSource">
<pre> <SyntaxHighlight className="json">
{JSON.stringify(this.props.content, null, 2)} { JSON.stringify(this.props.content, null, 2) }
</pre> </SyntaxHighlight>
</div> </div>
); );
} }

View File

@ -17,15 +17,16 @@ limitations under the License.
'use strict'; 'use strict';
const React = require('react'); import React from 'react';
const MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
const dis = require('matrix-react-sdk/lib/dispatcher'); import dis from 'matrix-react-sdk/lib/dispatcher';
const sdk = require('matrix-react-sdk'); import sdk from 'matrix-react-sdk';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
const Modal = require('matrix-react-sdk/lib/Modal'); import Modal from 'matrix-react-sdk/lib/Modal';
const Resend = require("matrix-react-sdk/lib/Resend"); import Resend from "matrix-react-sdk/lib/Resend";
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore'; import SettingsStore from "matrix-react-sdk/lib/settings/SettingsStore";
import {makeEventPermalink} from 'matrix-react-sdk/lib/matrix-to';
import { isUrlPermitted } from 'matrix-react-sdk/lib/HtmlUtils'; import { isUrlPermitted } from 'matrix-react-sdk/lib/HtmlUtils';
module.exports = React.createClass({ module.exports = React.createClass({
@ -69,7 +70,7 @@ module.exports = React.createClass({
let canPin = room.currentState.mayClientSendStateEvent('m.room.pinned_events', cli); let canPin = room.currentState.mayClientSendStateEvent('m.room.pinned_events', cli);
// HACK: Intentionally say we can't pin if the user doesn't want to use the functionality // HACK: Intentionally say we can't pin if the user doesn't want to use the functionality
if (!UserSettingsStore.isFeatureEnabled("feature_pinning")) canPin = false; if (!SettingsStore.isFeatureEnabled("feature_pinning")) canPin = false;
this.setState({canRedact, canPin}); this.setState({canRedact, canPin});
}, },
@ -109,15 +110,14 @@ module.exports = React.createClass({
onFinished: (proceed) => { onFinished: (proceed) => {
if (!proceed) return; if (!proceed) return;
MatrixClientPeg.get().redactEvent( const cli = MatrixClientPeg.get();
this.props.mxEvent.getRoomId(), this.props.mxEvent.getId() cli.redactEvent(this.props.mxEvent.getRoomId(), this.props.mxEvent.getId()).catch(function(e) {
).catch(function(e) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
// display error message stating you couldn't delete this. // display error message stating you couldn't delete this.
const code = e.errcode || e.statusCode; const code = e.errcode || e.statusCode;
Modal.createTrackedDialog('You cannot delete this message', '', ErrorDialog, { Modal.createTrackedDialog('You cannot delete this message', '', ErrorDialog, {
title: _t('Error'), title: _t('Error'),
description: _t('You cannot delete this message. (%(code)s)', {code: code}) description: _t('You cannot delete this message. (%(code)s)', {code}),
}); });
}).done(); }).done();
}, },
@ -140,12 +140,12 @@ module.exports = React.createClass({
onPinClick: function() { onPinClick: function() {
MatrixClientPeg.get().getStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', '') MatrixClientPeg.get().getStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', '')
.catch(e => { .catch((e) => {
// Intercept the Event Not Found error and fall through the promise chain with no event. // Intercept the Event Not Found error and fall through the promise chain with no event.
if (e.errcode === "M_NOT_FOUND") return null; if (e.errcode === "M_NOT_FOUND") return null;
throw e; throw e;
}) })
.then(event => { .then((event) => {
const eventIds = (event ? event.pinned : []) || []; const eventIds = (event ? event.pinned : []) || [];
if (!eventIds.includes(this.props.mxEvent.getId())) { if (!eventIds.includes(this.props.mxEvent.getId())) {
// Not pinned - add // Not pinned - add
@ -155,7 +155,8 @@ module.exports = React.createClass({
eventIds.splice(eventIds.indexOf(this.props.mxEvent.getId()), 1); eventIds.splice(eventIds.indexOf(this.props.mxEvent.getId()), 1);
} }
MatrixClientPeg.get().sendStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', {pinned: eventIds}, ''); const cli = MatrixClientPeg.get();
cli.sendStateEvent(this.props.mxEvent.getRoomId(), 'm.room.pinned_events', {pinned: eventIds}, '');
}); });
this.closeMenu(); this.closeMenu();
}, },
@ -179,6 +180,14 @@ module.exports = React.createClass({
this.closeMenu(); this.closeMenu();
}, },
onReplyClick: function() {
dis.dispatch({
action: 'quote_event',
event: this.props.mxEvent,
});
this.closeMenu();
},
render: function() { render: function() {
const eventStatus = this.props.mxEvent.status; const eventStatus = this.props.mxEvent.status;
let resendButton; let resendButton;
@ -186,12 +195,11 @@ module.exports = React.createClass({
let cancelButton; let cancelButton;
let forwardButton; let forwardButton;
let pinButton; let pinButton;
let viewSourceButton;
let viewClearSourceButton; let viewClearSourceButton;
let unhidePreviewButton; let unhidePreviewButton;
let permalinkButton;
let externalURLButton; let externalURLButton;
let quoteButton; let quoteButton;
let replyButton;
if (eventStatus === 'not_sent') { if (eventStatus === 'not_sent') {
resendButton = ( resendButton = (
@ -226,17 +234,25 @@ module.exports = React.createClass({
</div> </div>
); );
if (SettingsStore.isFeatureEnabled("feature_rich_quoting")) {
replyButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onReplyClick}>
{ _t('Reply') }
</div>
);
}
if (this.state.canPin) { if (this.state.canPin) {
pinButton = ( pinButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onPinClick}> <div className="mx_MessageContextMenu_field" onClick={this.onPinClick}>
{this._isPinned() ? _t('Unpin Message') : _t('Pin Message')} { this._isPinned() ? _t('Unpin Message') : _t('Pin Message') }
</div> </div>
); );
} }
} }
} }
viewSourceButton = ( const viewSourceButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onViewSourceClick}> <div className="mx_MessageContextMenu_field" onClick={this.onViewSourceClick}>
{ _t('View Source') } { _t('View Source') }
</div> </div>
@ -261,10 +277,10 @@ module.exports = React.createClass({
} }
// XXX: if we use room ID, we should also include a server where the event can be found (other than in the domain of the event ID) // XXX: if we use room ID, we should also include a server where the event can be found (other than in the domain of the event ID)
permalinkButton = ( const permalinkButton = (
<div className="mx_MessageContextMenu_field"> <div className="mx_MessageContextMenu_field">
<a href={ "https://matrix.to/#/" + this.props.mxEvent.getRoomId() +"/"+ this.props.mxEvent.getId() } <a href={makeEventPermalink(this.props.mxEvent.getRoomId(), this.props.mxEvent.getId())}
target="_blank" rel="noopener" onClick={ this.closeMenu }>{ _t('Permalink') }</a> target="_blank" rel="noopener" onClick={this.closeMenu}>{ _t('Permalink') }</a>
</div> </div>
); );
@ -277,32 +293,33 @@ module.exports = React.createClass({
} }
// Bridges can provide a 'external_url' to link back to the source. // Bridges can provide a 'external_url' to link back to the source.
if( if (
typeof(this.props.mxEvent.event.content.external_url) === "string" && typeof(this.props.mxEvent.event.content.external_url) === "string" &&
isUrlPermitted(this.props.mxEvent.event.content.external_url) isUrlPermitted(this.props.mxEvent.event.content.external_url)
) { ) {
externalURLButton = ( externalURLButton = (
<div className="mx_MessageContextMenu_field"> <div className="mx_MessageContextMenu_field">
<a href={ this.props.mxEvent.event.content.external_url } <a href={this.props.mxEvent.event.content.external_url}
rel="noopener" target="_blank" onClick={ this.closeMenu }>{ _t('Source URL') }</a> rel="noopener" target="_blank" onClick={this.closeMenu}>{ _t('Source URL') }</a>
</div> </div>
); );
} }
return ( return (
<div> <div>
{resendButton} { resendButton }
{redactButton} { redactButton }
{cancelButton} { cancelButton }
{forwardButton} { forwardButton }
{pinButton} { pinButton }
{viewSourceButton} { viewSourceButton }
{viewClearSourceButton} { viewClearSourceButton }
{unhidePreviewButton} { unhidePreviewButton }
{permalinkButton} { permalinkButton }
{quoteButton} { quoteButton }
{externalURLButton} { replyButton }
{ externalURLButton }
</div> </div>
); );
}, },

View File

@ -0,0 +1,101 @@
/*
Copyright 2017 Travis Ralston
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.
*/
import React from 'react';
import { _t, _td } from 'matrix-react-sdk/lib/languageHandler';
import sdk from 'matrix-react-sdk';
const STATUS_LABELS = {
"online": _td("Online"),
"unavailable": _td("Away"),
"offline": _td("Appear Offline"),
};
const PresenceContextMenuOption = React.createClass({
displayName: 'PresenceContextMenuOption',
propTypes: {
forStatus: React.PropTypes.string.isRequired,
isCurrent: React.PropTypes.bool,
onChange: React.PropTypes.func.isRequired,
},
onClick: function() {
if (this.isCurrent) return;
this.props.onChange(this.props.forStatus);
},
render: function() {
const AccessibleButton = sdk.getComponent("elements.AccessibleButton");
const indicatorClasses = "mx_PresenceContextMenuOption_indicator "
+ "mx_PresenceContextMenuOption_indicator_" + this.props.forStatus;
let classNames = "mx_PresenceContextMenuOption";
if (this.props.isCurrent) classNames += " mx_PresenceContextMenuOption_current";
return (
<AccessibleButton className={classNames} element="div" onClick={this.onClick}>
<div className={indicatorClasses}></div>
{ _t(STATUS_LABELS[this.props.forStatus]) }
</AccessibleButton>
);
},
});
module.exports = React.createClass({
displayName: 'PresenceContextMenu',
propTypes: {
// "online", "unavailable", or "offline"
currentStatus: React.PropTypes.string.isRequired,
// Called when the user wants to change their status.
// Args: (newStatus:string)
onChange: React.PropTypes.func.isRequired,
// callback called when the menu is dismissed
onFinished: React.PropTypes.func,
},
getInitialState() {
return {
currentStatus: this.props.currentStatus,
};
},
onChange: function(newStatus) {
this.props.onChange(newStatus);
this.setState({currentStatus: newStatus});
},
render: function() {
const statusElements = [];
for (let status of Object.keys(STATUS_LABELS)) {
statusElements.push((
<PresenceContextMenuOption forStatus={status} key={status}
onChange={this.onChange}
isCurrent={status === this.state.currentStatus} />
));
}
return (
<div>
{ statusElements }
</div>
);
},
});

View File

@ -20,6 +20,7 @@ limitations under the License.
import Promise from 'bluebird'; import Promise from 'bluebird';
import React from 'react'; import React from 'react';
import classNames from 'classnames'; import classNames from 'classnames';
import PropTypes from 'prop-types';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import { _t, _td } from 'matrix-react-sdk/lib/languageHandler'; import { _t, _td } from 'matrix-react-sdk/lib/languageHandler';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg'; import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
@ -28,14 +29,15 @@ import DMRoomMap from 'matrix-react-sdk/lib/utils/DMRoomMap';
import * as Rooms from 'matrix-react-sdk/lib/Rooms'; import * as Rooms from 'matrix-react-sdk/lib/Rooms';
import * as RoomNotifs from 'matrix-react-sdk/lib/RoomNotifs'; import * as RoomNotifs from 'matrix-react-sdk/lib/RoomNotifs';
import Modal from 'matrix-react-sdk/lib/Modal'; import Modal from 'matrix-react-sdk/lib/Modal';
import RoomListActions from 'matrix-react-sdk/lib/actions/RoomListActions';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'RoomTileContextMenu', displayName: 'RoomTileContextMenu',
propTypes: { propTypes: {
room: React.PropTypes.object.isRequired, room: PropTypes.object.isRequired,
/* callback called when the menu is dismissed */ /* callback called when the menu is dismissed */
onFinished: React.PropTypes.func, onFinished: PropTypes.func,
}, },
getInitialState() { getInitialState() {
@ -45,7 +47,7 @@ module.exports = React.createClass({
isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"), isFavourite: this.props.room.tags.hasOwnProperty("m.favourite"),
isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"), isLowPriority: this.props.room.tags.hasOwnProperty("m.lowpriority"),
isDirectMessage: Boolean(dmRoomMap.getUserIdForRoomId(this.props.room.roomId)), isDirectMessage: Boolean(dmRoomMap.getUserIdForRoomId(this.props.room.roomId)),
} };
}, },
componentWillMount: function() { componentWillMount: function() {
@ -57,42 +59,16 @@ module.exports = React.createClass({
}, },
_toggleTag: function(tagNameOn, tagNameOff) { _toggleTag: function(tagNameOn, tagNameOff) {
var self = this; if (!MatrixClientPeg.get().isGuest()) {
const roomId = this.props.room.roomId; Promise.delay(500).then(() => {
var cli = MatrixClientPeg.get(); dis.dispatch(RoomListActions.tagRoom(
if (!cli.isGuest()) { MatrixClientPeg.get(),
Promise.delay(500).then(function() { this.props.room,
if (tagNameOff !== null && tagNameOff !== undefined) { tagNameOff, tagNameOn,
cli.deleteRoomTag(roomId, tagNameOff).finally(function() { undefined, 0,
// Close the context menu ), true);
if (self.props.onFinished) {
self.props.onFinished();
};
}).catch(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove tag from room 1', '', ErrorDialog, {
title: _t('Failed to remove tag %(tagName)s from room', {tagName: tagNameOff}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
if (tagNameOn !== null && tagNameOn !== undefined) { this.props.onFinished();
// If the tag ordering meta data is required, it is added by
// the RoomSubList when it sorts its rooms
cli.setRoomTag(roomId, tagNameOn, {}).finally(function() {
// Close the context menu
if (self.props.onFinished) {
self.props.onFinished();
};
}).catch(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to remove tag from room 2', '', ErrorDialog, {
title: _t('Failed to remove tag %(tagName)s from room', {tagName: tagNameOn}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
}); });
} }
}, },
@ -132,22 +108,22 @@ module.exports = React.createClass({
}, },
_onClickDM: function() { _onClickDM: function() {
if (MatrixClientPeg.get().isGuest()) return;
const newIsDirectMessage = !this.state.isDirectMessage; const newIsDirectMessage = !this.state.isDirectMessage;
this.setState({ this.setState({
isDirectMessage: newIsDirectMessage, isDirectMessage: newIsDirectMessage,
}); });
if (MatrixClientPeg.get().isGuest()) return;
Rooms.guessAndSetDMRoom( Rooms.guessAndSetDMRoom(
this.props.room, newIsDirectMessage this.props.room, newIsDirectMessage,
).delay(500).finally(() => { ).delay(500).finally(() => {
// Close the context menu // Close the context menu
if (this.props.onFinished) { if (this.props.onFinished) {
this.props.onFinished(); this.props.onFinished();
}; }
}, (err) => { }, (err) => {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to set Direct Message status of room', '', ErrorDialog, { Modal.createTrackedDialog('Failed to set Direct Message status of room', '', ErrorDialog, {
title: _t('Failed to set Direct Message status of room'), title: _t('Failed to set Direct Message status of room'),
description: ((err && err.message) ? err.message : _t('Operation failed')), description: ((err && err.message) ? err.message : _t('Operation failed')),
@ -165,7 +141,7 @@ module.exports = React.createClass({
// Close the context menu // Close the context menu
if (this.props.onFinished) { if (this.props.onFinished) {
this.props.onFinished(); this.props.onFinished();
}; }
}, },
_onClickReject: function() { _onClickReject: function() {
@ -177,7 +153,7 @@ module.exports = React.createClass({
// Close the context menu // Close the context menu
if (this.props.onFinished) { if (this.props.onFinished) {
this.props.onFinished(); this.props.onFinished();
}; }
}, },
_onClickForget: function() { _onClickForget: function() {
@ -185,8 +161,8 @@ module.exports = React.createClass({
MatrixClientPeg.get().forget(this.props.room.roomId).done(function() { MatrixClientPeg.get().forget(this.props.room.roomId).done(function() {
dis.dispatch({ action: 'view_next_room' }); dis.dispatch({ action: 'view_next_room' });
}, function(err) { }, function(err) {
var errCode = err.errcode || _td("unknown error code"); const errCode = err.errcode || _td("unknown error code");
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, { Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, {
title: _t('Failed to forget room %(errCode)s', {errCode: errCode}), title: _t('Failed to forget room %(errCode)s', {errCode: errCode}),
description: ((err && err.message) ? err.message : _t('Operation failed')), description: ((err && err.message) ? err.message : _t('Operation failed')),
@ -196,20 +172,19 @@ module.exports = React.createClass({
// Close the context menu // Close the context menu
if (this.props.onFinished) { if (this.props.onFinished) {
this.props.onFinished(); this.props.onFinished();
}; }
}, },
_saveNotifState: function(newState) { _saveNotifState: function(newState) {
if (MatrixClientPeg.get().isGuest()) return;
const oldState = this.state.roomNotifState; const oldState = this.state.roomNotifState;
const roomId = this.props.room.roomId; const roomId = this.props.room.roomId;
var cli = MatrixClientPeg.get();
if (cli.isGuest()) return;
this.setState({ this.setState({
roomNotifState: newState, roomNotifState: newState,
}); });
RoomNotifs.setRoomNotifsState(this.props.room.roomId, newState).done(() => { RoomNotifs.setRoomNotifsState(roomId, newState).done(() => {
// delay slightly so that the user can see their state change // delay slightly so that the user can see their state change
// before closing the menu // before closing the menu
return Promise.delay(500).then(() => { return Promise.delay(500).then(() => {
@ -217,7 +192,7 @@ module.exports = React.createClass({
// Close the context menu // Close the context menu
if (this.props.onFinished) { if (this.props.onFinished) {
this.props.onFinished(); this.props.onFinished();
}; }
}); });
}, (error) => { }, (error) => {
// TODO: some form of error notification to the user // TODO: some form of error notification to the user
@ -247,22 +222,22 @@ module.exports = React.createClass({
}, },
_renderNotifMenu: function() { _renderNotifMenu: function() {
var alertMeClasses = classNames({ const alertMeClasses = classNames({
'mx_RoomTileContextMenu_notif_field': true, 'mx_RoomTileContextMenu_notif_field': true,
'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES_LOUD, 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES_LOUD,
}); });
var allNotifsClasses = classNames({ const allNotifsClasses = classNames({
'mx_RoomTileContextMenu_notif_field': true, 'mx_RoomTileContextMenu_notif_field': true,
'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES, 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.ALL_MESSAGES,
}); });
var mentionsClasses = classNames({ const mentionsClasses = classNames({
'mx_RoomTileContextMenu_notif_field': true, 'mx_RoomTileContextMenu_notif_field': true,
'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MENTIONS_ONLY, 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MENTIONS_ONLY,
}); });
var muteNotifsClasses = classNames({ const muteNotifsClasses = classNames({
'mx_RoomTileContextMenu_notif_field': true, 'mx_RoomTileContextMenu_notif_field': true,
'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MUTE, 'mx_RoomTileContextMenu_notif_fieldSet': this.state.roomNotifState == RoomNotifs.MUTE,
}); });
@ -272,22 +247,22 @@ module.exports = React.createClass({
<div className="mx_RoomTileContextMenu_notif_picker" > <div className="mx_RoomTileContextMenu_notif_picker" >
<img src="img/notif-slider.svg" width="20" height="107" /> <img src="img/notif-slider.svg" width="20" height="107" />
</div> </div>
<div className={ alertMeClasses } onClick={this._onClickAlertMe} > <div className={alertMeClasses} onClick={this._onClickAlertMe} >
<img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off-copy.svg" width="16" height="12" /> <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off-copy.svg" width="16" height="12" />
{ _t('All messages (loud)') } { _t('All messages (noisy)') }
</div> </div>
<div className={ allNotifsClasses } onClick={this._onClickAllNotifs} > <div className={allNotifsClasses} onClick={this._onClickAllNotifs} >
<img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off.svg" width="16" height="12" /> <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-off.svg" width="16" height="12" />
{ _t('All messages') } { _t('All messages') }
</div> </div>
<div className={ mentionsClasses } onClick={this._onClickMentions} > <div className={mentionsClasses} onClick={this._onClickMentions} >
<img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-mentions.svg" width="16" height="12" /> <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute-mentions.svg" width="16" height="12" />
{ _t('Mentions only') } { _t('Mentions only') }
</div> </div>
<div className={ muteNotifsClasses } onClick={this._onClickMute} > <div className={muteNotifsClasses} onClick={this._onClickMute} >
<img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" /> <img className="mx_RoomTileContextMenu_notif_activeIcon" src="img/notif-active.svg" width="12" height="12" />
<img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute.svg" width="16" height="12" /> <img className="mx_RoomTileContextMenu_notif_icon mx_filterFlipColor" src="img/icon-context-mute.svg" width="16" height="12" />
{ _t('Mute') } { _t('Mute') }
@ -322,7 +297,7 @@ module.exports = React.createClass({
return ( return (
<div> <div>
<div className="mx_RoomTileContextMenu_leave" onClick={ leaveClickHandler } > <div className="mx_RoomTileContextMenu_leave" onClick={leaveClickHandler} >
<img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_delete.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_delete.svg" width="15" height="15" />
{ leaveText } { leaveText }
</div> </div>
@ -351,17 +326,17 @@ module.exports = React.createClass({
return ( return (
<div> <div>
<div className={ favouriteClasses } onClick={this._onClickFavourite} > <div className={favouriteClasses} onClick={this._onClickFavourite} >
<img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_fave.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_fave.svg" width="15" height="15" />
<img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_fave_on.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_fave_on.svg" width="15" height="15" />
{ _t('Favourite') } { _t('Favourite') }
</div> </div>
<div className={ lowPriorityClasses } onClick={this._onClickLowPriority} > <div className={lowPriorityClasses} onClick={this._onClickLowPriority} >
<img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_low.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_low.svg" width="15" height="15" />
<img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_low_on.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_low_on.svg" width="15" height="15" />
{ _t('Low Priority') } { _t('Low Priority') }
</div> </div>
<div className={ dmClasses } onClick={this._onClickDM} > <div className={dmClasses} onClick={this._onClickDM} >
<img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_person.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon" src="img/icon_context_person.svg" width="15" height="15" />
<img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_person_on.svg" width="15" height="15" /> <img className="mx_RoomTileContextMenu_tag_icon_set" src="img/icon_context_person_on.svg" width="15" height="15" />
{ _t('Direct Chat') } { _t('Direct Chat') }
@ -372,7 +347,7 @@ module.exports = React.createClass({
render: function() { render: function() {
const myMember = this.props.room.getMember( const myMember = this.props.room.getMember(
MatrixClientPeg.get().credentials.userId MatrixClientPeg.get().credentials.userId,
); );
// Can't set notif level or tags on non-join rooms // Can't set notif level or tags on non-join rooms
@ -389,5 +364,5 @@ module.exports = React.createClass({
{ this._renderRoomTagMenu() } { this._renderRoomTagMenu() }
</div> </div>
); );
} },
}); });

View File

@ -0,0 +1,68 @@
/*
Copyright 2018 New Vector 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.
*/
import React from 'react';
import PropTypes from 'prop-types';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import dis from 'matrix-react-sdk/lib/dispatcher';
import TagOrderActions from 'matrix-react-sdk/lib/actions/TagOrderActions';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
export default class TagTileContextMenu extends React.Component {
static propTypes = {
tag: PropTypes.string.isRequired,
/* callback called when the menu is dismissed */
onFinished: PropTypes.func.isRequired,
};
constructor() {
super();
this._onViewCommunityClick = this._onViewCommunityClick.bind(this);
this._onRemoveClick = this._onRemoveClick.bind(this);
}
_onViewCommunityClick() {
dis.dispatch({
action: 'view_group',
group_id: this.props.tag,
});
this.props.onFinished();
}
_onRemoveClick() {
dis.dispatch(TagOrderActions.removeTag(
// XXX: Context menus don't have a MatrixClient context
MatrixClientPeg.get(),
this.props.tag,
));
this.props.onFinished();
}
render() {
return <div>
<div className="mx_TagTileContextMenu_item" onClick={this._onViewCommunityClick} >
<img className="mx_TagTileContextMenu_item_icon" src="img/icons-groups.svg" width="15" height="15" />
{ _t('View Community') }
</div>
<hr className="mx_TagTileContextMenu_separator" />
<div className="mx_TagTileContextMenu_item" onClick={this._onRemoveClick} >
<img className="mx_TagTileContextMenu_item_icon" src="img/icon_context_delete.svg" width="15" height="15" />
{ _t('Remove') }
</div>
</div>;
}
}

View File

@ -17,6 +17,7 @@ limitations under the License.
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import SyntaxHighlight from '../elements/SyntaxHighlight';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg'; import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
@ -60,7 +61,7 @@ class GenericEditor extends DevtoolsComponent {
<label htmlFor={id}>{ label }</label> <label htmlFor={id}>{ label }</label>
</div> </div>
<div className="mx_DevTools_inputCell"> <div className="mx_DevTools_inputCell">
<input id={id} onChange={this._onChange} value={this.state[id]} size="32" /> <input id={id} className="mx_TextInputDialog_input" onChange={this._onChange} value={this.state[id]} size="32" />
</div> </div>
</div>; </div>;
} }
@ -244,24 +245,22 @@ class SendAccountData extends GenericEditor {
class FilteredList extends React.Component { class FilteredList extends React.Component {
static propTypes = { static propTypes = {
children: PropTypes.any, children: PropTypes.any,
query: PropTypes.string,
onChange: PropTypes.func,
}; };
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.onQuery = this.onQuery.bind(this); this.onQuery = this.onQuery.bind(this);
this.state = {
query: '',
};
} }
onQuery(ev) { onQuery(ev) {
this.setState({ query: ev.target.value }); if (this.props.onChange) this.props.onChange(ev.target.value);
} }
filterChildren() { filterChildren() {
if (this.state.query) { if (this.props.query) {
const lowerQuery = this.state.query.toLowerCase(); const lowerQuery = this.props.query.toLowerCase();
return this.props.children.filter((child) => child.key.toLowerCase().includes(lowerQuery)); return this.props.children.filter((child) => child.key.toLowerCase().includes(lowerQuery));
} }
return this.props.children; return this.props.children;
@ -271,7 +270,7 @@ class FilteredList extends React.Component {
return <div> return <div>
<input size="64" <input size="64"
onChange={this.onQuery} onChange={this.onQuery}
value={this.state.query} value={this.props.query}
placeholder={_t('Filter results')} placeholder={_t('Filter results')}
className="mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" /> className="mx_TextInputDialog_input mx_DevTools_RoomStateExplorer_query" />
{ this.filterChildren() } { this.filterChildren() }
@ -295,11 +294,16 @@ class RoomStateExplorer extends DevtoolsComponent {
this.onBack = this.onBack.bind(this); this.onBack = this.onBack.bind(this);
this.editEv = this.editEv.bind(this); this.editEv = this.editEv.bind(this);
this.onQueryEventType = this.onQueryEventType.bind(this);
this.onQueryStateKey = this.onQueryStateKey.bind(this);
this.state = { this.state = {
eventType: null, eventType: null,
event: null, event: null,
editing: false, editing: false,
queryEventType: '',
queryStateKey: '',
}; };
} }
@ -331,6 +335,14 @@ class RoomStateExplorer extends DevtoolsComponent {
this.setState({ editing: true }); this.setState({ editing: true });
} }
onQueryEventType(filterEventType) {
this.setState({ queryEventType: filterEventType });
}
onQueryStateKey(filterStateKey) {
this.setState({ queryStateKey: filterStateKey });
}
render() { render() {
if (this.state.event) { if (this.state.event) {
if (this.state.editing) { if (this.state.editing) {
@ -343,7 +355,9 @@ class RoomStateExplorer extends DevtoolsComponent {
return <div className="mx_ViewSource"> return <div className="mx_ViewSource">
<div className="mx_Dialog_content"> <div className="mx_Dialog_content">
<pre>{ JSON.stringify(this.state.event.event, null, 2) }</pre> <SyntaxHighlight className="json">
{ JSON.stringify(this.state.event.event, null, 2) }
</SyntaxHighlight>
</div> </div>
<div className="mx_Dialog_buttons"> <div className="mx_Dialog_buttons">
<button onClick={this.onBack}>{ _t('Back') }</button> <button onClick={this.onBack}>{ _t('Back') }</button>
@ -352,41 +366,47 @@ class RoomStateExplorer extends DevtoolsComponent {
</div>; </div>;
} }
const rows = []; let list = null;
const classes = 'mx_DevTools_RoomStateExplorer_button'; const classes = 'mx_DevTools_RoomStateExplorer_button';
if (this.state.eventType === null) { if (this.state.eventType === null) {
Object.keys(this.roomStateEvents).forEach((evType) => { list = <FilteredList query={this.state.queryEventType} onChange={this.onQueryEventType}>
const stateGroup = this.roomStateEvents[evType]; {
const stateKeys = Object.keys(stateGroup); Object.keys(this.roomStateEvents).map((evType) => {
const stateGroup = this.roomStateEvents[evType];
const stateKeys = Object.keys(stateGroup);
let onClickFn; let onClickFn;
if (stateKeys.length > 1) { if (stateKeys.length > 1) {
onClickFn = this.browseEventType(evType); onClickFn = this.browseEventType(evType);
} else if (stateKeys.length === 1) { } else if (stateKeys.length === 1) {
onClickFn = this.onViewSourceClick(stateGroup[stateKeys[0]]); onClickFn = this.onViewSourceClick(stateGroup[stateKeys[0]]);
}
return <button className={classes} key={evType} onClick={onClickFn}>
{ evType }
</button>;
})
} }
</FilteredList>;
rows.push(<button className={classes} key={evType} onClick={onClickFn}>
{ evType }
</button>);
});
} else { } else {
const evType = this.state.eventType; const stateGroup = this.roomStateEvents[this.state.eventType];
const stateGroup = this.roomStateEvents[evType];
Object.keys(stateGroup).forEach((stateKey) => { list = <FilteredList query={this.state.queryStateKey} onChange={this.onQueryStateKey}>
const ev = stateGroup[stateKey]; {
rows.push(<button className={classes} key={stateKey} onClick={this.onViewSourceClick(ev)}> Object.keys(stateGroup).map((stateKey) => {
{ stateKey } const ev = stateGroup[stateKey];
</button>); return <button className={classes} key={stateKey} onClick={this.onViewSourceClick(ev)}>
}); { stateKey }
</button>;
})
}
</FilteredList>;
} }
return <div> return <div>
<div className="mx_Dialog_content"> <div className="mx_Dialog_content">
<FilteredList> { list }
{ rows }
</FilteredList>
</div> </div>
<div className="mx_Dialog_buttons"> <div className="mx_Dialog_buttons">
<button onClick={this.onBack}>{ _t('Back') }</button> <button onClick={this.onBack}>{ _t('Back') }</button>
@ -408,11 +428,14 @@ class AccountDataExplorer extends DevtoolsComponent {
this.onBack = this.onBack.bind(this); this.onBack = this.onBack.bind(this);
this.editEv = this.editEv.bind(this); this.editEv = this.editEv.bind(this);
this._onChange = this._onChange.bind(this); this._onChange = this._onChange.bind(this);
this.onQueryEventType = this.onQueryEventType.bind(this);
this.state = { this.state = {
isRoomAccountData: false, isRoomAccountData: false,
event: null, event: null,
editing: false, editing: false,
queryEventType: '',
}; };
} }
@ -448,6 +471,10 @@ class AccountDataExplorer extends DevtoolsComponent {
this.setState({ editing: true }); this.setState({ editing: true });
} }
onQueryEventType(queryEventType) {
this.setState({ queryEventType });
}
render() { render() {
if (this.state.event) { if (this.state.event) {
if (this.state.editing) { if (this.state.editing) {
@ -459,7 +486,9 @@ class AccountDataExplorer extends DevtoolsComponent {
return <div className="mx_ViewSource"> return <div className="mx_ViewSource">
<div className="mx_Dialog_content"> <div className="mx_Dialog_content">
<pre>{ JSON.stringify(this.state.event.event, null, 2) }</pre> <SyntaxHighlight className="json">
{ JSON.stringify(this.state.event.event, null, 2) }
</SyntaxHighlight>
</div> </div>
<div className="mx_Dialog_buttons"> <div className="mx_Dialog_buttons">
<button onClick={this.onBack}>{ _t('Back') }</button> <button onClick={this.onBack}>{ _t('Back') }</button>
@ -482,7 +511,7 @@ class AccountDataExplorer extends DevtoolsComponent {
return <div> return <div>
<div className="mx_Dialog_content"> <div className="mx_Dialog_content">
<FilteredList> <FilteredList query={this.state.queryEventType} onChange={this.onQueryEventType}>
{ rows } { rows }
</FilteredList> </FilteredList>
</div> </div>

View File

@ -20,7 +20,7 @@ var React = require('react');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var DateUtils = require('matrix-react-sdk/lib/DateUtils'); import {formatDate} from 'matrix-react-sdk/lib/DateUtils';
var filesize = require('filesize'); var filesize = require('filesize');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton'); var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
const Modal = require('matrix-react-sdk/lib/Modal'); const Modal = require('matrix-react-sdk/lib/Modal');
@ -159,7 +159,7 @@ module.exports = React.createClass({
} }
eventMeta = (<div className="mx_ImageView_metadata"> eventMeta = (<div className="mx_ImageView_metadata">
{ _t('Uploaded on %(date)s by %(user)s', {date: DateUtils.formatDate(new Date(this.props.mxEvent.getTs())), user: sender}) } { _t('Uploaded on %(date)s by %(user)s', {date: formatDate(new Date(this.props.mxEvent.getTs())), user: sender}) }
</div>); </div>);
} }

View File

@ -0,0 +1,53 @@
/*
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.
*/
import React from 'react';
import PropTypes from 'prop-types';
import {highlightBlock} from 'highlight.js';
export default class SyntaxHighlight extends React.Component {
static propTypes = {
className: PropTypes.string,
children: PropTypes.node,
};
constructor(props, context) {
super(props, context);
this._ref = this._ref.bind(this);
}
// componentDidUpdate used here for reusability
// componentWillReceiveProps fires too early to call highlightBlock on.
componentDidUpdate() {
if (this._el) highlightBlock(this._el);
}
// call componentDidUpdate because _ref is fired on initial render
// which does not fire componentDidUpdate
_ref(el) {
this._el = el;
this.componentDidUpdate();
}
render() {
const { className, children } = this.props;
return <pre className={`${className} mx_SyntaxHighlight`} ref={this._ref}>
<code>{ children }</code>
</pre>;
}
}

View File

@ -42,7 +42,7 @@ export default React.createClass({
const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog'); const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
Modal.createTrackedDialog('Display release notes', '', QuestionDialog, { Modal.createTrackedDialog('Display release notes', '', QuestionDialog, {
title: _t("What's New"), title: _t("What's New"),
description: <pre className="changelog_text">{releaseNotes}</pre>, description: <div className="mx_MatrixToolbar_changelog">{releaseNotes}</div>,
button: _t("Update"), button: _t("Update"),
onFinished: (update) => { onFinished: (update) => {
if(update && PlatformPeg.get()) { if(update && PlatformPeg.get()) {

View File

@ -20,7 +20,7 @@ import React from 'react';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import Modal from 'matrix-react-sdk/lib/Modal'; import Modal from 'matrix-react-sdk/lib/Modal';
import dis from 'matrix-react-sdk/lib/dispatcher'; import dis from 'matrix-react-sdk/lib/dispatcher';
import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
export default React.createClass({ export default React.createClass({
onUpdateClicked: function() { onUpdateClicked: function() {
@ -49,10 +49,10 @@ export default React.createClass({
alt="Warning" alt="Warning"
/> />
<div className="mx_MatrixToolbar_content"> <div className="mx_MatrixToolbar_content">
{ _tJsx( { _t(
"To return to your account in future you need to <u>set a password</u>", "To return to your account in future you need to <u>set a password</u>",
/<u>(.*?)<\/u>/, {},
(sub) => { return <u>{ sub }</u>; }, { 'u': (sub) => <u>{ sub }</u> },
) } ) }
</div> </div>
<button className="mx_MatrixToolbar_action"> <button className="mx_MatrixToolbar_action">

View File

@ -18,6 +18,7 @@ limitations under the License.
var React = require('react'); var React = require('react');
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import SettingsStore from 'matrix-react-sdk/lib/settings/SettingsStore';
module.exports = React.createClass({ module.exports = React.createClass({
displayName: 'VectorLoginFooter', displayName: 'VectorLoginFooter',
@ -26,6 +27,9 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
// FIXME: replace this with a proper Status skin
if (SettingsStore.getValue("theme") === 'status') return <div/>;
return ( return (
<div className="mx_Login_links"> <div className="mx_Login_links">
<a href="https://medium.com/@RiotChat">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp; <a href="https://medium.com/@RiotChat">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;

View File

@ -33,8 +33,10 @@ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div className="mx_Login_logo"> <div className="mx_Login_header">
<img src={this.props.icon || DEFAULT_LOGO_URI} alt="Riot"/> <div className="mx_Login_logo">
<img src={this.props.icon || DEFAULT_LOGO_URI} alt="Riot"/>
</div>
</div> </div>
); );
} }

View File

@ -1,5 +1,6 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2015, 2016 OpenMarket Ltd
Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -15,8 +16,9 @@ limitations under the License.
*/ */
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types';
import { _t } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import DateUtils from 'matrix-react-sdk/lib/DateUtils'; import {formatFullDateNoTime} from 'matrix-react-sdk/lib/DateUtils';
function getdaysArray() { function getdaysArray() {
return [ return [
@ -30,30 +32,30 @@ function getdaysArray() {
]; ];
} }
module.exports = React.createClass({ export default class DateSeparator extends React.Component {
displayName: 'DateSeparator', static propTypes = {
render: function() { ts: PropTypes.number.isRequired,
var date = new Date(this.props.ts); };
var today = new Date();
var yesterday = new Date();
var days = getdaysArray();
yesterday.setDate(today.getDate() - 1);
var label;
if (date.toDateString() === today.toDateString()) {
label = _t('Today');
}
else if (date.toDateString() === yesterday.toDateString()) {
label = _t('Yesterday');
}
else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
label = days[date.getDay()];
}
else {
label = DateUtils.formatFullDate(date, this.props.showTwelveHour);
}
return ( getLabel() {
<h2 className="mx_DateSeparator">{ label }</h2> const date = new Date(this.props.ts);
); const today = new Date();
const yesterday = new Date();
const days = getdaysArray();
yesterday.setDate(today.getDate() - 1);
if (date.toDateString() === today.toDateString()) {
return _t('Today');
} else if (date.toDateString() === yesterday.toDateString()) {
return _t('Yesterday');
} else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
return days[date.getDay()];
} else {
return formatFullDateNoTime(date);
}
} }
});
render() {
return <h2 className="mx_DateSeparator">{ this.getLabel() }</h2>;
}
}

View File

@ -1,5 +1,6 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2015, 2016 OpenMarket Ltd
Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -14,24 +15,22 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
'use strict';
import React from 'react'; import React from 'react';
import DateUtils from 'matrix-react-sdk/lib/DateUtils'; import PropTypes from 'prop-types';
import {formatFullDate, formatTime} from 'matrix-react-sdk/lib/DateUtils';
module.exports = React.createClass({ export default class MessageTimestamp extends React.Component {
displayName: 'MessageTimestamp', static propTypes = {
ts: PropTypes.number.isRequired,
showTwelveHour: PropTypes.bool,
};
propTypes: { render() {
showTwelveHour: React.PropTypes.bool,
},
render: function() {
const date = new Date(this.props.ts); const date = new Date(this.props.ts);
return ( return (
<span className="mx_MessageTimestamp" title={ DateUtils.formatFullDate(date, this.props.showTwelveHour) }> <span className="mx_MessageTimestamp" title={formatFullDate(date, this.props.showTwelveHour)}>
{ DateUtils.formatTime(date, this.props.showTwelveHour) } { formatTime(date, this.props.showTwelveHour) }
</span> </span>
); );
}, }
}); }

View File

@ -14,227 +14,52 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
'use strict';
import React from 'react'; import React from 'react';
import {DragSource} from 'react-dnd'; import { Draggable } from 'react-beautiful-dnd';
import {DropTarget} from 'react-dnd';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import sdk from 'matrix-react-sdk';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import RoomTile from 'matrix-react-sdk/lib/components/views/rooms/RoomTile'; import RoomTile from 'matrix-react-sdk/lib/components/views/rooms/RoomTile';
import * as Rooms from 'matrix-react-sdk/lib/Rooms';
import Modal from 'matrix-react-sdk/lib/Modal';
/** import classNames from 'classnames';
* Defines a new Component, DNDRoomTile that wraps RoomTile, making it draggable.
* Requires extra props:
* roomSubList: React.PropTypes.object.isRequired,
* refreshSubList: React.PropTypes.func.isRequired,
*/
/** export default class DNDRoomTile extends React.Component {
* Specifies the drag source contract. constructor() {
* Only `beginDrag` function is required. super();
*/ this.getClassName = this.getClassName.bind(this);
var roomTileSource = {
canDrag: function(props, monitor) {
return props.roomSubList.props.editable;
},
beginDrag: function (props) {
// Return the data describing the dragged item
var item = {
room: props.room,
originalList: props.roomSubList,
originalIndex: props.roomSubList.findRoomTile(props.room).index,
targetList: props.roomSubList, // at first target is same as original
// lastTargetRoom: null,
// lastYOffset: null,
// lastYDelta: null,
};
if (props.roomSubList.debug) console.log("roomTile beginDrag for " + item.room.roomId);
// doing this 'correctly' with state causes react-dnd to break seemingly due to the state transitions
props.room._dragging = true;
return item;
},
endDrag: function (props, monitor, component) {
var item = monitor.getItem();
if (props.roomSubList.debug) console.log("roomTile endDrag for " + item.room.roomId + " with didDrop=" + monitor.didDrop());
props.room._dragging = false;
if (monitor.didDrop()) {
if (props.roomSubList.debug) console.log("force updating component " + item.targetList.props.label);
item.targetList.forceUpdate(); // as we're not using state
}
const prevTag = item.originalList.props.tagName;
const newTag = item.targetList.props.tagName;
if (monitor.didDrop() && item.targetList.props.editable) {
// Evil hack to get DMs behaving
if ((prevTag === undefined && newTag === 'im.vector.fake.direct') ||
(prevTag === 'im.vector.fake.direct' && newTag === undefined)
) {
Rooms.guessAndSetDMRoom(
item.room, newTag === 'im.vector.fake.direct',
).done(() => {
item.originalList.removeRoomTile(item.room);
}, (err) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to set direct chat tag " + err);
Modal.createTrackedDialog('Failed to set direct chat tag', '', ErrorDialog, {
title: _t('Failed to set direct chat tag'),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
return;
}
// More evilness: We will still be dealing with moving to favourites/low prio,
// but we avoid ever doing a request with 'im.vector.fake.direct`.
// if we moved lists, remove the old tag
if (prevTag && prevTag !== 'im.vector.fake.direct' &&
item.targetList !== item.originalList
) {
// commented out attempts to set a spinner on our target component as component is actually
// the original source component being dragged, not our target. To fix we just need to
// move all of this to endDrop in the target instead. FIXME later.
//component.state.set({ spinner: component.state.spinner ? component.state.spinner++ : 1 });
MatrixClientPeg.get().deleteRoomTag(item.room.roomId, prevTag).finally(function() {
//component.state.set({ spinner: component.state.spinner-- });
}).catch(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to remove tag " + prevTag + " from room: " + err);
Modal.createTrackedDialog('Failed to remove tag from room', '', ErrorDialog, {
title: _t('Failed to remove tag %(tagName)s from room', {tagName: prevTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
var newOrder= {};
if (item.targetList.props.order === 'manual') {
newOrder['order'] = item.targetList.calcManualOrderTagData(item.room);
}
// if we moved lists or the ordering changed, add the new tag
if (newTag && newTag !== 'im.vector.fake.direct' &&
(item.targetList !== item.originalList || newOrder)
) {
MatrixClientPeg.get().setRoomTag(item.room.roomId, newTag, newOrder).catch(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + newTag + " to room: " + err);
Modal.createTrackedDialog('Failed to add tag to room', '', ErrorDialog, {
title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
}
else {
// cancel the drop and reset our original position
if (props.roomSubList.debug) console.log("cancelling drop & drag");
props.roomSubList.moveRoomTile(item.room, item.originalIndex);
if (item.targetList && item.targetList !== item.originalList) {
item.targetList.removeRoomTile(item.room);
}
}
} }
};
var roomTileTarget = { getClassName(isDragging) {
canDrop: function() { return classNames({
return false; "mx_DNDRoomTile": true,
}, "mx_DNDRoomTile_dragging": isDragging,
});
hover: function(props, monitor) {
var item = monitor.getItem();
//var off = monitor.getClientOffset();
// console.log("hovering on room " + props.room.roomId + ", isOver=" + monitor.isOver());
//console.log("item.targetList=" + item.targetList + ", roomSubList=" + props.roomSubList);
var switchedTarget = false;
if (item.targetList !== props.roomSubList) {
// we've switched target, so remove the tile from the previous target.
// n.b. the previous target might actually be the source list.
if (props.roomSubList.debug) console.log("switched target sublist");
switchedTarget = true;
item.targetList.removeRoomTile(item.room);
item.targetList = props.roomSubList;
}
if (!item.targetList.props.editable) return;
if (item.targetList.props.order === 'manual') {
if (item.room.roomId !== props.room.roomId && props.room !== item.lastTargetRoom) {
// find the offset of the target tile in the list.
var roomTile = props.roomSubList.findRoomTile(props.room);
// shuffle the list to add our tile to that position.
props.roomSubList.moveRoomTile(item.room, roomTile.index);
}
// stop us from flickering between our droptarget and the previous room.
// whenever the cursor changes direction we have to reset the flicker-damping.
/*
var yDelta = off.y - item.lastYOffset;
if ((yDelta > 0 && item.lastYDelta < 0) ||
(yDelta < 0 && item.lastYDelta > 0))
{
// the cursor changed direction - forget our previous room
item.lastTargetRoom = null;
}
else {
// track the last room we were hovering over so we can stop
// bouncing back and forth if the droptarget is narrower than
// the other list items. The other way to do this would be
// to reduce the size of the hittarget on the list items, but
// can't see an easy way to do that.
item.lastTargetRoom = props.room;
}
if (yDelta) item.lastYDelta = yDelta;
item.lastYOffset = off.y;
*/
}
else if (switchedTarget) {
if (!props.roomSubList.findRoomTile(item.room).room) {
// add to the list in the right place
props.roomSubList.moveRoomTile(item.room, 0);
}
// we have to sort the list whatever to recalculate it
props.roomSubList.sortList();
}
},
};
// Export the wrapped version, inlining the 'collect' functions
// to more closely resemble the ES7
module.exports =
DropTarget('RoomTile', roomTileTarget, function(connect, monitor) {
return {
// Call this function inside render()
// to let React DnD handle the drag events:
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
} }
})(
DragSource('RoomTile', roomTileSource, function(connect, monitor) { render() {
return { const props = this.props;
// Call this function inside render()
// to let React DnD handle the drag events: return <div>
connectDragSource: connect.dragSource(), <Draggable
// You can ask the monitor about the current drag state: key={props.room.roomId}
isDragging: monitor.isDragging() draggableId={props.tagName + '_' + props.room.roomId}
}; index={props.index}
})(RoomTile)); type="draggable-RoomTile"
>
{ (provided, snapshot) => {
return (
<div>
<div
ref={provided.innerRef}
{...provided.draggableProps}
{...provided.dragHandleProps}
>
<div className={this.getClassName(snapshot.isDragging)}>
<RoomTile {...props} />
</div>
</div>
{ provided.placeholder }
</div>
);
} }
</Draggable>
</div>;
}
}

View File

@ -17,14 +17,15 @@ limitations under the License.
import React from 'react'; import React from 'react';
import Promise from 'bluebird'; import Promise from 'bluebird';
import sdk from 'matrix-react-sdk'; import sdk from 'matrix-react-sdk';
import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler'; import { _t } from 'matrix-react-sdk/lib/languageHandler';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg'; import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore'; import UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
import SettingsStore, {SettingLevel} from "matrix-react-sdk/lib/settings/SettingsStore";
import Modal from 'matrix-react-sdk/lib/Modal'; import Modal from 'matrix-react-sdk/lib/Modal';
import { import {
NotificationUtils, NotificationUtils,
VectorPushRulesDefinitions, VectorPushRulesDefinitions,
PushRuleVectorState, PushRuleVectorState,
ContentRules ContentRules
} from '../../../notifications'; } from '../../../notifications';
@ -112,12 +113,33 @@ module.exports = React.createClass({
}, },
onEnableDesktopNotificationsChange: function(event) { onEnableDesktopNotificationsChange: function(event) {
UserSettingsStore.setEnableNotifications(event.target.checked); SettingsStore.setValue(
"notificationsEnabled", null,
SettingLevel.DEVICE,
event.target.checked,
).finally(() => {
this.forceUpdate();
});
}, },
onEnableDesktopNotificationBodyChange: function(event) { onEnableDesktopNotificationBodyChange: function(event) {
UserSettingsStore.setEnableNotificationBody(event.target.checked); SettingsStore.setValue(
this.forceUpdate(); "notificationBodyEnabled", null,
SettingLevel.DEVICE,
event.target.checked,
).finally(() => {
this.forceUpdate();
});
},
onEnableAudioNotificationsChange: function(event) {
SettingsStore.setValue(
"audioNotificationsEnabled", null,
SettingLevel.DEVICE,
event.target.checked,
).finally(() => {
this.forceUpdate();
});
}, },
onEnableEmailNotificationsChange: function(address, event) { onEnableEmailNotificationsChange: function(address, event) {
@ -433,7 +455,7 @@ module.exports = React.createClass({
needsUpdate.push( function(kind, rule) { needsUpdate.push( function(kind, rule) {
return cli.setPushRuleActions( return cli.setPushRuleActions(
'global', kind, LEGACY_RULES[rule.rule_id], portLegacyActions(rule.actions) 'global', kind, LEGACY_RULES[rule.rule_id], portLegacyActions(rule.actions)
).then(() => ).then(() =>
cli.deletePushRule('global', kind, rule.rule_id) cli.deletePushRule('global', kind, rule.rule_id)
).catch( (e) => { ).catch( (e) => {
console.warn(`Error when porting legacy rule: ${e}`); console.warn(`Error when porting legacy rule: ${e}`);
@ -446,7 +468,7 @@ module.exports = React.createClass({
if (needsUpdate.length > 0) { if (needsUpdate.length > 0) {
// If some of the rules need to be ported then wait for the porting // If some of the rules need to be ported then wait for the porting
// to happen and then fetch the rules again. // to happen and then fetch the rules again.
return Promise.all(needsUpdate).then(() => return Promise.all(needsUpdate).then(() =>
cli.getPushRules() cli.getPushRules()
); );
} else { } else {
@ -542,10 +564,11 @@ module.exports = React.createClass({
"vectorRuleId": "_keywords", "vectorRuleId": "_keywords",
"description" : ( "description" : (
<span> <span>
{ _tJsx('Messages containing <span>keywords</span>', { _t('Messages containing <span>keywords</span>',
/<span>(.*?)<\/span>/, {},
(sub) => { 'span': (sub) =>
<span className="mx_UserNotifSettings_keywords" onClick={ self.onKeywordsClicked }>{sub}</span> <span className="mx_UserNotifSettings_keywords" onClick={ self.onKeywordsClicked }>{sub}</span>
},
)} )}
</span> </span>
), ),
@ -694,13 +717,13 @@ module.exports = React.createClass({
render: function() { render: function() {
const self = this; const self = this;
let spinner; let spinner;
if (this.state.phase === this.phases.LOADING) { if (this.state.phase === this.phases.LOADING) {
const Loader = sdk.getComponent("elements.Spinner"); const Loader = sdk.getComponent("elements.Spinner");
spinner = <Loader />; spinner = <Loader />;
} }
let masterPushRuleDiv; let masterPushRuleDiv;
if (this.state.masterPushRule) { if (this.state.masterPushRule) {
masterPushRuleDiv = ( masterPushRuleDiv = (
@ -710,7 +733,7 @@ module.exports = React.createClass({
ref="enableNotifications" ref="enableNotifications"
type="checkbox" type="checkbox"
checked={ !this.state.masterPushRule.enabled } checked={ !this.state.masterPushRule.enabled }
onChange={ this.onEnableNotificationsChange } onChange={ this.onEnableNotificationsChange }
/> />
</div> </div>
<div className="mx_UserNotifSettings_labelCell"> <div className="mx_UserNotifSettings_labelCell">
@ -824,7 +847,7 @@ module.exports = React.createClass({
<input id="enableDesktopNotifications" <input id="enableDesktopNotifications"
ref="enableDesktopNotifications" ref="enableDesktopNotifications"
type="checkbox" type="checkbox"
checked={ UserSettingsStore.getEnableNotifications() } checked={ SettingsStore.getValue("notificationsEnabled") }
onChange={ this.onEnableDesktopNotificationsChange } /> onChange={ this.onEnableDesktopNotificationsChange } />
</div> </div>
<div className="mx_UserNotifSettings_labelCell"> <div className="mx_UserNotifSettings_labelCell">
@ -839,7 +862,7 @@ module.exports = React.createClass({
<input id="enableDesktopNotificationBody" <input id="enableDesktopNotificationBody"
ref="enableDesktopNotificationBody" ref="enableDesktopNotificationBody"
type="checkbox" type="checkbox"
checked={ UserSettingsStore.getEnableNotificationBody() } checked={ SettingsStore.getValue("notificationBodyEnabled") }
onChange={ this.onEnableDesktopNotificationBodyChange } /> onChange={ this.onEnableDesktopNotificationBodyChange } />
</div> </div>
<div className="mx_UserNotifSettings_labelCell"> <div className="mx_UserNotifSettings_labelCell">
@ -854,11 +877,8 @@ module.exports = React.createClass({
<input id="enableDesktopAudioNotifications" <input id="enableDesktopAudioNotifications"
ref="enableDesktopAudioNotifications" ref="enableDesktopAudioNotifications"
type="checkbox" type="checkbox"
checked={ UserSettingsStore.getEnableAudioNotifications() } checked={ SettingsStore.getValue("audioNotificationsEnabled") }
onChange={ (e) => { onChange={ this.onEnableAudioNotificationsChange } />
UserSettingsStore.setEnableAudioNotifications(e.target.checked);
this.forceUpdate();
}} />
</div> </div>
<div className="mx_UserNotifSettings_labelCell"> <div className="mx_UserNotifSettings_labelCell">
<label htmlFor="enableDesktopAudioNotifications"> <label htmlFor="enableDesktopAudioNotifications">

View File

@ -1,5 +1,5 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

View File

@ -8,7 +8,7 @@
"All Rooms": "كل الغُرف", "All Rooms": "كل الغُرف",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">متصفح سافاري</a> و <a href=\"http://opera.com\">متصفح أوبرا</a> يعملان أيضاً.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">متصفح سافاري</a> و <a href=\"http://opera.com\">متصفح أوبرا</a> يعملان أيضاً.",
"Add an email address above to configure email notifications": "أضف بريداً إلكترونياً أعلاه من أجل تعديل إعدادت تنبيهات البريد الإلكتروني", "Add an email address above to configure email notifications": "أضف بريداً إلكترونياً أعلاه من أجل تعديل إعدادت تنبيهات البريد الإلكتروني",
"All messages (loud)": "كل الرسائل (صوت مرتفع)", "All messages (noisy)": "كل الرسائل (صوت مرتفع)",
"All notifications are currently disabled for all targets.": "كل التنبيهات غير مفعلة حالياً للجميع.", "All notifications are currently disabled for all targets.": "كل التنبيهات غير مفعلة حالياً للجميع.",
"An error occurred whilst saving your email notification preferences.": "حدث خطأ ما خلال حفظ إعدادات التنبيهات للبريد الإلكتروني.", "An error occurred whilst saving your email notification preferences.": "حدث خطأ ما خلال حفظ إعدادات التنبيهات للبريد الإلكتروني.",
"Call invitation": "دعوة لمحادثة", "Call invitation": "دعوة لمحادثة",

View File

@ -1,7 +1,7 @@
{ {
"Add an email address above to configure email notifications": "Дадайце адрас электроннай пошты вышэй, каб наладзіць апавяшчэнні", "Add an email address above to configure email notifications": "Дадайце адрас электроннай пошты вышэй, каб наладзіць апавяшчэнні",
"All messages": "Усе паведамленні", "All messages": "Усе паведамленні",
"All messages (loud)": "Усе паведамленні (гучна)", "All messages (noisy)": "Усе паведамленні (гучна)",
"All notifications are currently disabled for all targets.": "Усе апавяшчэнні ў цяперашні час адключаныя для ўсіх мэтаў.", "All notifications are currently disabled for all targets.": "Усе апавяшчэнні ў цяперашні час адключаныя для ўсіх мэтаў.",
"An error occurred whilst saving your email notification preferences.": "Адбылася памылка падчас захавання налады апавяшчэнняў па электроннай пошце.", "An error occurred whilst saving your email notification preferences.": "Адбылася памылка падчас захавання налады апавяшчэнняў па электроннай пошце.",
"Cancel Sending": "Адмяніць адпраўку", "Cancel Sending": "Адмяніць адпраўку",

1
src/i18n/strings/bs.json Normal file
View File

@ -0,0 +1 @@
{}

View File

@ -3,7 +3,7 @@
"All messages": "Tots els missatges", "All messages": "Tots els missatges",
"Cancel": "Cancel·la", "Cancel": "Cancel·la",
"Close": "Tanca", "Close": "Tanca",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s a %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s per a %(osName)s",
"Failed to change password. Is your password correct?": "Hi ha hagut un error al canviar la vostra contrasenya. És correcte la vostra contrasenya?", "Failed to change password. Is your password correct?": "Hi ha hagut un error al canviar la vostra contrasenya. És correcte la vostra contrasenya?",
"Continue": "Continua", "Continue": "Continua",
"All Rooms": "Totes les sales", "All Rooms": "Totes les sales",
@ -14,14 +14,14 @@
"Failed to remove tag %(tagName)s from room": "No s'ha pogut esborrar l'etiqueta %(tagName)s de la sala", "Failed to remove tag %(tagName)s from room": "No s'ha pogut esborrar l'etiqueta %(tagName)s de la sala",
"Filter room names": "Filtra els noms de les sales", "Filter room names": "Filtra els noms de les sales",
"Couldn't load home page": "No s'ha pogut carregar la pàgina d'inici", "Couldn't load home page": "No s'ha pogut carregar la pàgina d'inici",
"All messages (loud)": "Tots els missatges (sorollós)", "All messages (noisy)": "Tots els missatges (sorollós)",
"Mentions only": "Només mencions", "Mentions only": "Només mencions",
"Mute": "Silenciat", "Mute": "Silencia",
"Direct Chat": "Xat directe", "Direct Chat": "Xat directe",
"Directory": "Directori", "Directory": "Directori",
"Failed to set direct chat tag": "No s'ha pogut establir l'etiqueta del xat directe", "Failed to set direct chat tag": "No s'ha pogut establir l'etiqueta del xat directe",
"Invite to this room": "Convida a aquesta sala", "Invite to this room": "Convida a aquesta sala",
"No rooms to show": "No hi ha sales a mostrar", "No rooms to show": "No hi ha cap sala per a mostrar",
"Riot does not know how to join a room on this network": "El Riot no sap com unir-se a una sala en aquesta xarxa", "Riot does not know how to join a room on this network": "El Riot no sap com unir-se a una sala en aquesta xarxa",
"Room not found": "No s'ha trobat la sala", "Room not found": "No s'ha trobat la sala",
"Unnamed room": "Sala sense nom", "Unnamed room": "Sala sense nom",
@ -41,32 +41,32 @@
"Favourite": "Favorit", "Favourite": "Favorit",
"Files": "Fitxers", "Files": "Fitxers",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "També funcionen el <a href=\"http://apple.com/safari\">Safari</a> i l'<a href=\"http://opera.com\">Opera</a>.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "També funcionen el <a href=\"http://apple.com/safari\">Safari</a> i l'<a href=\"http://opera.com\">Opera</a>.",
"Add an email address above to configure email notifications": "Afegiu una adreça de correu electrònic més amunt per configurar les notificacions", "Add an email address above to configure email notifications": "Afegiu més amunt un correu electrònic per a configurar les notificacions",
"Advanced notification settings": "Paràmetres avançats de notificacions", "Advanced notification settings": "Paràmetres avançats de notificacions",
"All notifications are currently disabled for all targets.": "Actualment totes les notificacions estan inhabilitades per a tots els objectius.", "All notifications are currently disabled for all targets.": "Actualment totes les notificacions estan inhabilitades per a tots els objectius.",
"An error occurred whilst saving your email notification preferences.": "Hi ha hagut un error al desar les vostres preferències de notificació per correu electrònic.", "An error occurred whilst saving your email notification preferences.": "S'ha produït un error en desar les vostres preferències de notificació per correu electrònic.",
"Bug report sent": "S'ha enviat l'informe d'error", "Bug report sent": "S'ha enviat l'informe d'error",
"Call invitation": "Invitació a la trucada", "Call invitation": "Invitació de trucada",
"Can't update user notification settings": "No es poden actualitzar els paràmetres de notificació de l'usuari", "Can't update user notification settings": "No es poden actualitzar els paràmetres de les notificacions de l'usuari",
"Collecting app version information": "Recol·lectant la informació de la versió de l'aplicació", "Collecting app version information": "S'està recollint la informació de la versió de l'aplicació",
"Collecting logs": "Recol·lectant els registres", "Collecting logs": "S'estan recopilant els registres",
"Custom Server Options": "Opcions de servidor personalitzat", "Custom Server Options": "Opcions de servidor personalitzat",
"Dismiss": "Omet", "Dismiss": "Omet",
"Enter keywords separated by a comma:": "Introdueix paraules clau separades per una coma:", "Enter keywords separated by a comma:": "Introduïu les paraules clau separades per una coma:",
"Login": "Inicia sessió", "Login": "Inicia sessió",
"Leave": "Abandona", "Leave": "Surt",
"Messages containing <span>keywords</span>": "Missatges que contenen <span>paraules clau</span>", "Messages containing <span>keywords</span>": "Missatges que contenen <span>keywords</span>",
"Messages containing my user name": "Missatges que contenen el meu nom d'usuari", "Messages containing my user name": "Missatges que contenen el meu nom d'usuari",
"Messages in group chats": "Missatges a xats de grup", "Messages in group chats": "Missatges en xats de grup",
"Messages containing my display name": "Missatges que contenen el meu nom", "Messages containing my display name": "Missatges que contenen el meu nom visible",
"Messages in one-to-one chats": "Missatges en xats un a un", "Messages in one-to-one chats": "Missatges en xats un a un",
"Messages sent by bot": "Missatges enviats pel bot", "Messages sent by bot": "Missatges enviats pel bot",
"more": "més", "more": "més",
"Noisy": "Sorollós", "Noisy": "Sorollós",
"Notification targets": "Objectius de notificació", "Notification targets": "Objectius de les notificacions",
"Notifications": "Notificacions", "Notifications": "Notificacions",
"Notify me for anything else": "Notifica'm per qualsevol altra cosa", "Notify me for anything else": "Notifica'm per a qualsevol altra cosa",
"Notify for all other messages/rooms": "Notifica per a tots els altres missatges/sales", "Notify for all other messages/rooms": "Notifica per a tots els altres missatges o sales",
"Off": "Apagat", "Off": "Apagat",
"On": "Engegat", "On": "Engegat",
"Permalink": "Enllaç permanent", "Permalink": "Enllaç permanent",
@ -85,7 +85,7 @@
"unknown error code": "codi d'error desconegut", "unknown error code": "codi d'error desconegut",
"What's New": "Novetats", "What's New": "Novetats",
"What's new?": "Què hi ha de nou?", "What's new?": "Què hi ha de nou?",
"Waiting for response from server": "Esperant una resposta del servidor", "Waiting for response from server": "S'està esperant una resposta del servidor",
"You cannot delete this image. (%(code)s)": "No podeu eliminar aquesta imatge. (%(code)s)", "You cannot delete this image. (%(code)s)": "No podeu eliminar aquesta imatge. (%(code)s)",
"You cannot delete this message. (%(code)s)": "No podeu eliminar aquest missatge. (%(code)s)", "You cannot delete this message. (%(code)s)": "No podeu eliminar aquest missatge. (%(code)s)",
"You are not receiving desktop notifications": "No esteu rebent notificacions d'escriptori", "You are not receiving desktop notifications": "No esteu rebent notificacions d'escriptori",
@ -100,7 +100,7 @@
"Today": "Avui", "Today": "Avui",
"Yesterday": "Ahir", "Yesterday": "Ahir",
"OK": "D'acord", "OK": "D'acord",
"Warning": "Advertència", "Warning": "Avís",
"Checking for an update...": "Comprovant si hi ha actualitzacions...", "Checking for an update...": "Comprovant si hi ha actualitzacions...",
"No update available.": "No hi ha cap actualització disponible.", "No update available.": "No hi ha cap actualització disponible.",
"Downloading update...": "Descarregant l'actualització...", "Downloading update...": "Descarregant l'actualització...",
@ -109,5 +109,115 @@
"Back": "Enrere", "Back": "Enrere",
"Cancel Sending": "Cancel·la l'enviament", "Cancel Sending": "Cancel·la l'enviament",
"Collapse panel": "Col·lapsa el tauler", "Collapse panel": "Col·lapsa el tauler",
"Developer Tools": "Eines de desenvolupador" "Developer Tools": "Eines de desenvolupador",
"Riot is not supported on mobile web. Install the app?": "Riot no és compatible amb la web per a mòbils. Voleu instal·lar l'aplicació per a mòbils?",
"Uploading report": "S'està enviant l'informe",
"Riot Desktop on %(platformName)s": "Riot d'escriptori per a %(platformName)s",
"You need to be using HTTPS to place a screen-sharing call.": "Heu d'utilitzar HTTPS per poder fer una trucada amb pantalla compartida.",
"When I'm invited to a room": "Quan sóc convidat a una sala",
"Error saving email notification preferences": "No s'han pogut desar les preferències de les notificacions a causa d'un error",
"Keywords": "Paraules clau",
"Operation failed": "No s'ha pogut realitzar l'operació",
"Failed to update keywords": "No s'han pogut actualitzar les paraules clau",
"Notifications on the following keywords follow rules which cant be displayed here:": "Les notificacions sobre les següents paraules clau segueixen regles que no es poden mostrar aquí:",
"Unable to fetch notification target list": "No s'ha pogut obtenir la llista d'objectius de les notificacions",
"There are advanced notifications which are not shown here": "Hi ha notificacions avançades que no es mostren aquí",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "És possible que els hàgiu configurat en un client diferent de Riot. No podeu modificar-los amb Riot, però encara s'apliquen",
"Show message in desktop notification": "Mostra els missatges amb notificacions d'escriptori",
"Search": "Cerca",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Podeu utilitzar opcions de servidor personalitzades per iniciar sessió en altres servidors Matrix especificant una URL diferent a la del servidor principal. <br/> Això us permet utilitzar Riot amb un compte de Matrix existent en un servidor d'origen diferent. <br/> <br/> També podeu establir un servidor d'identitat personalitzat, però no podreu convidar o ser convidat per correu electrònic.",
"powered by Matrix": "amb tecnologia de Matrix",
"Update": "Actualització",
"Appear Offline": "Apareix sense connexió",
"Away": "Absent",
"To return to your account in future you need to <u>set a password</u>": "Per poder tornar al vostre compte en un futur, heu de <u>set a password</u>",
"Set Password": "Establiu una contrasenya",
"Error encountered (%(errorDetail)s).": "S'ha trobat un error (%(errorDetail)s).",
"Uploaded on %(date)s by %(user)s": "Pujat el %(date)s per l'usuari %(user)s",
"Please describe the bug and/or send logs.": "Si us plau, descriviu l'error i/o envia els registres.",
"Loading bug report module": "S'està carregant l'informe del modul",
"Failed to send report: ": "No s'ha pogut enviar l'informe ",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Si us plau, descriviu l'error. Què heu fet, què esperàveu que passes i què sembla haver passat?",
"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:": "Amb aquest informe d'error, alguns registres d'aquesta aplicació s'enviaran també per tal de fer un diagnostic del problema. Si preferiu enviar només el text anterior, desseleccioneu:",
"Send logs": "Envia els registres",
"Send Custom Event": "Envia els esdeveniments personalitzats",
"You must specify an event type!": "Heu d'especificar un tipus d'esdeveniment",
"Event sent!": "S'ha enviat l'esdeveniment",
"Failed to send custom event.": "No s'ha pogut enviar l'esdeveniment personalitzat.",
"Event Type": "Tipus d'esdeveniment",
"State Key": "Clau d'estat",
"Event Content": "Contingut de l'esdeveniment",
"Send Account Data": "Envia les dades del compte",
"Filter results": "Resultats del filtre",
"Explore Room State": "Esbrina els estats de les sales",
"Edit": "Edita",
"Explore Account Data": "Explora les dades del compte",
"Toolbox": "Caixa d'eines",
"You have successfully set a password!": "Heu establert correctament la contrasenya",
"You have successfully set a password and an email address!": "Heu establert correctament la vostra contrasenya i l'adreça de correu electrònic",
"You can now return to your account after signing out, and sign in on other devices.": "Ara podreu tornar a entrar al vostre compte des de altres dispositius.",
"Remember, you can always set an email address in user settings if you change your mind.": "Recordeu-ho, si canvieu d'idea, sempre podreu establir una adreça de correu electrònic a las vostra configuració d'usuari.",
"(HTTP status %(httpStatus)s)": "(Estat de l´HTTP %(httpStatus)s)",
"Please set a password!": "Si us plau, establiu una contrasenya",
"This will allow you to return to your account after signing out, and sign in on other devices.": "Això farà possible que pugueu tronar al vostre compte des de qualsevol dispositiu.",
"Forward Message": "Reenvia el missatge",
"Unpin Message": "Desenganxa el missatge",
"Pin Message": "Enganxa el missatge",
"View Source": "Mostra el codi",
"View Decrypted Source": "Mostra el codi desencriptat",
"Unhide Preview": "Mostra la previsualització",
"Quote": "Cita",
"Failed to set Direct Message status of room": "No s'ha pogut establir l'estat del missatge directe de la sala",
"Forget": "Oblida",
"Reject": "Rebutja",
"Sorry, your browser is <b>not</b> able to run Riot.": "Disculpeu, el seu navegador <b>not</b> pot executar Riot.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilitza moltes funcions avançades del navegador, algunes de les quals no estan disponibles o són experimentals al vostre navegador actual.",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Si us plau, instal·leu <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> per gaudir d'una millor experiència.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> i <operaLink>Opera</operaLink> també fan la feina.",
"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!": "Amb el vostre navegador actual, l'aparença de l'aplicació pot ser completament incorrecta i algunes o totes les funcions poden no funcionar correctament. Si voleu provar-ho de totes maneres, podeu continuar, però esteu sols pel que fa als problemes que pugueu trobar!",
"I understand the risks and wish to continue": "Entenc el riscos i desitjo continuar",
"Register": "Registre",
"Rooms": "Sales",
"Hide panel": "Amaga el panel",
"Invite to this community": "Convida a aquesta comunitat",
"Add rooms to this community": "Afegeix sales a aquesta comunitat",
"Failed to get protocol list from Home Server": "No s'ha pogut obtenir la llista de protocols del servidor local",
"The Home Server may be too old to support third party networks": "El servidor local pot ser massa antic per a ser compatible amb xarxes de tercers",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Voleu esborrar de la sala l'alies %(alias)s i retirar %(name)s del directori?",
"Remove %(name)s from the directory?": "Voleu retirar %(name)s del directori?",
"delete the alias.": "esborra l'alies.",
"Unable to join network": "No s'ha pogut unir-se a la xarxa",
"Fetching third party location failed": "S'ha produït un error en obtenir la ubicació de tercers",
"Unable to look up room ID from server": "No s'ha pogut cercar l'ID de la sala en el servidor",
"World readable": "Llegible al món",
"Guests can join": "Els usuaris d'altres xarxes s'hi poden unir",
"Search for a room": "Busca una sala",
"Expand panel": "Expandeix el panel",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Xat descentralitzat, encriptat &amp; col·laboració amb tecnologia de [matrix]",
"Search the room directory": "Cerqueu el directori de sales",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Ja existeixen moltes sales a Matrix vinculades a xarxes existents (Slack, IRC, Gitter, etc.) o independents. Feu un cop d'ull al directori!",
"Get started with some tips from Riot Bot!": "Comenceu amb alguns consells de Riot Bot!",
"General discussion about Matrix and Riot": "Debat general sobre Matrix i Riot",
"Discussion of all things Matrix!": "Debats sobre qualsevol cosa de Matrix!",
"Riot/Web &amp; Desktop chat": "Riot/Web &amp; Xat d'escriptori",
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; Xat de matrix-ios-sdk",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; Xat matrix-android-sdk",
"Matrix technical discussions": "Debats tècnics sobre Matrix",
"Reply": "Respon",
"Running Matrix services": "Serveis de Matrix en marxa",
"Community-run support for Synapse": "Suport de la comunitat per a Synapse",
"Admin support for Dendrite": "Suport dels administrador per a Dendrite",
"Announcements about Synapse releases": "Anuncis sobre llançaments de Synapse",
"Support for those using and running matrix-appservice-irc": "Suport per a aquells que utilitzen i executen matrix-appservice-irc",
"Building services on Matrix": "Construir serveis a Matrix",
"Support for those using the Matrix spec": "Suport per a aquells que utilitzen l'especificació Matrix",
"Design and implementation of E2E in Matrix": "Disseny i implementació de l'E2E a Matrix",
"Implementing VR services with Matrix": "Implementació de serveis VR amb Matrix",
"Implementing VoIP services with Matrix": "Implementació de serveis VoIP amb Matrix",
"Discussion of the Identity Service API": "Debat sobre l'API Identity Service",
"Support for those using, running and writing other bridges": "Suport per a aquells que utilitzen, executen i escriuen altres ponts",
"Contributing code to Matrix and Riot": "Contribuir amb codi a Matrix i Riot",
"Dev chat for the Riot/Web dev team": "Xat de l'equip de desenvolupadors Riot/Web per a desenvolupadors",
"Dev chat for the Dendrite dev team": "Xat de l'equip Dendrite per a desenvolupadors",
"Co-ordination for Riot/Web translators": "Coordinació per a traductors de Riot/Web"
} }

View File

@ -42,7 +42,7 @@
"Messages sent by bot": "Zprávy poslané robotem", "Messages sent by bot": "Zprávy poslané robotem",
"more": "více", "more": "více",
"Mute": "Ztlumit", "Mute": "Ztlumit",
"All messages (loud)": "Všechny zprávy (hlasitě)", "All messages (noisy)": "Všechny zprávy (hlasitě)",
"Couldn't load home page": "Nepodařilo se nahrát úvodní stránku", "Couldn't load home page": "Nepodařilo se nahrát úvodní stránku",
"All notifications are currently disabled for all targets.": "Veškeré notifikace jsou aktuálně pro všechny cíle vypnuty.", "All notifications are currently disabled for all targets.": "Veškeré notifikace jsou aktuálně pro všechny cíle vypnuty.",
"Cancel Sending": "Zrušit odesílání", "Cancel Sending": "Zrušit odesílání",
@ -100,7 +100,7 @@
"Today": "Dnes", "Today": "Dnes",
"Yesterday": "Včera", "Yesterday": "Včera",
"OK": "OK", "OK": "OK",
"Warning": "Varování", "Warning": "Upozornění",
"Checking for an update...": "Kontrola aktualizací...", "Checking for an update...": "Kontrola aktualizací...",
"An error occurred whilst saving your email notification preferences.": "Při ukládání nastavení e-mailových upozornění nastala chyba.", "An error occurred whilst saving your email notification preferences.": "Při ukládání nastavení e-mailových upozornění nastala chyba.",
"Collecting app version information": "Sbírání informací o verzi aplikace", "Collecting app version information": "Sbírání informací o verzi aplikace",
@ -210,12 +210,16 @@
"Register": "Zaregistrovat", "Register": "Zaregistrovat",
"Rooms": "Místnosti", "Rooms": "Místnosti",
"Invite to this community": "Pozvat do této komunity", "Invite to this community": "Pozvat do této komunity",
"Add rooms to this community": "Přidat místnosti do této komunity", "Add rooms to this community": "Přidat místnosti do této skupiny",
"State Key": "Stavový klíč", "State Key": "Stavový klíč",
"Send Custom State Event": "Poslat vlastní stavovou událost", "Send Custom State Event": "Poslat vlastní stavovou událost",
"Explore Room State": "Prohlížet stav místnosti", "Explore Room State": "Prohlížet stav místnosti",
"Unpin Message": "Odepnout zprávu", "Unpin Message": "Odepnout zprávu",
"Toolbox": "Sada nástrojů", "Toolbox": "Sada nástrojů",
"Send Account Data": "Poslat data o účtu", "Send Account Data": "Poslat data o účtu",
"Explore Account Data": "Prozkoumat data o účtu" "Explore Account Data": "Prozkoumat data o účtu",
"Appear Offline": "Jevit se offline",
"Away": "Pryč",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Pro nejlepší zážitek si prosím nainstalujte <chromeLink>Chrome</chromeLink> nebo <firefoxLink>Firefox</firefoxLink>.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> a <operaLink>Opera</operaLink> fungují taky."
} }

View File

@ -6,8 +6,8 @@
"Couldn't find a matching Matrix room": "Kunne ikke finde et matchende Matrix-rum", "Couldn't find a matching Matrix room": "Kunne ikke finde et matchende Matrix-rum",
"Custom Server Options": "Brugerdefinerede serverindstillinger", "Custom Server Options": "Brugerdefinerede serverindstillinger",
"delete the alias.": "Slet aliaset.", "delete the alias.": "Slet aliaset.",
"Direct Chat": "Personligt Chat", "Direct Chat": "Personlig Chat",
"Directory": "Rum fortegnelse", "Directory": "Rum katalog",
"Dismiss": "Afskedige", "Dismiss": "Afskedige",
"Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten", "Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten",
"Enable desktop notifications": "Aktivér desktop meddelelser", "Enable desktop notifications": "Aktivér desktop meddelelser",
@ -22,22 +22,22 @@
"Failed to update keywords": "Kunne ikke opdatere søgeord", "Failed to update keywords": "Kunne ikke opdatere søgeord",
"Failed to get protocol list from Home Server": "Kunne ikke få protokolliste fra Home Server", "Failed to get protocol list from Home Server": "Kunne ikke få protokolliste fra Home Server",
"Failed to get public room list": "Kunne ikke få offentlig rumliste", "Failed to get public room list": "Kunne ikke få offentlig rumliste",
"Failed to set Direct Message status of room": "Kunne ikke indstille direkte beskedstatus for rumet", "Failed to set Direct Message status of room": "Kunne ikke indstille Direkte Beskedstatus for rummet",
"Favourite": "Favorit", "Favourite": "Favorit",
"Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes", "Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes",
"Files": "Filer", "Files": "Filer",
"Filter room names": "Filtrer rumnavne", "Filter room names": "Filtrér rumnavne",
"Forget": "Glem", "Forget": "Glem",
"Guests can join": "Gæster kan deltage", "Guests can join": "Gæster kan deltage",
"Invite to this room": "Inviter til dette rum", "Invite to this room": "Inviter til dette rum",
"Keywords": "Søgeord", "Keywords": "Søgeord",
"Leave": "Forlade", "Leave": "Forlad",
"Low Priority": "Lav prioritet", "Low Priority": "Lav prioritet",
"Members": "Medlemmer", "Members": "Medlemmer",
"No rooms to show": "Ingen rum at vise", "No rooms to show": "Ingen rum at vise",
"Noisy": "Støjende", "Noisy": "Støjende",
"Notification targets": "Meddelelsesmål", "Notification targets": "Meddelelsesmål",
"Notifications": "Meddelser", "Notifications": "Notifikationer",
"Notifications on the following keywords follow rules which cant be displayed here:": "Meddelelser om følgende søgeord følger regler, der ikke kan vises her:", "Notifications on the following keywords follow rules which cant be displayed here:": "Meddelelser om følgende søgeord følger regler, der ikke kan vises her:",
"Notify for all other messages/rooms": "Underret om alle andre meddelelser / rum", "Notify for all other messages/rooms": "Underret om alle andre meddelelser / rum",
"Notify me for anything else": "Underret mig om noget andet", "Notify me for anything else": "Underret mig om noget andet",
@ -45,22 +45,177 @@
"On": "Tændt", "On": "Tændt",
"Operation failed": "Operation mislykkedes", "Operation failed": "Operation mislykkedes",
"powered by Matrix": "Drevet af Matrix", "powered by Matrix": "Drevet af Matrix",
"Reject": "Afvise", "Reject": "Afvis",
"Remove": "Fjerne", "Remove": "Fjern",
"Remove from Directory": "Fjern fra fortegnelse", "Remove from Directory": "Fjern fra Katalog",
"Riot does not know how to join a room on this network": "Riot ved ikke, hvordan man kan deltage i et rum på dette netværk", "Riot does not know how to join a room on this network": "Riot ved ikke, hvordan man kan deltage i et rum på dette netværk",
"Room not found": "Rumet ikke fundet", "Room not found": "Rummet ikke fundet",
"Search for a room": "Søg efter et rum", "Search for a room": "Søg efter et rum",
"The Home Server may be too old to support third party networks": "Hjemmeserveren kan være for gammel til at understøtte tredjepartsnetværk", "The Home Server may be too old to support third party networks": "Hjemmeserveren kan være for gammel til at understøtte tredjepartsnetværk",
"There are advanced notifications which are not shown here": "Der er avancerede meddelelser, som ikke vises her", "There are advanced notifications which are not shown here": "Der er avancerede meddelelser, som ikke vises her",
"The server may be unavailable or overloaded": "Serveren kan være utilgængelig eller overbelastet", "The server may be unavailable or overloaded": "Serveren kan være utilgængelig eller overbelastet",
"Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste", "Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste",
"Unable to join network": "Kan ikke deltage i netværket", "Unable to join network": "Kan ikke forbinde til netværket",
"Unable to look up room ID from server": "Kunne ikke slå op på rum-id fra server", "Unable to look up room ID from server": "Kunne ikke slå rum-id op på server",
"unknown error code": "Ukendt fejlkode", "unknown error code": "Ukendt fejlkode",
"Unnamed room": "Unnamed rum", "Unnamed room": "Unavngivet rum",
"World readable": "Læselig til alle", "World readable": "Læselig af alle",
"You are not receiving desktop notifications": "Du modtager ikke desktop meddelelser", "You are not receiving desktop notifications": "Du modtager ikke skrivebordsmeddelelser",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du har muligvis konfigureret dem i en anden klient end Riot. Du kan ikke tune dem i Riot, men de gælder stadig", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du har muligvis konfigureret dem i en anden klient end Riot. Du kan ikke tune dem i Riot, men de gælder stadig",
"Close": "Luk" "Close": "Luk",
"Riot is not supported on mobile web. Install the app?": "Riot understøtter ikke mobilhjemmesider. Vil du installere app'en?",
"Collecting app version information": "Indsamler app versionsoplysninger",
"Collecting logs": "Indsamler logfiler",
"Uploading report": "Uploader rapport",
"Waiting for response from server": "Venter på svar fra server",
"Riot Desktop on %(platformName)s": "Riot Desktop på %(platformName)s",
"Unknown device": "Ukendt enhed",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s på %(osName)s",
"You need to be using HTTPS to place a screen-sharing call.": "Du skal bruge HTTPS for at lave skærm-delings-opkald.",
"Messages containing my display name": "Beskeder der indeholder mit viste navn",
"Messages containing my user name": "Beskeder der indeholder mit brugernavn",
"Messages in one-to-one chats": "Beskeder i en-til-en chats",
"Messages in group chats": "Beskeder i gruppechats",
"When I'm invited to a room": "Når jeg bliver inviteret til et rum",
"Call invitation": "Opkalds invitation",
"Messages sent by bot": "Beskeder sendt af en bot",
"OK": "OK",
"Messages containing <span>keywords</span>": "Beskeder der indeholder <span>keywords</span>",
"Advanced notification settings": "Avancerede notifikationsindstillinger",
"Show message in desktop notification": "Vis besked i skrivebordsnotifikation",
"Failed to set direct chat tag": "Kunne ikke markere rummet som direkte chat",
"Failed to remove tag %(tagName)s from room": "Kunne ikke fjerne tag(s): %(tagName)s fra rummet",
"Failed to add tag %(tagName)s to room": "Kunne ikke tilføje tag(s): %(tagName)s til rummet",
"Search…": "Søg…",
"Search": "Søg",
"This Room": "Dette rum",
"All Rooms": "Alle rum",
"Sunday": "Søndag",
"Monday": "Mandag",
"Tuesday": "Tirsdag",
"Wednesday": "Onsdag",
"Thursday": "Torsdag",
"Friday": "Fredag",
"Saturday": "Lørdag",
"Today": "I dag",
"Yesterday": "I går",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Du kan bruge de brugerdefinerede server indstillinger til at logge ind på andre Matrix servere ved at skrive en anden Home Server adresse.<br/>Dette tillader dig at bruge Riot med en eksisterende Matrix konto på en anden home server.<br/><br/>Du kan også indstille en brugerdefineret identity server men så vil du ikke kunne invitere brugere ved hjælp af deres emailadresse eller selv blive inviteret med emailadresse.",
"What's New": "Hvad er nyt",
"Update": "Opdater",
"What's new?": "Hvad er nyt?",
"Appear Offline": "Fremstå Offline",
"Away": "Ikke til stede",
"A new version of Riot is available.": "En ny version a Riot er tilgængelig.",
"To return to your account in future you need to <u>set a password</u>": "For at komme ind på din konto i fremtiden skal du <u>indstille et password</u>",
"Set Password": "Indstil Password",
"Error encountered (%(errorDetail)s).": "En fejl er opstået (%(errorDetail)s).",
"Checking for an update...": "Checker om der er en opdatering...",
"No update available.": "Ingen opdatering tilgængelig.",
"Downloading update...": "Downloader opdatering...",
"Warning": "Advarsel",
"You cannot delete this image. (%(code)s)": "Du kan ikke slette dette billede. (%(code)s)",
"Uploaded on %(date)s by %(user)s": "Uploadet den %(date)s af %(user)s",
"Download this file": "Download denne fil",
"Please describe the bug and/or send logs.": "Beskriv venligst fejlen og/eller send logs.",
"Loading bug report module": "Indlæser fejlrepporterings modul",
"Bug report sent": "Fejl rapporteret",
"Thank you!": "Tak!",
"Failed to send report: ": "Kunne ikke sende rapport: ",
"Cancel": "Afbryd",
"Report a bug": "Rapportér en fejl",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Beskriv venlist fejlen. Hvad gjorde du? Hvad forventede du ville ske? Hvad skete rent faktisk?",
"Describe your problem here.": "Beskriv dit problem her.",
"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:": "For at diagnosticere problemer vil logs fra denne klient blive sendt sammen med fejlrapporten. Hvis du vil foretrække kun at sende teksten foroven, bedes du fjerne fluebenet:",
"Send logs": "Send logs",
"Send": "Send",
"Unavailable": "Utilgængelig",
"Changelog": "Ændringslog",
"Back": "Tilbage",
"Send Custom Event": "Send Brugerdefineret Begivenhed",
"You must specify an event type!": "Du skal angive en begivenhedstype!",
"Event sent!": "Begivenhed sendt!",
"Failed to send custom event.": "Kunne ikke sende brugerdefinerede begivenhed.",
"Event Type": "Begivenhedstype",
"State Key": "Tilstandsnøgle",
"Event Content": "Begivenhedsindhold",
"Send Account Data": "Send Konto Data",
"Filter results": "Filtrér resultater",
"Explore Room State": "Udforsk Rum Tilstand",
"Edit": "Rediger",
"Explore Account Data": "Udforsk Konto Data",
"Toolbox": "Værktøjer",
"Developer Tools": "Udviklingsværktøjer",
"You have successfully set a password!": "Du har succesfuldt indstillet et password!",
"You have successfully set a password and an email address!": "Du har succesfuldt indstillet et password og en emailadresse!",
"You can now return to your account after signing out, and sign in on other devices.": "Du kan nu vende tilbage til din konto efter at have logget ud og logge ind på andre enheder.",
"Remember, you can always set an email address in user settings if you change your mind.": "Husk, du kan altid indstille en emailadresse i dine bruger indstillinger hvis du ombestemmer dig.",
"Continue": "Fortsæt",
"Failed to change password. Is your password correct?": "Kunne ikke ændre password. Er dit password korrekt?",
"(HTTP status %(httpStatus)s)": "(HTTP tilstand %(httpStatus)s)",
"Please set a password!": "Indstil venligst et password!",
"This will allow you to return to your account after signing out, and sign in on other devices.": "Dette vil tillade dig at vende tilbage til din konto efter at have logget ud og at logge ind på andre enheder.",
"You cannot delete this message. (%(code)s)": "Du kan ikke slette denne besked. (%(code)s)",
"Resend": "Send igen",
"Cancel Sending": "Stop Forsendelse",
"Forward Message": "Videresend Besked",
"Unpin Message": "Fasthold ikke længere Besked",
"Pin Message": "Fasthold Besked",
"View Source": "Se Kilde",
"View Decrypted Source": "Se Dekrypteret Kilde",
"Unhide Preview": "Vis Forhåndsvisning",
"Permalink": "Permanent link",
"Quote": "Citat",
"Source URL": "Kilde URL",
"Failed to forget room %(errCode)s": "Kunne ikke glemme rummet %(errCode)s",
"All messages (loud)": "Alle beskeder (høj)",
"All messages": "Alle beskeder",
"Mentions only": "Kun nævninger",
"Mute": "Sæt på lydløs",
"Sorry, your browser is <b>not</b> able to run Riot.": "Beklager, din browser kan <b>ikke</b> køre Riot.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot bruger mange avancerede browser funktioner, hvoraf nogle af dem ikke er tilgængelige eller er eksperimentelle i din browser.",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installer venligst <chromeLink>Chrome</chromeLink> eller <firefoxLink>Firefox</firefoxLink> for den bedste oplevelse.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> og <operaLink>Opera</operaLink> virker også.",
"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!": "Med din nuværnde broser kan udseendet og fornemmelsen af programmet være helt forkert og nogle funktioner virker måske ikke. Hvis du alligevel vil prøve så kan du fortsætte, men det er på egen risiko!",
"I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker at fortsætte",
"Couldn't load home page": "Kunne ikke indlæse startsiden",
"Login": "Log ind",
"Register": "Registrér",
"Rooms": "Rum",
"Hide panel": "Gem panel",
"Invite to this community": "Inviter til dette fællesskab",
"Add rooms to this community": "Tilføj rum til dette fællesskab",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slet rumaliaset %(alias)s og fjern %(name)s fra kataloget?",
"Remove %(name)s from the directory?": "Fjern %(name)s fra kataloget?",
"remove %(name)s from the directory.": "fjern %(name)s fra kataloget.",
"more": "mere",
"Expand panel": "Udvid panel",
"Collapse panel": "Slå panel sammen",
"Welcome to Riot.im": "Velkommen til Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentraliseret, krypteret chat &amp; samarbejde baseret på [matrix]",
"Search the room directory": "Søg i rumkataloget",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Masser af rum ekistere allerede i Matrix, forbundet til eksisterende netværk (Slack, IRC, Gitter osv.) eller selvstændige. Tjek kataloget ud!",
"Chat with Riot Bot": "Chat med Riot Bot",
"Get started with some tips from Riot Bot!": "Kom godt i gang med nogle tips fra Riot Bot!",
"General discussion about Matrix and Riot": "Generel diskussion om Matrix og Riot",
"Discussion of all things Matrix!": "Diskussion om alt der har med Matrix at gøre!",
"Riot/Web &amp; Desktop chat": "Riot/Web- &amp; Desktopchat",
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; matrix-ios-sdk chat",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; matrix-android-sdk chat",
"Matrix technical discussions": "Matrix tekniske diskussioner",
"Running Matrix services": "Drift af Matrix tjenester",
"Community-run support for Synapse": "Fællesskabsstyret hjælp til Synapse",
"Admin support for Dendrite": "Adminstrationshjælp til Dendrite",
"Announcements about Synapse releases": "Announceringer om Synapse udgivelser",
"Support for those using and running matrix-appservice-irc": "Hjælp til dem der bruger og kører matrix-appservice-irc",
"Building services on Matrix": "Bygning af tjenester på Matrix",
"Support for those using the Matrix spec": "Hjælp til dem der anvender Matrix speciffikationen",
"Design and implementation of E2E in Matrix": "Design og implementering af E2E i Matrix",
"Implementing VR services with Matrix": "Implementering af VR tjenester med Matrix",
"Implementing VoIP services with Matrix": "Implementering af VoIP tjenester med Matrix",
"Discussion of the Identity Service API": "Diskussion af Identity Service API'en",
"Support for those using, running and writing other bridges": "Hjælp til dem der bruger, driver og skriver andre bridges",
"Contributing code to Matrix and Riot": "Biddrag med kode til Matrix og Riot",
"Dev chat for the Riot/Web dev team": "Udviklerchat til Riot/Web udviklerholdet",
"Dev chat for the Dendrite dev team": "Udviklerchat til Dendrite udviklerholdet",
"Co-ordination for Riot/Web translators": "Co-ordination af Riot/Web oversættere"
} }

View File

@ -62,7 +62,7 @@
"On": "An", "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 Matrix-Client und nicht in Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Matrix-Client und nicht in Riot konfiguriert. Sie können in Riot nicht verändert werden, gelten aber trotzdem",
"All messages": "Alle Nachrichten", "All messages": "Alle Nachrichten",
"All messages (loud)": "Alle Nachrichten (laut)", "All messages (noisy)": "Alle Nachrichten (laut)",
"Cancel Sending": "Senden abbrechen", "Cancel Sending": "Senden abbrechen",
"Close": "Schließen", "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?", "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?",
@ -74,7 +74,7 @@
"Mentions only": "Nur, wenn du erwähnt wirst", "Mentions only": "Nur, wenn du erwähnt wirst",
"Mute": "Stummschalten", "Mute": "Stummschalten",
"Permalink": "Permanenter Link", "Permalink": "Permanenter Link",
"Quote": "Zitieren", "Quote": "Zitat",
"Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?", "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.", "remove %(name)s from the directory.": "entferne %(name)s aus dem Verzeichnis.",
"Resend": "Erneut senden", "Resend": "Erneut senden",
@ -216,6 +216,11 @@
"Invite to this community": "In diese Community einladen", "Invite to this community": "In diese Community einladen",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Die benutzerdefinierten Server-Einstellungen kannst du verwenden, um dich auf anderen Matrix-Servern anzumelden, indem du eine abweichende Heimserver-URL eingibst.<br/>Somit ist es möglich, Riot mit einem bereits bestehendem Matrix-Benutzerkonto auf einem anderen Heimserver zu verwenden.<br/><br/>Außerdem kannst du einen benutzerdefinierten Identitätsserver eingeben. Allerdings kannst du in diesem Fall Benutzer nicht mehr per E-Mail-Adresse einladen und auch selbst nicht mehr per E-Mail-Adresse eingeladen werden.", "You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Die benutzerdefinierten Server-Einstellungen kannst du verwenden, um dich auf anderen Matrix-Servern anzumelden, indem du eine abweichende Heimserver-URL eingibst.<br/>Somit ist es möglich, Riot mit einem bereits bestehendem Matrix-Benutzerkonto auf einem anderen Heimserver zu verwenden.<br/><br/>Außerdem kannst du einen benutzerdefinierten Identitätsserver eingeben. Allerdings kannst du in diesem Fall Benutzer nicht mehr per E-Mail-Adresse einladen und auch selbst nicht mehr per E-Mail-Adresse eingeladen werden.",
"Toolbox": "Werkzeugkasten", "Toolbox": "Werkzeugkasten",
"Explore Account Data": "Daten des Benutzerkontos erkunden", "Explore Account Data": "Benutzerkonto-Daten analysieren",
"Send Account Data": "Sende Benutzerkonto-Daten" "Send Account Data": "Benutzerkonto-Daten senden",
"Away": "Abwesend",
"Appear Offline": "Als offline anzeigen",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> und <operaLink>Opera</operaLink> sind weitere Alternativen.",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Bitte installiere <chromeLink>Chrome</chromeLink> oder <firefoxLink>Firefox</firefoxLink> für ein optimales Anwendungsergebnis.",
"Reply": "Antworten"
} }

View File

@ -29,7 +29,7 @@
"Collecting app version information": "Συγκέντρωση πληροφοριών σχετικά με την έκδοση της εφαρμογής", "Collecting app version information": "Συγκέντρωση πληροφοριών σχετικά με την έκδοση της εφαρμογής",
"customServer_text": "Μπορείτε να χρησιμοποιήσετε τις προσαρμοσμένες ρυθμίσεις για να εισέλθετε σε άλλους διακομιστές Matrix επιλέγοντας μια διαφορετική διεύθυνση για το διακομιστή.<br/> Αυτό σας επιτρέπει να χρησιμοποιήσετε την εφαρμογή Riot με έναν υπάρχοντα λογαριασμό σε διαφορετικό διακομιστή.<br/><br/>Επίσης μπορείτε να επιλέξετε ένα διαφορετικό διακομιστή ταυτότητας αλλά δεν θα έχετε τη δυνατότητα να προσκαλέσετε άλλους χρήστες ή να σας προσκαλέσουν μέσω μηνυμάτων ηλεκτρονικής αλληλογραφίας.", "customServer_text": "Μπορείτε να χρησιμοποιήσετε τις προσαρμοσμένες ρυθμίσεις για να εισέλθετε σε άλλους διακομιστές Matrix επιλέγοντας μια διαφορετική διεύθυνση για το διακομιστή.<br/> Αυτό σας επιτρέπει να χρησιμοποιήσετε την εφαρμογή Riot με έναν υπάρχοντα λογαριασμό σε διαφορετικό διακομιστή.<br/><br/>Επίσης μπορείτε να επιλέξετε ένα διαφορετικό διακομιστή ταυτότητας αλλά δεν θα έχετε τη δυνατότητα να προσκαλέσετε άλλους χρήστες ή να σας προσκαλέσουν μέσω μηνυμάτων ηλεκτρονικής αλληλογραφίας.",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s μέσω %(browserName)s σε %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s μέσω %(browserName)s σε %(osName)s",
"All messages (loud)": "Όλα τα μηνύματα (δυνατά)", "All messages (noisy)": "Όλα τα μηνύματα (δυνατά)",
"delete the alias.": "διέγραψε το ψευδώνυμο.", "delete the alias.": "διέγραψε το ψευδώνυμο.",
"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 από το ευρετήριο;",
"Dismiss": "Απόρριψη", "Dismiss": "Απόρριψη",

View File

@ -43,9 +43,6 @@
"Off": "Off", "Off": "Off",
"On": "On", "On": "On",
"Noisy": "Noisy", "Noisy": "Noisy",
"Failed to set direct chat tag": "Failed to set direct chat tag",
"Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
"Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room",
"Search…": "Search…", "Search…": "Search…",
"Search": "Search", "Search": "Search",
"This Room": "This Room", "This Room": "This Room",
@ -70,7 +67,6 @@
"What's new?": "What's new?", "What's new?": "What's new?",
"A new version of Riot is available.": "A new version of Riot is available.", "A new version of Riot is available.": "A new version of Riot is available.",
"To return to your account in future you need to <u>set a password</u>": "To return to your account in future you need to <u>set a password</u>", "To return to your account in future you need to <u>set a password</u>": "To return to your account in future you need to <u>set a password</u>",
"Toolbox": "Toolbox",
"Set Password": "Set Password", "Set Password": "Set Password",
"Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).", "Error encountered (%(errorDetail)s).": "Error encountered (%(errorDetail)s).",
"Checking for an update...": "Checking for an update...", "Checking for an update...": "Checking for an update...",
@ -98,18 +94,19 @@
"Unavailable": "Unavailable", "Unavailable": "Unavailable",
"Changelog": "Changelog", "Changelog": "Changelog",
"Back": "Back", "Back": "Back",
"Send Custom Event": "Send Custom Event",
"You must specify an event type!": "You must specify an event type!", "You must specify an event type!": "You must specify an event type!",
"Event sent!": "Event sent!", "Event sent!": "Event sent!",
"Failed to send custom event.": "Failed to send custom event.", "Failed to send custom event.": "Failed to send custom event.",
"Event Type": "Event Type", "Event Type": "Event Type",
"Event Content": "Event Content",
"State Key": "State Key", "State Key": "State Key",
"Edit": "Edit", "Event Content": "Event Content",
"Filter results": "Filter results",
"Send Custom Event": "Send Custom Event",
"Send Account Data": "Send Account Data", "Send Account Data": "Send Account Data",
"Explore Account Data": "Explore Account Data", "Filter results": "Filter results",
"Explore Room State": "Explore Room State", "Explore Room State": "Explore Room State",
"Edit": "Edit",
"Explore Account Data": "Explore Account Data",
"Toolbox": "Toolbox",
"Developer Tools": "Developer Tools", "Developer Tools": "Developer Tools",
"You have successfully set a password!": "You have successfully set a password!", "You have successfully set a password!": "You have successfully set a password!",
"You have successfully set a password and an email address!": "You have successfully set a password and an email address!", "You have successfully set a password and an email address!": "You have successfully set a password and an email address!",
@ -124,6 +121,7 @@
"Resend": "Resend", "Resend": "Resend",
"Cancel Sending": "Cancel Sending", "Cancel Sending": "Cancel Sending",
"Forward Message": "Forward Message", "Forward Message": "Forward Message",
"Reply": "Reply",
"Unpin Message": "Unpin Message", "Unpin Message": "Unpin Message",
"Pin Message": "Pin Message", "Pin Message": "Pin Message",
"View Source": "View Source", "View Source": "View Source",
@ -132,10 +130,14 @@
"Permalink": "Permalink", "Permalink": "Permalink",
"Quote": "Quote", "Quote": "Quote",
"Source URL": "Source URL", "Source URL": "Source URL",
"Online": "Online",
"Away": "Away",
"Appear Offline": "Appear Offline",
"Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
"Failed to set Direct Message status of room": "Failed to set Direct Message status of room", "Failed to set Direct Message status of room": "Failed to set Direct Message status of room",
"unknown error code": "unknown error code", "unknown error code": "unknown error code",
"Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
"All messages (loud)": "All messages (loud)", "All messages (noisy)": "All messages (noisy)",
"All messages": "All messages", "All messages": "All messages",
"Mentions only": "Mentions only", "Mentions only": "Mentions only",
"Mute": "Mute", "Mute": "Mute",
@ -145,17 +147,20 @@
"Favourite": "Favourite", "Favourite": "Favourite",
"Low Priority": "Low Priority", "Low Priority": "Low Priority",
"Direct Chat": "Direct Chat", "Direct Chat": "Direct Chat",
"View Community": "View Community",
"Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> able to run Riot.", "Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> able to run Riot.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.", "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.", "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.",
"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!", "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!",
"I understand the risks and wish to continue": "I understand the risks and wish to continue", "I understand the risks and wish to continue": "I understand the risks and wish to continue",
"Couldn't load home page": "Couldn't load home page", "Couldn't load home page": "Couldn't load home page",
"Login": "Login", "Login": "Login",
"Register": "Register", "Register": "Register",
"Invite to this room": "Invite to this room",
"Members": "Members", "Members": "Members",
"%(count)s Members|other": "%(count)s Members",
"%(count)s Members|one": "%(count)s Member",
"Invite to this room": "Invite to this room",
"Files": "Files", "Files": "Files",
"Notifications": "Notifications", "Notifications": "Notifications",
"Rooms": "Rooms", "Rooms": "Rooms",
@ -185,6 +190,7 @@
"Search for a room": "Search for a room", "Search for a room": "Search for a room",
"#example": "#example", "#example": "#example",
"more": "more", "more": "more",
"Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room",
"Expand panel": "Expand panel", "Expand panel": "Expand panel",
"Collapse panel": "Collapse panel", "Collapse panel": "Collapse panel",
"Filter room names": "Filter room names", "Filter room names": "Filter room names",

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Add an email address above to configure email notifications", "Add an email address above to configure email notifications": "Add an email address above to configure email notifications",
"Advanced notification settings": "Advanced notification settings", "Advanced notification settings": "Advanced notification settings",
"All messages": "All messages", "All messages": "All messages",
"All messages (loud)": "All messages (loud)", "All messages (noisy)": "All messages (noisy)",
"All Rooms": "All Rooms", "All Rooms": "All Rooms",
"All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.", "All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.",
"An error occurred whilst saving your email notification preferences.": "An error occurred while saving your email notification preferences.", "An error occurred whilst saving your email notification preferences.": "An error occurred while saving your email notification preferences.",

View File

@ -1,136 +1,136 @@
{ {
"A new version of Riot is available.": "Nova versio de \"Riot\" haveblas.", "A new version of Riot is available.": "Nova versio de Riot haveblas.",
"All messages": "Ĉiuj mesaĝoj", "All messages": "Ĉiuj mesaĝoj",
"All messages (loud)": "Ĉiuj mesaĝoj (lauta)", "All messages (noisy)": "Ĉiuj mesaĝoj (lauta)",
"All Rooms": "Ĉiuj babilejoj", "All Rooms": "Ĉiuj babilejoj",
"Cancel": "Nuligi", "Cancel": "Nuligi",
"delete the alias.": "Forviŝi la kromnomon.", "delete the alias.": "forigi la kromnomon.",
"Describe your problem here.": "Priskribi vian problemon ĉi tie.", "Describe your problem here.": "Priskribu vian problemon ĉi tie.",
"Direct Chat": "Rekta babilejo", "Direct Chat": "Rekta babilo",
"Directory": "Dosierujo", "Directory": "Dosierujo",
"Dismiss": "Eksigu", "Dismiss": "Rezigni",
"Download this file": "Elŝutu ĉi-tiun dosieron", "Download this file": "Elŝuti ĉi tiun dosieron",
"#example": "#ekzemplo", "#example": "#ekzemplo",
"Files": "Dosieroj", "Files": "Dosieroj",
"Forget": "Forgesi", "Forget": "Forgesi",
"Guests can join": "Gastoj povas aliĝi", "Guests can join": "Gastoj povas aliĝi",
"I understand the risks and wish to continue": "Mi komprenas la riskonj kaj volas daŭrigi", "I understand the risks and wish to continue": "Mi komprenas la riskojn kaj volas daŭrigi",
"Invite to this room": "Inviti en ĉi tiun babilejon", "Invite to this room": "Inviti al ĉi tiu ĉambro",
"Keywords": "Ŝlosilvortoj", "Keywords": "Ŝlosilvortoj",
"Leave": "Foriri", "Leave": "Foriri",
"Low Priority": "Malalta prioritato", "Low Priority": "Malalta prioritato",
"Messages containing my display name": "Mesaĝoj enhavantaj mian vidigan nomon", "Messages containing my display name": "Mesaĝoj enhavantaj mian vidigan nomon",
"Messages containing <span>keywords</span>": "Mesaĝoj enhavantaj <span>ŝlosilovortojn</span>", "Messages containing <span>keywords</span>": "Mesaĝoj enhavantaj <span>ŝlosilovortojn</span>",
"Messages containing my user name": "Mesaĝoj enhavantaj mian uzantnomon", "Messages containing my user name": "Mesaĝoj enhavantaj mian salutnomon",
"Messages in group chats": "Mesaĝoj en grupaj babilejoj", "Messages in group chats": "Mesaĝoj en grupaj babiloj",
"Mute": "Silentigi", "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 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? Kio fakte okazis?",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Bonvolu instali <a href=\"https://www.google.com/chrome\">\"Chrome\"</a> aŭ <a href=\"https://getfirefox.com\">\"Firefox\"</a> por la plej bona sperto.", "Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Bonvolu instali <a href=\"https://www.google.com/chrome\">\"Chrome\"</a> aŭ <a href=\"https://getfirefox.com\">\"Firefox\"</a> por la plej bona sperto.",
"powered by Matrix": "funkciigata de \"Matrix\"", "powered by Matrix": "funkciigata de Matrix",
"Quote": "Citu", "Quote": "Citi",
"Reject": "Malakcepti", "Reject": "Rifuzi",
"Resend": "Resendi", "Resend": "Resendi",
"Room not found": "Babilejo ne trovita", "Room not found": "Ĉambro ne troviĝis",
"Search": "Serĉi", "Search": "Serĉi",
"Search…": "Serĉi…", "Search…": "Serĉi…",
"Search for a room": "Serĉi babilejon", "Search for a room": "Serĉi ĉambron",
"Send": "Sendi", "Send": "Sendi",
"This Room": "Ĉi tiu Babilejo", "This Room": "Ĉi tiu ĉambro",
"Add an email address above to configure email notifications": "Aldonu retadreson supre por agordi retpoŝtajn sciigojn", "Add an email address above to configure email notifications": "Aldonu retadreson supre por agordi retpoŝtajn sciigojn",
"Advanced notification settings": "Agordoj de sciigoj specialaj", "Advanced notification settings": "Specialaj agordoj de sciigoj",
"Call invitation": "Invito al voko", "Call invitation": "Invito al voko",
"All notifications are currently disabled for all targets.": "Ĉiuj sciigoj estas malvalidigitaj por ĉiu aparato.", "All notifications are currently disabled for all targets.": "Ĉiuj sciigoj nun estas malŝaltitaj por ĉiuj aparatoj.",
"An error occurred whilst saving your email notification preferences.": "Eraro okazis dum konservado de agordoj por retpoŝtaj sciigoj.", "An error occurred whilst saving your email notification preferences.": "Eraro okazis dum konservado de agordoj pri retpoŝtaj sciigoj.",
"Cancel Sending": "Nuligi sendadon", "Cancel Sending": "Nuligi sendon",
"Can't update user notification settings": "Ne eblas ĝisdatigi la agordojn de sciigoj al uzanto", "Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas",
"Changelog": "Protokolo de ŝanĝoj", "Changelog": "Protokolo de ŝanĝoj",
"Close": "Fermi", "Close": "Fermi",
"Collapse panel": "Kaŝi panelon", "Collapse panel": "Maletendi panelon",
"Collecting app version information": "Kolektante informon pri versio de la aplikaĵo", "Collecting app version information": "Kolektanta informon pri versio de la aplikaĵo",
"Collecting logs": "Kolektante protokolon", "Collecting logs": "Kolektante protokolon",
"Couldn't find a matching Matrix room": "Ne eblis trovi kongruantan ejon Matrix", "Couldn't find a matching Matrix room": "Malsukcesis trovi kongruan ĉambron en Matrix",
"Custom Server Options": "Opcioj pri personigo de servilo", "Custom Server Options": "Propraj servilaj elektoj",
"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.<br/>Tio permesas al vi uzi Riot per ekzistanta konto en alia Home servilo.<br/><br/>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.", "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.<br/>Tio permesas al vi uzi Riot per ekzistanta konto en alia Home servilo.<br/><br/>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?", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Ĉu forigi la ĉambran kromnomon %(alias)s kaj forigi %(name)s de la ujo?",
"Enable audible notifications in web client": "Ebligi aŭdeblajn sciigojn en la retkliento", "Enable audible notifications in web client": "Ŝalti aŭdeblajn sciigojn en la retkliento",
"Enable desktop notifications": "Ebligi labortablajn sciigojn", "Enable desktop notifications": "Ŝalti labortablajn sciigojn",
"Enable email notifications": "Ebligi retpoŝtajn sciigojn", "Enable email notifications": "Ŝalti retpoŝtajn sciigojn",
"Enable notifications for this account": "Ebligi sciigojn por tiu ĉi konto", "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto",
"Enable them now": "Ebligi ilin nun", "Enable them now": "Ŝalti ilin nun",
"Enter keywords separated by a comma:": "Entajpi ŝlosilvortojn apartigitaj per komoj:", "Enter keywords separated by a comma:": "Entajpu ŝlosilvortojn apartigitajn per komoj:",
"Error": "Eraro", "Error": "Eraro",
"Error saving email notification preferences": "Eraro konservante agordojn pri retpoŝtaj sciigoj", "Error saving email notification preferences": "Eraro konservante agordojn pri retpoŝtaj sciigoj",
"Expand panel": "Pli grandigi panelon", "Expand panel": "Etendi panelon",
"Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al la ejo", "Failed to add tag %(tagName)s to room": "Malsukcesis aldoni etikedon %(tagName)s al la ĉambro",
"Failed to change settings": "Malsukcesis ŝanĝi la agordojn", "Failed to change settings": "Malsukcesis ŝanĝi la agordojn",
"Failed to forget room %(errCode)s": "Malsukcesis forgesi la ejon %(errCode)s", "Failed to forget room %(errCode)s": "Malsukcesis forgesi ĉambron %(errCode)s",
"Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn", "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 protocol list from Home Server": "Malsukcesis akiri liston de protokoloj el la hejmservilo",
"Failed to get public room list": "Malsukcesis obteni la liston de publikaj ejoj", "Failed to get public room list": "Malsukcesis akiri liston de publikaj ĉambroj",
"Failed to remove tag %(tagName)s from room": "Malsukcesis forigi la etikedon %(tagName)s el la ejo", "Failed to remove tag %(tagName)s from room": "Malsukcesis forigi etikedon %(tagName)s el la ĉambro",
"Failed to send report: ": "Malsukcesis sendi raporton: ", "Failed to send report: ": "Malsukcesis sendi raporton: ",
"Failed to set direct chat tag": "Malsukcesis agordi la etikedon de rekta babilejo", "Failed to set direct chat tag": "Malsukcesis agordi la etikedon de rekta babilo",
"Failed to set Direct Message status of room": "Malsukcesis agordi la staton de Rekta Mesaĝo de la ejo", "Failed to set Direct Message status of room": "Malsukcesis agordi staton de rekta mesaĝo al la ĉambro",
"Forward Message": "Plusendi mesaĝon", "Forward Message": "Plusendi mesaĝon",
"Hide panel": "Kaŝi panelon", "Hide panel": "Kaŝi panelon",
"(HTTP status %(httpStatus)s)": "(stato HTTP %(httpStatus)s)", "(HTTP status %(httpStatus)s)": "(stato de 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:", "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", "Login": "Saluti",
"Loading bug report module": "Ŝarĝante modulon pri eraroraporto", "Loading bug report module": "Enleganta cimraportan modulon",
"Members": "Membroj", "Members": "Anoj",
"Mentions only": "Nur mencioj", "Mentions only": "Nur mencioj",
"Messages in one-to-one chats": "Mesaĝoj en unu-je-unu babilejoj", "Messages in one-to-one chats": "Mesaĝoj en duopaj babiloj",
"Messages sent by bot": "Mesaĝoj sendita per roboto", "Messages sent by bot": "Mesaĝoj senditaj per roboto",
"more": "pli", "more": "pli",
"No rooms to show": "Neniu ejo por montri", "No rooms to show": "Neniuj ĉambroj montreblas",
"Noisy": "Brua", "Noisy": "Brua",
"Notification targets": "Celo de sciigoj", "Notification targets": "Celoj de sciigoj",
"Notifications": "Sciigoj", "Notifications": "Sciigoj",
"Notifications on the following keywords follow rules which cant be displayed here:": "La sciigoj de la sekvaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:", "Notifications on the following keywords follow rules which cant be displayed here:": "La sciigoj de la jenaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:",
"Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo", "Notify for all other messages/rooms": "Sciigu min por ĉiu alia babilejo",
"Notify me for anything else": "Sciigu min por ĉio alia", "Notify me for anything else": "Sciigu min pri ĉio alia",
"Off": "Malŝaltita", "Off": "For",
"On": "Ŝaltita", "On": "Ek",
"Operation failed": "La operacio malsukcesis", "Operation failed": "Ago malsukcesis",
"Permalink": "Konstanta ligilo", "Permalink": "Konstanta ligilo",
"Please describe the bug and/or send logs.": "Bonvolu priskribi la cimon kaj/aŭ sendi protokolojn.", "Please describe the bug and/or send logs.": "Bonvolu priskribi la cimon kaj/aŭ sendi protokolojn.",
"Remove %(name)s from the directory?": "Forigi %(name)s el la dosierujo?", "Remove %(name)s from the directory?": "Ĉu forigi %(name)s de la ujo?",
"Remove": "Forigi", "Remove": "Forigi",
"remove %(name)s from the directory.": "forigi %(name)s el la dosierujo.", "remove %(name)s from the directory.": "forigi %(name)s de la ujo.",
"Remove from Directory": "Forigi el Dosierujo", "Remove from Directory": "Forigi de ujo",
"Report a bug": "Raporti cimon", "Report a bug": "Raporti cimon",
"Riot Desktop on %(platformName)s": "Riot Labortablo sur %(platformName)s", "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 does not know how to join a room on this network": "Riot ne scias aliĝi al ĉambroj 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 is not supported on mobile web. Install the app?": "Riot ne estas subtenata sur poŝkomputila reto. Ĉu 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.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uzas multajn specialajn funkciojn, el kiuj kelkaj ne disponeblas aŭ estas eksperimentaj en via nuna foliumilo.",
"Send logs": "Sendi protokolojn", "Send logs": "Sendi protokolojn",
"Source URL": "Fonta URL", "Source URL": "Fonta URL",
"Sorry, your browser is <b>not</b> able to run Riot.": "Pardonu, via retumilo <b>ne kapablas</b> funkciigi Riot.", "Sorry, your browser is <b>not</b> able to run Riot.": "Pardonu, via foliumilo <b>ne kapablas</b> funkciigi klienton 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", "The Home Server may be too old to support third party networks": "La hejmservilo povas esti tro malnova por subteni retojn de eksteraj liverantoj",
"There are advanced notifications which are not shown here": "Estas specialaj sciigoj kiuj ne estas montritaj ĉi tie", "There are advanced notifications which are not shown here": "Ekzistas specialaj sciigoj, kiuj ne montriĝas ĉi tie",
"The server may be unavailable or overloaded": "La servilo povas esti maldisponebla aŭ tro ŝarĝita", "The server may be unavailable or overloaded": "La servilo povas esti nedisponebla aŭ troŝarĝita",
"Unable to fetch notification target list": "Ne eblis obteni la liston de celoj por sciigoj", "Unable to fetch notification target list": "Malsukcesis akiri la liston de celoj por sciigoj",
"Unable to join network": "Ne eblis kuniĝi kun la reto", "Unable to join network": "Malsukcesis konektiĝi al la reto",
"Unable to look up room ID from server": "Ne eblis trovi la identigon el la servilo", "Unable to look up room ID from server": "Ĉambra identigaĵo ne akireblas de la servilo",
"Unavailable": "Maldisponebla", "Unavailable": "Nedisponebla",
"Unhide Preview": "Malkaŝi antaŭrigardon", "Unhide Preview": "Malkaŝi antaŭrigardon",
"Unknown device": "Nekonata aparato", "Unknown device": "Nekonata aparato",
"unknown error code": "kodo de nekonata eraro", "unknown error code": "nekonata kodo de eraro",
"Unnamed room": "Nekonata ejo", "Unnamed room": "Sennoma ĉambro",
"Update": "Ĝisdatigi", "Update": "Ĝisdatigi",
"Uploaded on %(date)s by %(user)s": "Alŝutita je %(date)s per %(user)s", "Uploaded on %(date)s by %(user)s": "Alŝutita je %(date)s de %(user)s",
"Uploading report": "Alŝutante raporton", "Uploading report": "Alŝutante raporton",
"View Decrypted Source": "Vidi malĉifritan fonton", "View Decrypted Source": "Vidi malĉifritan fonton",
"View Source": "Vidi fonton", "View Source": "Vidi fonton",
"What's New": "Kio novas", "What's New": "Kio novas",
"What's new?": "Kio novas?", "What's new?": "Kio novas?",
"Waiting for response from server": "Atendante respondon el la servilo", "Waiting for response from server": "Atendante respondon el la servilo",
"When I'm invited to a room": "Kiam mi estas invitita en ejon", "When I'm invited to a room": "Kiam mi estas invitita al ĉambro",
"World readable": "Legebla tutmonde", "World readable": "Legebla de ĉiuj",
"You cannot delete this image. (%(code)s)": "Vi ne povas forviŝi tiun ĉi bildon. (%(code)s)", "You cannot delete this image. (%(code)s)": "Vi ne povas forigi tiun ĉi bildon. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Vi ne povas forviŝi tiun ĉi mesaĝon. (%(code)s)", "You cannot delete this message. (%(code)s)": "Vi ne povas forigi tiun ĉi mesaĝon. (%(code)s)",
"You are not receiving desktop notifications": "Vi ne estas ricevante sciigojn labortablan", "You are not receiving desktop notifications": "Vi ne ricevadas sciigojn labortablajn",
"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", "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 alia kliento. Vi ne povas agordi ilin en Riot, sed ili ankoraŭ validas",
"Sunday": "Dimanĉo", "Sunday": "Dimanĉo",
"Monday": "Lundo", "Monday": "Lundo",
"Tuesday": "Mardo", "Tuesday": "Mardo",
@ -141,50 +141,84 @@
"Today": "Hodiaŭ", "Today": "Hodiaŭ",
"Yesterday": "Hieraŭ", "Yesterday": "Hieraŭ",
"OK": "Bone", "OK": "Bone",
"You need to be using HTTPS to place a screen-sharing call.": "Vi devas uzi HTTPS por starigi ekranan vokon.", "You need to be using HTTPS to place a screen-sharing call.": "Vi devas uzi HTTPS por ekranvidadi.",
"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!", "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 foliumilo, la aspekto kaj funkciado de la aplikaĵo povas esti tute malĝusta, kaj kelkaj aŭ ĉiu funkcioj eble ne tute funkcios. Se vi tamen volas provi, vi povas daŭrigi, sed vi ricevos nenian subtenon se vi renkontos problemojn!",
"Welcome to Riot.im": "Bonvenon al Riot.im", "Welcome to Riot.im": "Bonvenu al Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Malcentra, ĉifrita babilejo &amp; kunlaboro povigita de [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Malcentra, ĉifrita babilado &amp; kunlaboro povigita de [matrix]",
"Search the room directory": "Serĉi la ejan dosierujon", "Search the room directory": "Serĉi en la ĉambrujo",
"Chat with Riot Bot": "Babili kun la roboto Riot Bot", "Chat with Riot Bot": "Babilu kun la roboto Riot Bot",
"Get started with some tips from Riot Bot!": "Eki per sugesto de la roboto Riot Bot!", "Get started with some tips from Riot Bot!": "Komencu kun kelkaj sugestoj de la roboto Riot Bot!",
"General discussion about Matrix and Riot": "Ĝenerala diskutado pri Matrix kaj Riot", "General discussion about Matrix and Riot": "Ĝenerala diskutado pri Matrix kaj Riot",
"Discussion of all things Matrix!": "Diskutado pri ĉio rilate al Matrix!", "Discussion of all things Matrix!": "Diskutado pri ĉio rilata al Matrix!",
"Riot/Web &amp; Desktop chat": "Diskudato labortabla pri Riot/Web", "Riot/Web &amp; Desktop chat": "Babilado pri Riot ĉe reto kaj labortablo",
"Riot/iOS &amp; matrix-ios-sdk chat": "Diskutado pri Riot/iOS &amp; matrix-ios-sdk", "Riot/iOS &amp; matrix-ios-sdk chat": "Babilado pri Riot ĉe iOS kaj matrix-ios-sdk",
"Riot/Android &amp; matrix-android-sdk chat": "Diskutado pri Riot/Android &amp; matrix-android-sdk", "Riot/Android &amp; matrix-android-sdk chat": "Babilado pri Riot ĉe Android kaj matrix-android-sdk",
"Matrix technical discussions": "Teknikaj diskutoj pri Matrix", "Matrix technical discussions": "Teĥnikaj diskutoj pri Matrix",
"Running Matrix services": "Funkciigado de servoj Matrix", "Running Matrix services": "Funkciigado de servoj de Matrix",
"Community-run support for Synapse": "Komunuma subtenado de Synapse", "Community-run support for Synapse": "Komunuma subtenado de Synapse",
"Admin support for Dendrite": "Administra subtenado por Dendrite", "Admin support for Dendrite": "Administra subtenado por Dendrite",
"Announcements about Synapse releases": "Anoncoj pri eldonoj Synapse", "Announcements about Synapse releases": "Anoncoj pri eldonoj de Synapse",
"Support for those using and running matrix-appservice-irc": "Subteno por tiuj, kiuj uzas kaj funkciigas matrix-appservice-irc", "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", "Building services on Matrix": "Konstruado de servoj sur Matrix",
"Support for those using the Matrix spec": "Subteno por tiuj, kiuj uzas la specifon Matrix", "Support for those using the Matrix spec": "Subteno por tiuj, kiuj uzas la specifon de Matrix",
"Design and implementation of E2E in Matrix": "Dizajno kaj realigo de E2E en Matrix", "Design and implementation of E2E in Matrix": "Fasonado kaj realigado de ĝiscela ĉifrado en Matrix",
"Implementing VR services with Matrix": "Realigi VR-servojn per Matrix", "Implementing VR services with Matrix": "Realigado de VR-servoj en Matrix",
"Implementing VoIP services with Matrix": "Realigi VoIP-servojn per Matrix", "Implementing VoIP services with Matrix": "Realigado de VoIP-servoj en Matrix",
"Discussion of the Identity Service API": "Diskutado pri la API de Identiga Servo", "Discussion of the Identity Service API": "Diskutado pri API de la identiga servo",
"Support for those using, running and writing other bridges": "Subteno por tiuj, kiuj uzas, funkciigas kaj skribas aliajn pontojn", "Support for those using, running and writing other bridges": "Subteno por tiuj, kiuj uzas, funkciigas, aŭ evoluigas aliajn pontojn",
"Contributing code to Matrix and Riot": "Kontribui kodon al Matrix kaj Riot", "Contributing code to Matrix and Riot": "Kontribuado de kodo al Matrix kaj Riot",
"Dev chat for the Riot/Web dev team": "Programista babilado por la programteamo de Riot/Web", "Dev chat for the Riot/Web dev team": "Babilado por la programista skipo de Riot ĉe reto",
"Dev chat for the Dendrite dev team": "Programista babilado por la programteamo de Dendrite", "Dev chat for the Dendrite dev team": "Babilado por la programista skipo de Dendrite",
"Co-ordination for Riot/Web translators": "Kunordigado por tradukistoj de Riot/Web", "Co-ordination for Riot/Web translators": "Kunordigado por tradukistoj de Riot ĉe reto",
"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!", "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Multaj ĉambroj jam ekzistas en Matrix; kaj sendependaj, kaj ligitaj kun jamaj retoj (Slock, IRC, Gitter, ktp.). Rigardu la ĉambrujon!",
"Failed to change password. Is your password correct?": "Malsukcesis ŝanĝi la pasvorton. Ĉu via pasvorto pravas?", "Failed to change password. Is your password correct?": "Malsukcesis ŝanĝi la pasvorton. Ĉu via pasvorto estas ĝusta?",
"You have successfully set a password!": "Vi sukcese agordis pasvorton!", "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.", "You can now return to your account after signing out, and sign in on other devices.": "Vi nun rajtas reveni al via konto post adiaŭo, kaj saluti per ĝi kun aliaj aparatoj.",
"Continue": "Daŭrigi", "Continue": "Daŭrigi",
"Please set a password!": "Bonvolu agordi pasvorton!", "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.", "This will allow you to return to your account after signing out, and sign in on other devices.": "Tio ĉi permesos al vi reveni al via konto post adiaŭo, kaj saluti kun alia aparato.",
"You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!", "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.", "Remember, you can always set an email address in user settings if you change your mind.": "Memoru: vi ĉiam povas agordi retpoŝtadreson en viaj agordoj por uzantoj.",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s per %(browserName)s je %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s per %(browserName)s je %(osName)s",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> kaj <a href=\"http://opera.com\">Opera</a> ankaŭ funkcias.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> kaj <a href=\"http://opera.com\">Opera</a> ankaŭ funkcias.",
"Favourite": "Plej ŝatata", "Favourite": "Ŝatata",
"Fetching third party location failed": "Venigado de ekstere liverita loko malsukcesis", "Fetching third party location failed": "Malsukcesis trovi lokon de ekstera liveranto",
"Filter room names": "Filtri nomojn de ejoj", "Filter room names": "Filtri nomojn de ĉambroj",
"Warning": "Averto", "Warning": "Averto",
"Checking for an update...": "Kontrolanta por ĝisdatigo...", "Checking for an update...": "Serĉanta ĝisdatigojn…",
"No update available.": "Ĝisdatigo ne estas disponata." "No update available.": "Neniuj ĝisdatigoj haveblas.",
"Unpin Message": "Malfiksi mesaĝon",
"Rooms": "Ĉambroj",
"Show message in desktop notification": "Montradi mesaĝojn en labortablaj sciigoj",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Vi povas uzi proprajn servilajn elektojn por saluti aliajn servilojn de Matrix, per specifo de alia hejmservila URL.<br/>Tio permesas al vi uzi klienton Riot kun jama konto de Matrix en alia hejmservilo.<br/><br/>Vi ankaŭ povas agordi propran identigan servilon, sed vi ne povos inviti uzantojn per retpoŝtadreso, aŭ esti invitata per retpoŝtadreso mem.",
"Appear Offline": "Montriĝi kiel eksterreta",
"Away": "Foresta",
"To return to your account in future you need to <u>set a password</u>": "Por reveni al via konto estonte, vi devas <u>agordi pasvorton</u>",
"Set Password": "Agordi pasvorton",
"Error encountered (%(errorDetail)s).": "Eraro okazis (%(errorDetail)s).",
"Downloading update...": "Elŝutanta ĝisdatigon…",
"Bug report sent": "Cimraporto sendiĝis",
"Thank you!": "Dankon!",
"Back": "Reen",
"Send Custom Event": "Sendi propran okazon",
"You must specify an event type!": "Vi devas specifi tipon de okazo!",
"Event sent!": "Okazo sendiĝis!",
"Failed to send custom event.": "Malsukcesis sendi propran okazon.",
"Event Type": "Tipo de okazo",
"State Key": "Stata ŝlosilo",
"Event Content": "Enhavo de okazo",
"Send Account Data": "Sendi kontajn informojn",
"Filter results": "Filtri rezultojn",
"Explore Room State": "Esplori staton de ĉambro",
"Edit": "Redakti",
"Explore Account Data": "Esplori kontajn datumojn",
"Toolbox": "Ilaro",
"Developer Tools": "Evoluigiloj",
"Pin Message": "Fiksi mesaĝon",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Bonvolu instali <chromeLink>Ĥromon</chromeLink> aŭ <firefoxLink>Fajrovulpon</firefoxLink> por plej bona sperto.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Ankaŭ <safariLink>Safario</safariLink> kaj <operaLink>Opero</operaLink> funkcias.",
"Couldn't load home page": "Malsukcesis enlegi hejmpaĝon",
"Register": "Registriĝi",
"Invite to this community": "Inviti al tiu ĉi komunumo",
"Add rooms to this community": "Aldoni ĉambrojn al ĉi tiu komunumo"
} }

View File

@ -7,7 +7,7 @@
"Cancel Sending": "Cancelar envío", "Cancel Sending": "Cancelar envío",
"Can't update user notification settings": "No se puede actualizar la configuración de notificaciones del usuario", "Can't update user notification settings": "No se puede actualizar la configuración de notificaciones del usuario",
"Close": "Cerrar", "Close": "Cerrar",
"Couldn't find a matching Matrix room": "No se encontró una sala Matrix que coincidiera", "Couldn't find a matching Matrix room": "No se encontró una sala Matrix que coincida.",
"Custom Server Options": "Opciones de Servidor Personalizado", "Custom Server Options": "Opciones de Servidor Personalizado",
"customServer_text": "Puedes utilizar las opciones de servidor personalizadas para iniciar sesión en otros servidores Matrix especificando una URL de Home server distinta.<br/>Esto te permite usar Riot con una cuenta Matrix existente en un Home server distinto.<br/><br/>También puedes configurar un servidor de identidad personalizado, pero no podrás ni invitar usuarios ni ser invitado a través de tu dirección de correo electrónico.", "customServer_text": "Puedes utilizar las opciones de servidor personalizadas para iniciar sesión en otros servidores Matrix especificando una URL de Home server distinta.<br/>Esto te permite usar Riot con una cuenta Matrix existente en un Home server distinto.<br/><br/>También puedes configurar un servidor de identidad personalizado, pero no podrás ni invitar usuarios ni ser invitado a través de tu dirección de correo electrónico.",
"delete the alias.": "borrar el alias.", "delete the alias.": "borrar el alias.",
@ -72,7 +72,7 @@
"Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red", "Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red",
"Room not found": "Sala no encontrada", "Room not found": "Sala no encontrada",
"Search for a room": "Buscar sala", "Search for a room": "Buscar sala",
"Source URL": "URL de origen", "Source URL": "URL de Origen",
"The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros", "The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros",
"There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí", "There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí",
"The server may be unavailable or overloaded": "El servidor puede estar no disponible o sobrecargado", "The server may be unavailable or overloaded": "El servidor puede estar no disponible o sobrecargado",
@ -107,19 +107,19 @@
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> y <a href=\"http://opera.com\">Opera</a> también funcionan.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> y <a href=\"http://opera.com\">Opera</a> también funcionan.",
"A new version of Riot is available.": "Una nueva versión de Riot está disponible.", "A new version of Riot is available.": "Una nueva versión de Riot está disponible.",
"Cancel": "Cancelar", "Cancel": "Cancelar",
"Describe your problem here.": "Describa su problema aquí.", "Describe your problem here.": "Describe el problema aquí.",
"Forward Message": "Reenviar mensaje", "Forward Message": "Reenviar mensaje",
"Hide panel": "Ocultar panel", "Hide panel": "Ocultar panel",
"(HTTP status %(httpStatus)s)": "(estado HTTP %(httpStatus)s)", "(HTTP status %(httpStatus)s)": "(estado HTTP %(httpStatus)s)",
"I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar", "I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
"Changelog": "Registro de cambios", "Changelog": "Registro de cambios",
"Collapse panel": "Colapsar panel", "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.", "Remember, you can always set an email address in user settings if you change your mind.": "Recuerda que si es necesario puedes establecer una dirección de email en las preferencias de usuario.",
"All Rooms": "Todas las salas", "All Rooms": "Todas las salas",
"Expand panel": "Expandir panel", "Expand panel": "Expandir panel",
"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, los registros de este cliente serán enviados adjuntos a este informe de fallo. Si quisiera enviar el texto anterior solamente, entonces desmarque:", "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, los registros de este cliente serán enviados adjuntos a este informe de fallo. Si quisieras enviar el texto anterior solamente, entonces desmarca:",
"Login": "Iniciar sesión", "Login": "Iniciar sesión",
"Report a bug": "Informe de un fallo", "Report a bug": "Informar de un fallo",
"Search…": "Buscar…", "Search…": "Buscar…",
"Send": "Enviar", "Send": "Enviar",
"Send logs": "Enviar registros", "Send logs": "Enviar registros",
@ -132,10 +132,10 @@
"What's New": "Novedades", "What's New": "Novedades",
"What's new?": "¿Qué hay de nuevo?", "What's new?": "¿Qué hay de nuevo?",
"Waiting for response from server": "Esperando una respuesta del servidor", "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 and an email address!": "¡Has establecido una nueva contraseña y dirección de correo electrónico!",
"You have successfully set a password!": "¡Ha establecido exitosamente una contraseña!", "You have successfully set a password!": "¡Has establecido una nueva contraseña!",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s en %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s en %(osName)s",
"All messages (loud)": "Todos los mensajes (ruidoso)", "All messages (noisy)": "Todos los mensajes (ruidoso)",
"All notifications are currently disabled for all targets.": "Las notificaciones estan desactivadas para todos los objetivos.", "All notifications are currently disabled for all targets.": "Las notificaciones estan desactivadas para todos los objetivos.",
"Collecting app version information": "Recolectando información de la versión de la aplicación", "Collecting app version information": "Recolectando información de la versión de la aplicación",
"Collecting logs": "Recolectando registros", "Collecting logs": "Recolectando registros",
@ -145,7 +145,7 @@
"Messages containing <span>keywords</span>": "Mensajes que contienen <span>palabras clave</span>", "Messages containing <span>keywords</span>": "Mensajes que contienen <span>palabras clave</span>",
"Notify for all other messages/rooms": "Notificar para todos los demás mensajes/salas", "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. 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 describe the bug and/or send logs.": "Por favor describe el error y/o envía los registros.",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Google Chrome</a> o <a href=\"https://getfirefox.com\">Mozilla Firefox</a> para una mejor experiencia.", "Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Google Chrome</a> o <a href=\"https://getfirefox.com\">Mozilla Firefox</a> para una mejor experiencia.",
"powered by Matrix": "con el poder de Matrix", "powered by Matrix": "con el poder de Matrix",
"Riot Desktop on %(platformName)s": "Riot Desktop en %(platformName)s", "Riot Desktop on %(platformName)s": "Riot Desktop en %(platformName)s",
@ -154,7 +154,7 @@
"You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.", "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 y comportamiento 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!", "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 y comportamiento 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", "Welcome to Riot.im": "Bienvenido a Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Conversaciones &amp; colaboración cifradas y descentralizadas con el poder de [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Conversaciones cifradas y descentralizadas &amp; colaboración con el poder de [matrix]",
"Search the room directory": "Buscar en el directorio de salas", "Search the room directory": "Buscar en el directorio de salas",
"Chat with Riot Bot": "Conversar con el Bot de Riot", "Chat with Riot Bot": "Conversar con el Bot de Riot",
"Get started with some tips from Riot Bot!": "¡Comenzar con algunos consejos de Riot Bot!", "Get started with some tips from Riot Bot!": "¡Comenzar con algunos consejos de Riot Bot!",
@ -183,15 +183,43 @@
"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!", "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.", "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!", "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.", "This will allow you to return to your account after signing out, and sign in on other devices.": "Esto te permitirá regresar a tu cuenta después de cerrar sesión, así como iniciar sesión en otros dispositivos.",
"Warning": "Advertencia", "Warning": "Advertencia",
"Checking for an update...": "Comprobando actualizaciones...", "Checking for an update...": "Comprobando actualizaciones...",
"No update available.": "No hay actualizaciones disponibles.", "No update available.": "No hay actualizaciones disponibles.",
"Downloading update...": "Descargando actualizaciones...", "Downloading update...": "Descargando actualizaciones...",
"To return to your account in future you need to <u>set a password</u>": "Para regresar a su cuenta en el futuro Ud. debe <u>establecer una contraseña</u>", "To return to your account in future you need to <u>set a password</u>": "Para regresar a tu cuenta en el futuro debes <u>establecer una contraseña</u>",
"Set Password": "Establezca la contraseña", "Set Password": "Establecer contraseña",
"Error encountered (%(errorDetail)s).": "Error encontrado (%(errorDetail)s).", "Error encountered (%(errorDetail)s).": "Error encontrado (%(errorDetail)s).",
"Couldn't load home page": "No se puede cargar la página principal", "Couldn't load home page": "No se puede cargar la página principal",
"Bug report sent": "Informe de fallo enviado", "Bug report sent": "Informe de fallo enviado",
"Thank you!": "¡Gracias!" "Thank you!": "¡Gracias!",
"Show message in desktop notification": "Mostrar mensaje en la notificación del escritorio",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Puedes usar las opciones del servidor personalizado para acceder a otros servidores Matrix especificando su URL. <br/> Esto te permite usar Riot con una cuenta Matrix existente en un servidor doméstico distinto. <br/><br/>También puedes establecer un servidor de identidad personalizado pero no podrás invitar a otros usuarios usando su dirección de correo electrónico, y tampoco ser invitado por el tuyo.",
"Appear Offline": "Mostrarse Desconectado",
"Away": "Ausente",
"Back": "Atrás",
"Send Custom Event": "Enviar Evento Personalizado",
"You must specify an event type!": "Debes especificar un tipo de evento!",
"Event sent!": "Evento enviado!",
"Failed to send custom event.": "Ha fallado el envio del evento personalizado.",
"Event Type": "Tipo de Evento",
"State Key": "Clave de estado",
"Event Content": "Contenido del Evento",
"Send Account Data": "Enviar Datos de la Cuenta",
"Filter results": "Filtrar resultados",
"Explore Room State": "Explorar Estado de la Sala",
"Edit": "Editar",
"Explore Account Data": "Explorar Datos de la Cuenta",
"Toolbox": "Caja de Herramientas",
"Developer Tools": "Herramientas de Desarrollo",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Por favor instala <chromeLink>Chrome</chromeLink> o <firefoxLink>Firefox</firefoxLink> para una experiencia óptima.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> y <operaLink>Opera</operaLink> también funcionan.",
"Register": "Registro",
"Rooms": "Salas",
"Invite to this community": "Invitar a esta comunidad",
"Add rooms to this community": "Agregar salas a esta comunidad",
"Unpin Message": "Desmarcar Mensaje",
"Pin Message": "Marcar Mensaje",
"Reply": "Responder"
} }

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Gehitu e-mail helbide bat goian e-mail bidezko jakinarazpenak konfiguratzeko", "Add an email address above to configure email notifications": "Gehitu e-mail helbide bat goian e-mail bidezko jakinarazpenak konfiguratzeko",
"Advanced notification settings": "Jakinarazpen aurreratuen ezarpenak", "Advanced notification settings": "Jakinarazpen aurreratuen ezarpenak",
"All messages": "Mezu guztiak", "All messages": "Mezu guztiak",
"All messages (loud)": "Mezu guztiak (ozen)", "All messages (noisy)": "Mezu guztiak (ozen)",
"All Rooms": "Gela guztiak", "All Rooms": "Gela guztiak",
"All notifications are currently disabled for all targets.": "Une honetan jakinarazpen guztiak helburu guztietarako desgaituta daude.", "All notifications are currently disabled for all targets.": "Une honetan jakinarazpen guztiak helburu guztietarako desgaituta daude.",
"An error occurred whilst saving your email notification preferences.": "Errore bat gertatu da zure e-mail bidezko jakinarazpenen hobespenak gordetzean.", "An error occurred whilst saving your email notification preferences.": "Errore bat gertatu da zure e-mail bidezko jakinarazpenen hobespenak gordetzean.",
@ -66,12 +66,12 @@
"Low Priority": "Lehentasun baxua", "Low Priority": "Lehentasun baxua",
"Members": "Kideak", "Members": "Kideak",
"Mentions only": "Aipamenak besterik ez", "Mentions only": "Aipamenak besterik ez",
"Messages containing my display name": "Nire pantaila izena duten mezuak", "Messages containing my display name": "Nire pantaila-izena duten mezuak",
"Messages containing <span>keywords</span>": "<span>Hitz gakoak</span> dituzten mezuak", "Messages containing <span>keywords</span>": "<span>Hitz gakoak</span> dituzten mezuak",
"Messages containing my user name": "Nire erabiltzaile-izena duten mezuak", "Messages containing my user name": "Nire erabiltzaile-izena duten mezuak",
"Messages in group chats": "Talde txatetako mezuak", "Messages in group chats": "Talde txatetako mezuak",
"Messages in one-to-one chats": "Biren arteko txatetako mezuak", "Messages in one-to-one chats": "Biren arteko txatetako mezuak",
"Messages sent by bot": "botak bidalitako mezuak", "Messages sent by bot": "Botak bidalitako mezuak",
"more": "gehiago", "more": "gehiago",
"Mute": "Mututu", "Mute": "Mututu",
"No rooms to show": "Ez dago gelarik erakusteko", "No rooms to show": "Ez dago gelarik erakusteko",
@ -120,7 +120,7 @@
"Unhide Preview": "Ez ezkutatu aurrebista", "Unhide Preview": "Ez ezkutatu aurrebista",
"Unknown device": "Gailu ezezaguna", "Unknown device": "Gailu ezezaguna",
"unknown error code": "errore kode ezezaguna", "unknown error code": "errore kode ezezaguna",
"Unnamed room": "Izenik gabeko gela", "Unnamed room": "Izen gabeko gela",
"Update": "Eguneratu", "Update": "Eguneratu",
"Uploaded on %(date)s by %(user)s": "%(user)s erabiltzaileak %(date)s (e)an igota", "Uploaded on %(date)s by %(user)s": "%(user)s erabiltzaileak %(date)s (e)an igota",
"Uploading report": "Igoera txostena", "Uploading report": "Igoera txostena",
@ -130,7 +130,7 @@
"What's new?": "Zer dago berri?", "What's new?": "Zer dago berri?",
"Waiting for response from server": "Zerbitzariaren erantzunaren zain", "Waiting for response from server": "Zerbitzariaren erantzunaren zain",
"When I'm invited to a room": "Gela batetara gonbidatzen nautenean", "When I'm invited to a room": "Gela batetara gonbidatzen nautenean",
"World readable": "Denek irakurtzeko moduan", "World readable": "Munduak irakurgarria",
"You cannot delete this image. (%(code)s)": "Ezin duzu irudi hau ezabatu. (%(code)s)", "You cannot delete this image. (%(code)s)": "Ezin duzu irudi hau ezabatu. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Ezin duzu mezu hau ezabatu. (%(code)s)", "You cannot delete this message. (%(code)s)": "Ezin duzu mezu hau ezabatu. (%(code)s)",
"You are not receiving desktop notifications": "Ez dituzu mahaigaineko jakinarazpenak jasotzen", "You are not receiving desktop notifications": "Ez dituzu mahaigaineko jakinarazpenak jasotzen",
@ -193,5 +193,33 @@
"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:": "Arazoak diagnostikatzeko, bezero honen egunkariak bidaliko dira arazte-txosten honekin. Testua besterik ez baduzu bidali nahi, desmarkatu:", "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:": "Arazoak diagnostikatzeko, bezero honen egunkariak bidaliko dira arazte-txosten honekin. Testua besterik ez baduzu bidali nahi, desmarkatu:",
"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!": "Zure oraingo nabigatzailearekin aplikazioaren itxura eta portaera guztiz okerra izan daiteke, eta funtzio batzuk ez dira ibiliko. Hala ere aurrera jarraitu dezakezu saiatu nahi baduzu, baina zure erantzukizunaren menpe geratzen dira aurkitu ditzakezun arazoak!", "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!": "Zure oraingo nabigatzailearekin aplikazioaren itxura eta portaera guztiz okerra izan daiteke, eta funtzio batzuk ez dira ibiliko. Hala ere aurrera jarraitu dezakezu saiatu nahi baduzu, baina zure erantzukizunaren menpe geratzen dira aurkitu ditzakezun arazoak!",
"Bug report sent": "Arazte-txostena bidali da", "Bug report sent": "Arazte-txostena bidali da",
"Thank you!": "Eskerrik asko!" "Thank you!": "Eskerrik asko!",
"Show message in desktop notification": "Erakutsi mezua mahaigaineko jakinarazpenean",
"Appear Offline": "Agertu deskonektatuta",
"Away": "Teklatutik at",
"Back": "Atzera",
"Send Custom Event": "Bidali gertaera pertsonalizatua",
"You must specify an event type!": "Gertaera mota bat zehaztu behar duzu!",
"Event sent!": "Gertaera bidalita!",
"Failed to send custom event.": "Huts egin du gertaera pertsonalizatua bidaltzean.",
"Event Type": "Gertaera mota",
"State Key": "Egoera gakoa",
"Event Content": "Gertaeraren edukia",
"Send Account Data": "Bidali kontuaren datuak",
"Filter results": "Iragazi emaitzak",
"Explore Room State": "Miatu gelaren egoera",
"Edit": "Editatu",
"Explore Account Data": "Miatu kantuaren datuak",
"Toolbox": "Tresna-kutxa",
"Developer Tools": "Garatzaile-tresnak",
"Unpin Message": "Desfinkatu mezua",
"Pin Message": "Finkatu mezua",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Instalatu <chromeLink>Chrome</chromeLink> edo <firefoxLink>Firefox</firefoxLink> esperientzia onena izateko.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> eta <operaLink>Opera</operaLink> badabiltza ere.",
"Register": "Eman izena",
"Rooms": "Gelak",
"Invite to this community": "Gonbidatu komunitate honetara",
"Add rooms to this community": "Gehitu gelak komunitate honetara",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Zerbitzari pertsonalizatuaren aukerak erabili ditzakezu beste Matrix zerbitzarietan saioa hasteko, han beste hasiera-zerbitzari baten URLa sartuz.<br/>Horrela Riot aurretik duzun kontu batekin erabili dezakezu beste hasiera-zerbitzari batean.<br/><br/>Identitate-zerbitzari pertsonalizatu bat ezarri dezakezu ere, baina orduan ezin izango dituzu erabiltzaileak e-mail helbidea erabiliz gonbidatu, edo ezin izan izango zaituzte zu e-mail helbidea erabiliz gonbidatu.",
"Reply": "Erantzun"
} }

View File

@ -1,7 +1,7 @@
{ {
"A new version of Riot is available.": "نسخه‌ی جدید از رایوت موجود است.", "A new version of Riot is available.": "نسخه‌ی جدید از رایوت موجود است.",
"All messages": "همه‌ی پیام‌ها", "All messages": "همه‌ی پیام‌ها",
"All messages (loud)": "همه‌ی پیام‌ها(بلند)", "All messages (noisy)": "همه‌ی پیام‌ها(بلند)",
"All Rooms": "همه‌ی گپ‌ها", "All Rooms": "همه‌ی گپ‌ها",
"Cancel Sending": "فرستادن را لغو کن", "Cancel Sending": "فرستادن را لغو کن",
"Changelog": "تغییراتِ به‌وجودآمده", "Changelog": "تغییراتِ به‌وجودآمده",

View File

@ -4,7 +4,7 @@
"Add an email address above to configure email notifications": "Lisää sähköpostiosoite yllä saadaksesi ilmoituksia sähköpostiisi", "Add an email address above to configure email notifications": "Lisää sähköpostiosoite yllä saadaksesi ilmoituksia sähköpostiisi",
"Advanced notification settings": "Lisäasetukset ilmoituksille", "Advanced notification settings": "Lisäasetukset ilmoituksille",
"All messages": "Kaikki viestit", "All messages": "Kaikki viestit",
"All messages (loud)": "Kaikki viestit (äänekkäästi)", "All messages (noisy)": "Kaikki viestit (äänekkäästi)",
"All Rooms": "Kaikki huoneet", "All Rooms": "Kaikki huoneet",
"All notifications are currently disabled for all targets.": "Kaikki ilmoitukset on kytketty pois kaikilta kohteilta.", "All notifications are currently disabled for all targets.": "Kaikki ilmoitukset on kytketty pois kaikilta kohteilta.",
"An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.", "An error occurred whilst saving your email notification preferences.": "Sähköposti-ilmoitusasetuksia tallettaessa tapahtui virhe.",
@ -27,7 +27,7 @@
"Files": "Tiedostot", "Files": "Tiedostot",
"Forget": "Unohda", "Forget": "Unohda",
"I understand the risks and wish to continue": "Ymmärrän riskit ja haluan jatkaa", "I understand the risks and wish to continue": "Ymmärrän riskit ja haluan jatkaa",
"Invite to this room": "Kutsu tähän huoneeseen", "Invite to this room": "Kutsu käyttäjiä",
"Keywords": "Avainsanat", "Keywords": "Avainsanat",
"Leave": "Poistu", "Leave": "Poistu",
"Login": "Kirjaudu sisään", "Login": "Kirjaudu sisään",
@ -63,7 +63,7 @@
"Unnamed room": "Nimeämätön huone", "Unnamed room": "Nimeämätön huone",
"Update": "Päivitä", "Update": "Päivitä",
"View Source": "Näytä lähde", "View Source": "Näytä lähde",
"Waiting for response from server": "Odotetaan palvelimen vastausta", "Waiting for response from server": "Odotetaan vastausta palvelimelta",
"Monday": "Maanantai", "Monday": "Maanantai",
"Tuesday": "Tiistai", "Tuesday": "Tiistai",
"Wednesday": "Keskiviikko", "Wednesday": "Keskiviikko",
@ -72,20 +72,20 @@
"Saturday": "Lauantai", "Saturday": "Lauantai",
"Today": "Tänään", "Today": "Tänään",
"Yesterday": "Eilen", "Yesterday": "Eilen",
"OK": "Selvä", "OK": "OK",
"Warning": "Varoitus", "Warning": "Varoitus",
"Checking for an update...": "Tarkistetaan päivityksen saatavuutta...", "Checking for an update...": "Tarkistetaan päivityksen saatavuutta...",
"No update available.": "Ei päivityksiä saatavilla.", "No update available.": "Ei päivityksiä saatavilla.",
"Downloading update...": "Ladataan päivitystä...", "Downloading update...": "Ladataan päivitystä...",
"Welcome to Riot.im": "Tervetuloa Riot.im:ään", "Welcome to Riot.im": "Tervetuloa Riot.im -palveluun",
"Search the room directory": "Hae huonehakemistosta", "Search the room directory": "Hae hakemistosta",
"Continue": "Jatka", "Continue": "Jatka",
"Set Password": "Aseta salasana", "Set Password": "Aseta salasana",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> ja <a href=\"http://opera.com\">Opera</a> toimivat myös.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> ja <a href=\"http://opera.com\">Opera</a> toimivat myös.",
"Collapse panel": "Piilota paneeli", "Collapse panel": "Piilota paneeli",
"Collecting app version information": "Kerätään sovelluksen versiotietoja", "Collecting app version information": "Haetaan versiotietoja",
"Collecting logs": "Kerätään lokitietoja", "Collecting logs": "Haetaan lokitietoja",
"Custom Server Options": "Omat palvelinasetukset", "Custom Server Options": "Palvelinasetukset",
"customServer_text": "Voit käyttää palvelinasetuksia muille Matrix-palvelimille kirjautumiseen asettamalla oman kotipalvelinosoitteen.<br/>Näin voit käyttää Riotia toisella kotipalvelimella sijaitsevan Matrix-käyttäjän kanssa. <br/><br/>Voit myös asettaa oman tunnistautumispalvelimen, mutta sinua ei voi kutsua etkä voi kutsua muita sähköpostiosoitteella.", "customServer_text": "Voit käyttää palvelinasetuksia muille Matrix-palvelimille kirjautumiseen asettamalla oman kotipalvelinosoitteen.<br/>Näin voit käyttää Riotia toisella kotipalvelimella sijaitsevan Matrix-käyttäjän kanssa. <br/><br/>Voit myös asettaa oman tunnistautumispalvelimen, mutta sinua ei voi kutsua etkä voi kutsua muita sähköpostiosoitteella.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Poista huonetunnus %(alias)s ja poista %(name)s hakemistosta?", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Poista huonetunnus %(alias)s ja poista %(name)s hakemistosta?",
"Enable them now": "Ota käyttöön nyt", "Enable them now": "Ota käyttöön nyt",
@ -95,7 +95,7 @@
"Failed to change settings": "Asetusten muuttaminen epäonnistui", "Failed to change settings": "Asetusten muuttaminen epäonnistui",
"Failed to forget room %(errCode)s": "Huoneen unohtaminen epäonnistui %(errCode)s", "Failed to forget room %(errCode)s": "Huoneen unohtaminen epäonnistui %(errCode)s",
"Failed to update keywords": "Avainsanojen päivittäminen epäonnistui", "Failed to update keywords": "Avainsanojen päivittäminen epäonnistui",
"Enable audible notifications in web client": "Ota käyttöön äänelliset ilmoitukset webasiakasohjelmassa", "Enable audible notifications in web client": "Ota käyttöön äänelliset ilmoitukset",
"Enable desktop notifications": "Ota käyttöön työpöytäilmoitukset", "Enable desktop notifications": "Ota käyttöön työpöytäilmoitukset",
"Enable email notifications": "Ota käyttöön sähköposti-ilmoitukset", "Enable email notifications": "Ota käyttöön sähköposti-ilmoitukset",
"Enable notifications for this account": "Ota käyttöön ilmoitukset tälle tilille", "Enable notifications for this account": "Ota käyttöön ilmoitukset tälle tilille",
@ -106,15 +106,15 @@
"Failed to send report: ": "Raportin lähettäminen epäonnistui: ", "Failed to send report: ": "Raportin lähettäminen epäonnistui: ",
"Failed to set direct chat tag": "Suoran viestittelyn tagin asettaminen epäonnistui", "Failed to set direct chat tag": "Suoran viestittelyn tagin asettaminen epäonnistui",
"Fetching third party location failed": "Kolmannen osapuolen paikan haku epäonnistui", "Fetching third party location failed": "Kolmannen osapuolen paikan haku epäonnistui",
"Filter room names": "Suodata huoneiden nimet", "Filter room names": "Suodata",
"Forward Message": "Edelleenlähetä viesti", "Forward Message": "Edelleenlähetä viesti",
"Guests can join": "Vieraat voivat liittyä", "Guests can join": "Vieraat voivat liittyä",
"Hide panel": "Piilota paneeli", "Hide panel": "Piilota paneeli",
"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:": "Diagnoosin helpottamiseksi lokitietoja tältä laitteelta lähetetään tämän bugiraportin mukana. Poista ruksi jos haluat lätettää vain ylläolevan tekstin:", "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:": "Diagnoosin helpottamiseksi lokitietoja tältä laitteelta lähetetään tämän bugiraportin mukana. Poista ruksi jos haluat lätettää vain ylläolevan tekstin:",
"Loading bug report module": "Ladataan bugiraportointimoduuli", "Loading bug report module": "Ladataan bugiraportointimoduuli",
"Messages containing my display name": "Näyttönimeni sisältävät viestit", "Messages containing my display name": "Viestit joissa mainitaan nimimerkkini",
"Messages containing <span>keywords</span>": "<span>Avainsanoja</span> sisältävät viestit", "Messages containing <span>keywords</span>": "<span>Avainsanoja</span> sisältävät viestit",
"Messages containing my user name": "Käyttäjänimeni sisältävät viestit", "Messages containing my user name": "Viestit joissa mainitaan käyttäjänimeni",
"Messages in group chats": "Viestit ryhmäkeskusteluissa", "Messages in group chats": "Viestit ryhmäkeskusteluissa",
"Messages in one-to-one chats": "Viestit henkilökohtaisissa keskusteluissa", "Messages in one-to-one chats": "Viestit henkilökohtaisissa keskusteluissa",
"Messages sent by bot": "Bottien lähettämät viestit", "Messages sent by bot": "Bottien lähettämät viestit",
@ -127,7 +127,7 @@
"Remove %(name)s from the directory?": "Poista %(name)s hakemistosta?", "Remove %(name)s from the directory?": "Poista %(name)s hakemistosta?",
"remove %(name)s from the directory.": "poista %(name)s hakemistosta.", "remove %(name)s from the directory.": "poista %(name)s hakemistosta.",
"Remove from Directory": "Poista hakemistosta", "Remove from Directory": "Poista hakemistosta",
"Riot Desktop on %(platformName)s": "Riot Desktop järjestelmällä %(platformName)s", "Riot Desktop on %(platformName)s": "Riot Desktop %(platformName)s",
"Riot does not know how to join a room on this network": "Riot ei tiedä miten liittya huoneeseen tässä verkossa", "Riot does not know how to join a room on this network": "Riot ei tiedä miten liittya huoneeseen tässä verkossa",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot käyttää monia selainominaisuuksia, joista osa selaimesi ei tue tai ne ovat kokeellisia.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot käyttää monia selainominaisuuksia, joista osa selaimesi ei tue tai ne ovat kokeellisia.",
"Sorry, your browser is <b>not</b> able to run Riot.": "Valitettavasti Riot <b>ei</b> toimi selaimessasi.", "Sorry, your browser is <b>not</b> able to run Riot.": "Valitettavasti Riot <b>ei</b> toimi selaimessasi.",
@ -137,7 +137,7 @@
"Unable to look up room ID from server": "Huone-ID:n haku palvelimelta epäonnistui", "Unable to look up room ID from server": "Huone-ID:n haku palvelimelta epäonnistui",
"Unhide Preview": "Näytä ennakkokatselu", "Unhide Preview": "Näytä ennakkokatselu",
"Uploaded on %(date)s by %(user)s": "Ladattu %(date)s käyttäjän %(user)s toimesta", "Uploaded on %(date)s by %(user)s": "Ladattu %(date)s käyttäjän %(user)s toimesta",
"Uploading report": "Ladataan raportti", "Uploading report": "Ladataan raporttia",
"View Decrypted Source": "Näytä purettu lähdekoodi", "View Decrypted Source": "Näytä purettu lähdekoodi",
"What's New": "Mikä on uutta", "What's New": "Mikä on uutta",
"What's new?": "Mikä on uutta?", "What's new?": "Mikä on uutta?",
@ -147,23 +147,23 @@
"You cannot delete this message. (%(code)s)": "Et voi poistaa tätä viestiä. (%(code)s)", "You cannot delete this message. (%(code)s)": "Et voi poistaa tätä viestiä. (%(code)s)",
"You are not receiving desktop notifications": "Et vastaanota työpöytäilmoituksia", "You are not receiving desktop notifications": "Et vastaanota työpöytäilmoituksia",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Olet saattanut muuttaa niitä toisessa asiakasohjelmassa kuin Riot. Et voi muuttaa niitä Riotissa mutta ne pätevät kuitenkin", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Olet saattanut muuttaa niitä toisessa asiakasohjelmassa kuin Riot. Et voi muuttaa niitä Riotissa mutta ne pätevät kuitenkin",
"You need to be using HTTPS to place a screen-sharing call.": "Sinun täytyy käyttää HTTPS:ää voidaaksesi soittaa ruudunjakopuhelun.", "You need to be using HTTPS to place a screen-sharing call.": "Sinun täytyy käyttää HTTPS -yhteyttä, jotta voit jakaa ruudun.",
"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!": "Nykyisellä selaimellasi ohjelman ulkonäkö voi olla aivan virheellinen, ja jotkut ominaisuudet eivät saata toimia. Voit jatkaa jos haluat kokeilla mutta et voi odottaa saavasi apua mahdollisesti ilmeneviin ongelmiin!", "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!": "Nykyisellä selaimellasi ohjelman ulkonäkö voi olla aivan virheellinen, ja jotkut ominaisuudet eivät saata toimia. Voit jatkaa jos haluat kokeilla mutta et voi odottaa saavasi apua mahdollisesti ilmeneviin ongelmiin!",
"Chat with Riot Bot": "Keskustele Riot-botin kanssa", "Chat with Riot Bot": "Keskustele Riot Botin kanssa",
"Get started with some tips from Riot Bot!": "Pääse käyntiin Riot-botin vinkkien avulla!", "Get started with some tips from Riot Bot!": "Aloita Riot Botin vinkkien avulla!",
"General discussion about Matrix and Riot": "Yleistä Matrix- ja Riot-keskustelua", "General discussion about Matrix and Riot": "Matrix- ja Riot keskustelut",
"Discussion of all things Matrix!": "Keskustelu kaikesta Matrixiin liittyvästä!", "Discussion of all things Matrix!": "Keskustelu kaikesta Matrixiin liittyvästä!",
"Riot/Web &amp; Desktop chat": "Riot/Web & Työpöytä-keskustelu", "Riot/Web &amp; Desktop chat": "Riot/Web & Työpöytä-keskustelu",
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; matrix-ios-sdk -keskustelu", "Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS &amp; matrix-ios-sdk -keskustelu",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; matrix-android-sdk -keskustelu", "Riot/Android &amp; matrix-android-sdk chat": "Riot/Android &amp; matrix-android-sdk -keskustelu",
"Matrix technical discussions": "Matrix tekniset keskustelut", "Matrix technical discussions": "Tekniset keskustelut",
"Running Matrix services": "Matrix-palvelujen ylläpito", "Running Matrix services": "Matrix-palvelujen ylläpito",
"Community-run support for Synapse": "Yhteisön tarjoama Synapse-tuki", "Community-run support for Synapse": "Yhteisön tarjoama Synapse-tuki",
"Admin support for Dendrite": "Dendrite ylläpitotuki", "Admin support for Dendrite": "Dendrite ylläpitotuki",
"Announcements about Synapse releases": "Ilmoitukset uusista Synapse-julkaisuista", "Announcements about Synapse releases": "Ilmoitukset uusista Synapse-julkaisuista",
"Error encountered (%(errorDetail)s).": "Virhe: %(errorDetail)s.", "Error encountered (%(errorDetail)s).": "Virhe: %(errorDetail)s.",
"Support for those using and running matrix-appservice-irc": "Tuki niille jotka käyttävät ja ajavat matrix-appservice-irc", "Support for those using and running matrix-appservice-irc": "Tuki niille jotka käyttävät ja ajavat matrix-appservice-irc",
"Building services on Matrix": "Palvelujen rakentaminen Matrixin avulla", "Building services on Matrix": "Palveluiden rakentaminen Matrixin avulla",
"Support for those using the Matrix spec": "Tuki Matrix-spesifikaation käyttäjille", "Support for those using the Matrix spec": "Tuki Matrix-spesifikaation käyttäjille",
"Implementing VR services with Matrix": "VR-palvelujen implementointi Matrixin avulla", "Implementing VR services with Matrix": "VR-palvelujen implementointi Matrixin avulla",
"Implementing VoIP services with Matrix": "VoIP-palvelujen implementointi Matrixin avulla", "Implementing VoIP services with Matrix": "VoIP-palvelujen implementointi Matrixin avulla",
@ -172,7 +172,7 @@
"Dev chat for the Riot/Web dev team": "Kehittäjäkeskustelu Riot/Web kehitystiimille", "Dev chat for the Riot/Web dev team": "Kehittäjäkeskustelu Riot/Web kehitystiimille",
"Dev chat for the Dendrite dev team": "Kehittäjäkeskustelu Dendrite kehitystiimille", "Dev chat for the Dendrite dev team": "Kehittäjäkeskustelu Dendrite kehitystiimille",
"Co-ordination for Riot/Web translators": "Riot/Web kääntäjien koordinointi", "Co-ordination for Riot/Web translators": "Riot/Web kääntäjien koordinointi",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Matrixissa on jo olemassa monia huoneita jotka on linkitetty olemassa oleviin verkkoihin (Slack, IRC, Gitter, jne) tai itsenäisiin. Tutustu hakemistoon!", "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Matrixissa on olemassa monia huoneita, jotka on linkitetty olemassa oleviin verkkoihin (Slack, IRC, Gitter yms.). Tutustu hakemistoon!",
"Failed to change password. Is your password correct?": "Salasanan muuttaminen epäonnistui. Onko salasanasi oikein?", "Failed to change password. Is your password correct?": "Salasanan muuttaminen epäonnistui. Onko salasanasi oikein?",
"You have successfully set a password!": "Olet onnistuneesti asettanut salasanan!", "You have successfully set a password!": "Olet onnistuneesti asettanut salasanan!",
"You can now return to your account after signing out, and sign in on other devices.": "Voit nyt palata tilillesi kirjauduttua ulos, sekä kirjautua muilla laitteilla.", "You can now return to your account after signing out, and sign in on other devices.": "Voit nyt palata tilillesi kirjauduttua ulos, sekä kirjautua muilla laitteilla.",
@ -186,24 +186,40 @@
"Failed to set Direct Message status of room": "Huoneen suoran viestittelyn tilan asettaminen epäonnistui", "Failed to set Direct Message status of room": "Huoneen suoran viestittelyn tilan asettaminen epäonnistui",
"(HTTP status %(httpStatus)s)": "(HTTP tila %(httpStatus)s)", "(HTTP status %(httpStatus)s)": "(HTTP tila %(httpStatus)s)",
"Notify for all other messages/rooms": "Ilmoita kaikista muista viesteistä/huoneista", "Notify for all other messages/rooms": "Ilmoita kaikista muista viesteistä/huoneista",
"powered by Matrix": "Matrix-pohjainen", "powered by Matrix": "Matrix",
"Riot is not supported on mobile web. Install the app?": "Riot ei tue mobiiliselaimia. Asenna sovellus?", "Riot is not supported on mobile web. Install the app?": "Riot ei tue laitettasi. Asenna mobiilisovellus?",
"Thank you!": "Kiitos!", "Thank you!": "Kiitos!",
"Design and implementation of E2E in Matrix": "Matrix päästä-päähän salauksen suunnittelu ja implementointi", "Design and implementation of E2E in Matrix": "Matrix päästä-päähän salauksen suunnittelu ja implementointi",
"Contributing code to Matrix and Riot": "Osallistu Matrix ja Riot kehitykseen", "Contributing code to Matrix and Riot": "Osallistu kehitystyöhön",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s selaimella %(browserName)s käyttöjärjestelmällä %(osName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(appName)s %(browserName)s %(osName)s",
"There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä", "There are advanced notifications which are not shown here": "On kehittyneitä ilmoituksia joita ei näytetä tässä",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Matrix-pohjainen hajautettu, salattu viestittely ja yhteistyö", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Salattua ja vikasietoista viestintää Matrix -teknologialla",
"Back": "Palaa", "Back": "Takaisin",
"Developer Tools": "Kehitystyökalut", "Developer Tools": "Kehitystila",
"Failed to send custom event.": "Kustomoidun tapahtuman lähettäminen epäonnistui.", "Failed to send custom event.": "Kustomoidun tapahtuman lähettäminen epäonnistui.",
"Filter results": "Suodata tuloksia", "Filter results": "Suodata",
"Send Custom Event": "Lähetä kustomoitu tapahtuma", "Send Custom Event": "Lähetä kustomoitu tapahtuma",
"Send Custom State Event": "Lähetä kustomoitu tilatapahtuma", "Send Custom State Event": "Lähetä kustomoitu tilatapahtuma",
"Explore Room State": "Tutki huoneen tilaa", "Explore Room State": "Huoneen tila",
"You must specify an event type!": "Sinun on määritettävä tapahtuman tyyppi!", "You must specify an event type!": "Sinun on määritettävä tapahtuman tyyppi!",
"Event sent!": "Tapahtuma lähetetty!", "Event sent!": "Tapahtuma lähetetty!",
"Event Type": "Tapahtuman tyyppi", "Event Type": "Tapahtuman tyyppi",
"Event Content": "Tapahtuman sisältö", "Event Content": "Tapahtuman sisältö",
"State Key": "Tila-avain" "State Key": "Tila-avain",
"Show message in desktop notification": "Näytä viestit ilmoituskeskuksessa",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Voit käyttää edistyksellisiä asetuksia kirjautuaksesi muille Matrix palvelimille, määrittelemällä kotipalvelimen URL-osoitteen.<br/>Tämän avulla voit käyttää Riot:ia olemassa olevalla toisen Matrix palvelimen käyttäjätilillä.<br/><br/>Voit myös asettaa valinnaisen identiteettipalvelimen, mutta et voi kutsua käyttäjiä sähköpostiosoitteella tai tulla kutsutuksi.",
"Appear Offline": "Offline-tila",
"Away": "Poissa",
"Send Account Data": "Lähetä tilin tiedot",
"Edit": "Muokkaa",
"Explore Account Data": "Tilitiedot",
"Toolbox": "Työkalut",
"Unpin Message": "Poista viestin kiinnitys",
"Pin Message": "Kiinnitä viesti",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Asenna <chromeLink>Chrome</chromeLink> tai <firefoxLink>Firefox</firefoxLink> parhaan käyttökokemuksen saavuttamiseksi.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> ja <operaLink>Opera</operaLink> ovat myös tuettuja.",
"Register": "Rekisteröidy",
"Rooms": "Huoneet",
"Invite to this community": "Kutsu käyttäjiä",
"Add rooms to this community": "Lisää huoneita yhteisöön"
} }

View File

@ -1,7 +1,7 @@
{ {
"Add an email address above to configure email notifications": "Ajouter une adresse e-mail pour la configuration des notifications par e-mail", "Add an email address above to configure email notifications": "Ajouter une adresse e-mail pour la configuration des notifications par e-mail",
"All messages": "Tous les messages", "All messages": "Tous les messages",
"All messages (loud)": "Tous les messages (fort)", "All messages (noisy)": "Tous les messages (fort)",
"All notifications are currently disabled for all targets.": "Toutes les notifications sont désactivées pour tous les appareils.", "All notifications are currently disabled for all targets.": "Toutes les notifications sont désactivées pour tous les appareils.",
"An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notification par e-mail.", "An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notification par e-mail.",
"Cancel Sending": "Annuler l'envoi", "Cancel Sending": "Annuler l'envoi",
@ -217,5 +217,10 @@
"Invite to this community": "Inviter à cette communauté", "Invite to this community": "Inviter à cette communauté",
"Toolbox": "Boîte à outils", "Toolbox": "Boîte à outils",
"Send Account Data": "Envoyer les données du compte", "Send Account Data": "Envoyer les données du compte",
"Explore Account Data": "Explorer les données du compte" "Explore Account Data": "Explorer les données du compte",
"Appear Offline": "Apparaître Hors ligne",
"Away": "Absent",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Veuillez installer <chromeLink>Chrome</chromeLink> ou <firefoxLink>Firefox</firefoxLink> pour une expérience optimale.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> et <operaLink>Opera</operaLink> fonctionnent également.",
"Reply": "Répondre"
} }

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Engada un enderezo de correo electrónico para configurar as notificacións", "Add an email address above to configure email notifications": "Engada un enderezo de correo electrónico para configurar as notificacións",
"Advanced notification settings": "Axustes avanzados de notificación", "Advanced notification settings": "Axustes avanzados de notificación",
"All messages": "Todas as mensaxes", "All messages": "Todas as mensaxes",
"All messages (loud)": "Todas as mensaxes (alto)", "All messages (noisy)": "Todas as mensaxes (alto)",
"All Rooms": "Todas as Salas", "All Rooms": "Todas as Salas",
"All notifications are currently disabled for all targets.": "Todas as notificacións están deshabilitadas para todos os destinos.", "All notifications are currently disabled for all targets.": "Todas as notificacións están deshabilitadas para todos os destinos.",
"An error occurred whilst saving your email notification preferences.": "Algo fallou mentras se gardaban as súas preferencias de notificaicón.", "An error occurred whilst saving your email notification preferences.": "Algo fallou mentras se gardaban as súas preferencias de notificaicón.",
@ -21,7 +21,7 @@
"Collecting app version information": "Obtendo información sobre a versión da app", "Collecting app version information": "Obtendo información sobre a versión da app",
"Collecting logs": "Obtendo rexistros", "Collecting logs": "Obtendo rexistros",
"Couldn't find a matching Matrix room": "Non coincide con ningunha sala de Matrix", "Couldn't find a matching Matrix room": "Non coincide con ningunha sala de Matrix",
"Custom Server Options": "Axustes do servidor personalizado", "Custom Server Options": "Opcións personalizadas do servidor",
"customServer_text": "Pode utilizar os axustes do servidor personalizado para conectarse a outros servidores Matrix indicando un URL de Inicio do servidor.<br/>Esto permítelle utilizar Riot con unha conta existente de Matrix nun servidor diferente.<br/><br/>Tamén pode establecer un servidor personalizado de identidade mais non poderá invitar a usuarias a través de enderezos de correo ou ser vostede invitada do mesmo xeito.", "customServer_text": "Pode utilizar os axustes do servidor personalizado para conectarse a outros servidores Matrix indicando un URL de Inicio do servidor.<br/>Esto permítelle utilizar Riot con unha conta existente de Matrix nun servidor diferente.<br/><br/>Tamén pode establecer un servidor personalizado de identidade mais non poderá invitar a usuarias a través de enderezos de correo ou ser vostede invitada do mesmo xeito.",
"delete the alias.": "borrar alcume.", "delete the alias.": "borrar alcume.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?", "Delete the room alias %(alias)s and remove %(name)s from the directory?": "Eliminar o alcume da sala %(alias)s e borrar %(name)s do directorio?",
@ -29,7 +29,7 @@
"Developer Tools": "Ferramentas para desenvolver", "Developer Tools": "Ferramentas para desenvolver",
"Direct Chat": "Chat directo", "Direct Chat": "Chat directo",
"Directory": "Directorio", "Directory": "Directorio",
"Dismiss": "Desbotar", "Dismiss": "Rexeitar",
"Download this file": "Descargue este ficheiro", "Download this file": "Descargue este ficheiro",
"Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web", "Enable audible notifications in web client": "Habilitar notificacións audibles no cliente web",
"Enable desktop notifications": "Habilitar notificacións de escritorio", "Enable desktop notifications": "Habilitar notificacións de escritorio",
@ -43,7 +43,7 @@
"Expand panel": "Expandir panel", "Expand panel": "Expandir panel",
"Failed to add tag %(tagName)s to room": "Fallou ao engadir a etiqueta %(tagName)s a sala", "Failed to add tag %(tagName)s to room": "Fallou ao engadir a etiqueta %(tagName)s a sala",
"Failed to change settings": "Fallo ao cambiar os axustes", "Failed to change settings": "Fallo ao cambiar os axustes",
"Failed to forget room %(errCode)s": "Fallou ao esquecer a sala %(errCode)s", "Failed to forget room %(errCode)s": "Fallo ao esquecer sala %(errCode)s",
"Failed to update keywords": "Fallo ao actualizar as palabras chave", "Failed to update keywords": "Fallo ao actualizar as palabras chave",
"Failed to get protocol list from Home Server": "Fallo ao obter a lista de protocolo desde o servidor", "Failed to get protocol list from Home Server": "Fallo ao obter a lista de protocolo desde o servidor",
"Failed to get public room list": "Fallo ao obter a lista de salas públicas", "Failed to get public room list": "Fallo ao obter a lista de salas públicas",
@ -52,14 +52,14 @@
"Failed to send report: ": "Fallo no envío do informe: ", "Failed to send report: ": "Fallo no envío do informe: ",
"Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo", "Failed to set direct chat tag": "Fallo ao establecer etiqueta do chat directo",
"Failed to set Direct Message status of room": "Fallo ao establecer o estado Mensaxe Directa da sala", "Failed to set Direct Message status of room": "Fallo ao establecer o estado Mensaxe Directa da sala",
"Favourite": "Favorito", "Favourite": "Favorita",
"Fetching third party location failed": "Fallo ao obter a localización de terceiros", "Fetching third party location failed": "Fallo ao obter a localización de terceiros",
"Files": "Ficheiros", "Files": "Ficheiros",
"Filter results": "Filtrar resultados", "Filter results": "Filtrar resultados",
"Filter room names": "Filtrar nomes de sala", "Filter room names": "Filtrar nomes de sala",
"Forget": "Esquecer", "Forget": "Esquecer",
"Forward Message": "Reenviar mensaxe", "Forward Message": "Reenviar mensaxe",
"Guests can join": "Convidadas pódense unir", "Guests can join": "Convidados pódense unir",
"Hide panel": "Agochar panel", "Hide panel": "Agochar panel",
"(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)", "(HTTP status %(httpStatus)s)": "(Estado HTTP %(httpStatus)s)",
"I understand the risks and wish to continue": "Entendos os riscos e desexo continuar", "I understand the risks and wish to continue": "Entendos os riscos e desexo continuar",
@ -79,8 +79,8 @@
"Messages in one-to-one chats": "Mensaxes en chats un-a-un", "Messages in one-to-one chats": "Mensaxes en chats un-a-un",
"Messages sent by bot": "Mensaxes enviadas por bot", "Messages sent by bot": "Mensaxes enviadas por bot",
"more": "máis", "more": "máis",
"Mute": "Calar", "Mute": "Acalar",
"No rooms to show": "Non hai salas que mostrar", "No rooms to show": "Sen salas que mostrar",
"Noisy": "Ruidoso", "Noisy": "Ruidoso",
"Notification targets": "Obxetivos das notificacións", "Notification targets": "Obxetivos das notificacións",
"Notifications": "Notificacións", "Notifications": "Notificacións",
@ -94,7 +94,7 @@
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Por favor describa a incidencia. Que estaba a facer? Que tiña que pasar? Que aconteceu en realidade?", "Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Por favor describa a incidencia. Que estaba a facer? Que tiña que pasar? Que aconteceu en realidade?",
"Please describe the bug and/or send logs.": "Por favor describa a incidencia e/ou envíe o informe.", "Please describe the bug and/or send logs.": "Por favor describa a incidencia e/ou envíe o informe.",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Chrome</a> ou <a href=\"https://getfirefox.com\">Firefox</a> para ter a mellor experiencia de uso.", "Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Chrome</a> ou <a href=\"https://getfirefox.com\">Firefox</a> para ter a mellor experiencia de uso.",
"powered by Matrix": "funcionando grazas a Matrix", "powered by Matrix": "funciona grazas a Matrix",
"Quote": "Cita", "Quote": "Cita",
"Reject": "Rexeitar", "Reject": "Rexeitar",
"Remove %(name)s from the directory?": "Eliminar %(name)s do directorio?", "Remove %(name)s from the directory?": "Eliminar %(name)s do directorio?",
@ -108,7 +108,7 @@
"Riot is not supported on mobile web. Install the app?": "Riot no se pode executar na web móbil. Instalar a app?", "Riot is not supported on mobile web. Install the app?": "Riot no se pode executar na web móbil. Instalar a app?",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentales no seu navegador actual.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utiliza características avanzadas do navegador, algunhas das cales non están dispoñibles ou son experimentales no seu navegador actual.",
"Room not found": "Non se atopou a sala", "Room not found": "Non se atopou a sala",
"Search": "Buscar", "Search": "Busca",
"Search…": "Buscar…", "Search…": "Buscar…",
"Search for a room": "Buscar unha sala", "Search for a room": "Buscar unha sala",
"Send": "Enviar", "Send": "Enviar",
@ -128,7 +128,7 @@
"Unavailable": "Non dispoñible", "Unavailable": "Non dispoñible",
"Unhide Preview": "Desagochar a vista previsa", "Unhide Preview": "Desagochar a vista previsa",
"Unknown device": "Dispositivo descoñecido", "Unknown device": "Dispositivo descoñecido",
"unknown error code": "código de erro descoñecido", "unknown error code": "código de fallo descoñecido",
"Unnamed room": "Sala sen nome", "Unnamed room": "Sala sen nome",
"Update": "Actualizar", "Update": "Actualizar",
"Uploaded on %(date)s by %(user)s": "Subido a %(date)s por %(user)s", "Uploaded on %(date)s by %(user)s": "Subido a %(date)s por %(user)s",
@ -139,7 +139,7 @@
"What's new?": "Qué hai de novo?", "What's new?": "Qué hai de novo?",
"Waiting for response from server": "Agardando pola resposta do servidor", "Waiting for response from server": "Agardando pola resposta do servidor",
"When I'm invited to a room": "Cando son convidado a unha sala", "When I'm invited to a room": "Cando son convidado a unha sala",
"World readable": "Visible por todo o mundo", "World readable": "Visible por todos",
"You cannot delete this image. (%(code)s)": "Non pode eliminar esta imaxe. (%(code)s)", "You cannot delete this image. (%(code)s)": "Non pode eliminar esta imaxe. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Non pode eliminar esta mensaxe. (%(code)s)", "You cannot delete this message. (%(code)s)": "Non pode eliminar esta mensaxe. (%(code)s)",
"You are not receiving desktop notifications": "Non está a recibir notificacións de escritorio", "You are not receiving desktop notifications": "Non está a recibir notificacións de escritorio",
@ -193,7 +193,7 @@
"Dev chat for the Dendrite dev team": "Chat para o equipo de desenvolvemento de Dendrite", "Dev chat for the Dendrite dev team": "Chat para o equipo de desenvolvemento de Dendrite",
"Co-ordination for Riot/Web translators": "Coordinación para tradutores de Riot/Web", "Co-ordination for Riot/Web translators": "Coordinación para tradutores de Riot/Web",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Xa existen multitude de salas en Matrix, ligadas a redes existentes (Slack, IRC, Gitter etc) ou independentes. Busque no directorio!", "Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Xa existen multitude de salas en Matrix, ligadas a redes existentes (Slack, IRC, Gitter etc) ou independentes. Busque no directorio!",
"Failed to change password. Is your password correct?": "Non se mudou o contrasinal. É correcto o contrasinal introducido?", "Failed to change password. Is your password correct?": "Fallo ao cambiar o contrasinal. É correcto o contrasinal?",
"You have successfully set a password!": "Mudou con éxito o seu contrasinal!", "You have successfully set a password!": "Mudou con éxito o seu contrasinal!",
"You can now return to your account after signing out, and sign in on other devices.": "Pode voltar a súa contra tras desconectarse, e conectarse en outros dispositivos.", "You can now return to your account after signing out, and sign in on other devices.": "Pode voltar a súa contra tras desconectarse, e conectarse en outros dispositivos.",
"Continue": "Continuar", "Continue": "Continuar",
@ -212,10 +212,15 @@
"Edit": "Editar", "Edit": "Editar",
"Send Account Data": "Enviar datos da conta", "Send Account Data": "Enviar datos da conta",
"Explore Account Data": "Explorar datos da conta", "Explore Account Data": "Explorar datos da conta",
"Unpin Message": "Non fixar mensaxe", "Unpin Message": "Desfixar mensaxe",
"Pin Message": "Fixar mensaxe", "Pin Message": "Fixar mensaxe",
"Register": "Rexistrar", "Register": "Rexistar",
"Rooms": "Salas", "Rooms": "Salas",
"Invite to this community": "Convidar a esta comunidade", "Invite to this community": "Convidar a esta comunidade",
"Add rooms to this community": "Engadir salas a esta comunidade" "Add rooms to this community": "Engadir salas a esta comunidade",
"Appear Offline": "Aparecer fora de liña",
"Away": "Fóra",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Por favor instale <chromeLink>Chrome</chromeLink> ou <firefoxLink>Firefox</firefoxLink> para a mellor experiencia de usuaria.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> tamén funcionan.",
"Reply": "Resposta"
} }

View File

@ -3,7 +3,7 @@
"Add an email address above to configure email notifications": "הוסף כתובת דואר אלקטורני למעלה בכדי להגדיר התראות", "Add an email address above to configure email notifications": "הוסף כתובת דואר אלקטורני למעלה בכדי להגדיר התראות",
"Advanced notification settings": "הגדרות מתקדמות להתראות", "Advanced notification settings": "הגדרות מתקדמות להתראות",
"All messages": "כל ההודעות", "All messages": "כל ההודעות",
"All messages (loud)": "כל ההודעות (צעקה)", "All messages (noisy)": "כל ההודעות (צעקה)",
"All Rooms": "כל החדרים", "All Rooms": "כל החדרים",
"All notifications are currently disabled for all targets.": "התראות מנוטרלות לכלל המערכת.", "All notifications are currently disabled for all targets.": "התראות מנוטרלות לכלל המערכת.",
"An error occurred whilst saving your email notification preferences.": "קרתה שגיאה בזמן שמירת הגדרות התראה באמצעות הדואר האלקטרוני.", "An error occurred whilst saving your email notification preferences.": "קרתה שגיאה בזמן שמירת הגדרות התראה באמצעות הדואר האלקטרוני.",

View File

@ -2,7 +2,7 @@
"Add an email address above to configure email notifications": "E-mail értesítés beállításához írd be az e-mail címed", "Add an email address above to configure email notifications": "E-mail értesítés beállításához írd be az e-mail címed",
"Advanced notification settings": "Haladó értesítési beállítások", "Advanced notification settings": "Haladó értesítési beállítások",
"All messages": "Minden üzenet", "All messages": "Minden üzenet",
"All messages (loud)": "Minden üzenet (hangos)", "All messages (noisy)": "Minden üzenet (hangos)",
"All notifications are currently disabled for all targets.": "Minden céleszközön minden értesítés tiltva van.", "All notifications are currently disabled for all targets.": "Minden céleszközön minden értesítés tiltva van.",
"An error occurred whilst saving your email notification preferences.": "Hiba történt az e-mail értesítés beállításánál.", "An error occurred whilst saving your email notification preferences.": "Hiba történt az e-mail értesítés beállításánál.",
"Call invitation": "Hívás meghívó", "Call invitation": "Hívás meghívó",
@ -132,7 +132,7 @@
"Riot is not supported on mobile web. Install the app?": "Riot nem támogatott mobil webböngészőn. Telepíted az alkalmazást?", "Riot is not supported on mobile web. Install the app?": "Riot nem támogatott mobil webböngészőn. Telepíted az alkalmazást?",
"Search": "Keresés", "Search": "Keresés",
"Search…": "Keresés…", "Search…": "Keresés…",
"Send": "Küld", "Send": "Elküld",
"Send logs": "Naplók elküldése", "Send logs": "Naplók elküldése",
"This Room": "Ebben a szobában", "This Room": "Ebben a szobában",
"Unavailable": "Elérhetetlen", "Unavailable": "Elérhetetlen",
@ -217,5 +217,10 @@
"Add rooms to this community": "Szobák hozzáadása ehhez a közösséghez", "Add rooms to this community": "Szobák hozzáadása ehhez a közösséghez",
"Toolbox": "Szerszámok", "Toolbox": "Szerszámok",
"Send Account Data": "Fiók adatok küldése", "Send Account Data": "Fiók adatok küldése",
"Explore Account Data": "Fiók adatok böngészése" "Explore Account Data": "Fiók adatok böngészése",
"Appear Offline": "Kapcsolat nélkülinek tűnik",
"Away": "Távol",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "A legjobb élmény érdekében telepíts <chromeLink>Chrome</chromeLink>ot vagy <firefoxLink>Firefox</firefoxLink>ot.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Működik <safariLink>Safari</safariLink> és <operaLink>Opera</operaLink> böngészővel is.",
"Reply": "Válasz"
} }

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Tambahkan alamat email di atas untuk konfigurasi notifikasi email", "Add an email address above to configure email notifications": "Tambahkan alamat email di atas untuk konfigurasi notifikasi email",
"Advanced notification settings": "Pengaturan notifikasi lanjutan", "Advanced notification settings": "Pengaturan notifikasi lanjutan",
"All messages": "Semua pesan", "All messages": "Semua pesan",
"All messages (loud)": "Semua pesan (keras)", "All messages (noisy)": "Semua pesan (keras)",
"All Rooms": "Semua Ruang", "All Rooms": "Semua Ruang",
"All notifications are currently disabled for all targets.": "Semua notifikasi saat ini dinonaktifkan untuk semua target.", "All notifications are currently disabled for all targets.": "Semua notifikasi saat ini dinonaktifkan untuk semua target.",
"An error occurred whilst saving your email notification preferences.": "Terjadi kesalahan saat menyimpan preferensi notifikasi email Anda.", "An error occurred whilst saving your email notification preferences.": "Terjadi kesalahan saat menyimpan preferensi notifikasi email Anda.",

View File

@ -4,7 +4,7 @@
"Add an email address above to configure email notifications": "Aggiungi un indirizzo email sopra per configurare le notifiche via email", "Add an email address above to configure email notifications": "Aggiungi un indirizzo email sopra per configurare le notifiche via email",
"Advanced notification settings": "Impostazioni di notifica avanzate", "Advanced notification settings": "Impostazioni di notifica avanzate",
"All messages": "Tutti i messaggi", "All messages": "Tutti i messaggi",
"All messages (loud)": "Tutti i messaggi (rumoroso)", "All messages (noisy)": "Tutti i messaggi (rumoroso)",
"All Rooms": "Tutte le stanze", "All Rooms": "Tutte le stanze",
"An error occurred whilst saving your email notification preferences.": "Si è verificato un errore durante il salvataggio delle tue preferenze sulle notifiche email.", "An error occurred whilst saving your email notification preferences.": "Si è verificato un errore durante il salvataggio delle tue preferenze sulle notifiche email.",
"Call invitation": "Invito ad una chiamata", "Call invitation": "Invito ad una chiamata",
@ -207,5 +207,20 @@
"Event Content": "Contenuto dell'Evento", "Event Content": "Contenuto dell'Evento",
"State Key": "Chiave dello Stato", "State Key": "Chiave dello Stato",
"Show message in desktop notification": "Mostra i messaggi nelle notifiche desktop", "Show message in desktop notification": "Mostra i messaggi nelle notifiche desktop",
"Edit": "Modifica" "Edit": "Modifica",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Puoi usare le opzioni server personalizzate per accedere ad altri server Matrix specificando l'indirizzo dell'home server.<br/> Questo permette di usare Matrix con un account esistente su un home server diverso.<br/><br/>È anche possibile impostare un diverso identity server, ma in quel caso non sarà possibile invitare utenti attraverso l'indirizzo e-mail o essere invitati attraverso l'indirizzo e-mail.",
"Appear Offline": "Appari offline",
"Away": "Assente",
"Explore Account Data": "Esplora dati account",
"Toolbox": "Strumenti",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installa <chromeLink>Chrome</chromeLink> o <firefoxLink>Firefox</firefoxLink> per la migliore esperienza d'uso.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Anche <safariLink>Safari</safariLink> e <operaLink>Opera</operaLink> vanno bene.",
"Register": "Registrati",
"Rooms": "Stanze",
"Send Account Data": "Invia dati account",
"Unpin Message": "Sblocca messaggio",
"Pin Message": "Blocca messaggio",
"Add rooms to this community": "Aggiungi stanze a questa community",
"Reply": "Rispondi",
"Invite to this community": "Invita a questa comunità"
} }

View File

@ -1,6 +1,6 @@
{ {
"All messages": "全ての発言", "All messages": "全ての発言",
"All messages (loud)": "全ての発言(通知音あり)", "All messages (noisy)": "全ての発言(通知音あり)",
"Cancel": "取消", "Cancel": "取消",
"Close": "閉じる", "Close": "閉じる",
"Direct Chat": "対話", "Direct Chat": "対話",
@ -52,5 +52,25 @@
"Filter room names": "部屋名検索", "Filter room names": "部屋名検索",
"Forget": "忘れる", "Forget": "忘れる",
"Leave": "退室", "Leave": "退室",
"Files": "添付ファイル" "Files": "添付ファイル",
"Unknown device": "不明な端末",
"Collecting app version information": "アプリのバージョン情報を収集",
"Collecting logs": "ログの収集",
"Uploading report": "レポートのアップロード",
"Messages containing my display name": "自身の表示名を含むメッセージ",
"Messages containing my user name": "自身のユーザー名を含むメッセージ",
"Messages in one-to-one chats": "一対一のチャットでのメッセージ",
"Messages in group chats": "グループチャットのメッセージ",
"When I'm invited to a room": "部屋に招待された時",
"Messages sent by bot": "ボットから送信されたメッセージ",
"Error saving email notification preferences": "電子メール通知設定の保存エラー",
"An error occurred whilst saving your email notification preferences.": "電子メール通知設定を保存中にエラーが発生しました。",
"Keywords": "キーワード",
"Enter keywords separated by a comma:": "キーワードをコンマで区切って入力:",
"OK": "OK",
"Operation failed": "操作に失敗しました",
"Can't update user notification settings": "ユーザー通知の設定を更新できません",
"Failed to update keywords": "キーワードの更新に失敗しました",
"Messages containing <span>keywords</span>": "<span>keywords</span>を含むメッセージ",
"Add an email address above to configure email notifications": "メール通知を設定するために、メールアドレスを追加してください"
} }

View File

@ -3,7 +3,7 @@
"Add an email address above to configure email notifications": "이메일 알림을 설정하기 위해 이메일 주소를 추가해주세요", "Add an email address above to configure email notifications": "이메일 알림을 설정하기 위해 이메일 주소를 추가해주세요",
"Advanced notification settings": "고급 알림 설정", "Advanced notification settings": "고급 알림 설정",
"All messages": "모든 메시지", "All messages": "모든 메시지",
"All messages (loud)": "모든 메시지 (크게)", "All messages (noisy)": "모든 메시지 (크게)",
"All Rooms": "모든 방", "All Rooms": "모든 방",
"All notifications are currently disabled for all targets.": "현재 모든 알림이 모든 상대에게서 꺼졌어요.", "All notifications are currently disabled for all targets.": "현재 모든 알림이 모든 상대에게서 꺼졌어요.",
"An error occurred whilst saving your email notification preferences.": "이메일 알림을 설정하다가 오류가 일어났어요.", "An error occurred whilst saving your email notification preferences.": "이메일 알림을 설정하다가 오류가 일어났어요.",
@ -191,5 +191,14 @@
"Error encountered (%(errorDetail)s).": "오류가 일어났어요 (%(errorDetail)s).", "Error encountered (%(errorDetail)s).": "오류가 일어났어요 (%(errorDetail)s).",
"No update available.": "업데이트가 없어요.", "No update available.": "업데이트가 없어요.",
"Downloading update...": "업데이트를 받는 중...", "Downloading update...": "업데이트를 받는 중...",
"Couldn't load home page": "중심 화면을 불러올 수 없어요" "Couldn't load home page": "중심 화면을 불러올 수 없어요",
"Show message in desktop notification": "컴퓨터 알림에서 내용 보이기",
"Appear Offline": "미접속으로 표시하기",
"Bug report sent": "오류 보고서를 보냈어요",
"Thank you!": "감사합니다!",
"Back": "돌아가기",
"Edit": "수정하기",
"Toolbox": "도구상자",
"Developer Tools": "개발자 도구",
"Register": "등록"
} }

90
src/i18n/strings/lt.json Normal file
View File

@ -0,0 +1,90 @@
{
"Waiting for response from server": "Laukiama atsakymo iš serverio",
"Unknown device": "Nežinomas įrenginys",
"Collecting app version information": "Renkama programėlės versijos informacija",
"Collecting logs": "Renkami žurnalai",
"Uploading report": "Išsiunčiama ataskaita",
"Keywords": "Raktažodžiai",
"Enter keywords separated by a comma:": "Įveskite kableliais atskirtus raktažodžius:",
"OK": "Gerai",
"Failed to change settings": "Nepavyko pakeisti nustatymų",
"Operation failed": "Operacija nepavyko",
"Failed to update keywords": "Nepavyko atnaujinti raktažodžių",
"Enable email notifications": "Įjungti pranešimus el. paštu",
"Advanced notification settings": "Išplėstiniai pranešimų nustatymai",
"Enable desktop notifications": "Įjungti pranešimus darbalaukyje",
"Sunday": "Sekmadienis",
"Monday": "Pirmadienis",
"Tuesday": "Antradienis",
"Wednesday": "Trečiadienis",
"Thursday": "Ketvirtadienis",
"Friday": "Penktadienis",
"Saturday": "Šeštadienis",
"Today": "Šiandien",
"Yesterday": "Vakar",
"powered by Matrix": "veikia su Matrix",
"What's New": "Kas naujo",
"What's new?": "Kas naujo?",
"A new version of Riot is available.": "Yra prieinama nauja Riot versija.",
"To return to your account in future you need to <u>set a password</u>": "Norėdami ateityje sugrįžti į savo paskyrą, turite <u>nusistatyti slaptažodį</u>",
"Set Password": "Nustatyti slaptažodį",
"Checking for an update...": "Tikrinama ar yra atnaujinimų...",
"No update available.": "Nėra prieinamų atnaujinimų.",
"Downloading update...": "Atsiunčiamas atnaujinimas...",
"Warning": "Įspėjimas",
"Error": "Klaida",
"You cannot delete this image. (%(code)s)": "Jūs negalite ištrinti šio paveikslo. (%(code)s)",
"Remove": "Šalinti",
"Close": "Užverti",
"Download this file": "Atsisiųsti šį failą",
"Thank you!": "Ačiū!",
"Cancel": "Atsisakyti",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Aprašykite klaidą. Ką darėte? Ko tikėjotės? Kas iš tikrųjų nutiko?",
"Describe your problem here.": "Čia aprašykite savo problemą.",
"Changelog": "Keitinių žurnalas",
"Back": "Atgal",
"You must specify an event type!": "Privalote nurodyti įvykio tipą!",
"Event sent!": "Įvykis išsiųstas!",
"Event Type": "Įvykio tipas",
"Toolbox": "Parankinė",
"You have successfully set a password!": "Jūs sėkmingai nusistatėte slaptažodį!",
"You have successfully set a password and an email address!": "Jūs sėkmingai nusistatėte slaptažodį ir el. pašto adresą!",
"Continue": "Tęsti",
"(HTTP status %(httpStatus)s)": "(HTTP būsena %(httpStatus)s)",
"Please set a password!": "Prašome nusistatyti slaptažodį!",
"You cannot delete this message. (%(code)s)": "Negalite ištrinti šios žinutės. (%(code)s)",
"Cancel Sending": "Atsisakyti siuntimo",
"Forward Message": "Persiųsti žinutę",
"Unpin Message": "Atsegti žinutę",
"Pin Message": "Prisegti žinutę",
"Permalink": "Pastovioji nuoroda",
"unknown error code": "nežinomas klaidos kodas",
"Reject": "Atmesti",
"Sorry, your browser is <b>not</b> able to run Riot.": "Atleiskite, jūsų naršyklė <b>negali</b> paleisti Riot.",
"I understand the risks and wish to continue": "Aš suprantu riziką ir noriu tęsti",
"Login": "Prisijungti",
"Register": "Registruotis",
"Files": "Failai",
"Notifications": "Pranešimai",
"Rooms": "Kambariai",
"Hide panel": "Slėpti skydelį",
"Invite to this community": "Pakviesti į šią bendruomenę",
"The server may be unavailable or overloaded": "Gali būti, kad serveris yra neprieinamas arba perkrautas",
"Unnamed room": "Kambarys be pavadinimo",
"Remove from Directory": "Šalinti iš katalogo",
"remove %(name)s from the directory.": "šalinti %(name)s iš katalogo.",
"Unable to join network": "Nepavyko prisijungti prie tinklo",
"Riot does not know how to join a room on this network": "Riot nežino kaip prisijungti prie kambario šiame tinkle",
"Room not found": "Kambarys nerastas",
"Couldn't find a matching Matrix room": "Nepavyko rasti atitinkamo Matrix kambario",
"Directory": "Katalogas",
"#example": "#pavyzdys",
"more": "daugiau",
"Expand panel": "Išskleisti skydelį",
"Collapse panel": "Suskleisti skydelį",
"Welcome to Riot.im": "Sveiki atvykę į Riot.im",
"Chat with Riot Bot": "Kalbėtis su Riot robotu",
"General discussion about Matrix and Riot": "Bendros diskusijos apie Matrix ir Riot",
"Matrix technical discussions": "Matrix techninės diskusijos",
"Riot is not supported on mobile web. Install the app?": "Riot nėra palaikoma naršant svetainėje mobiliaisiais įrenginiais. Įdiegti programėlę?"
}

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Pievieno augšā epasta adresi, lai konfigurētu epasta notifikāciju paziņojumus", "Add an email address above to configure email notifications": "Pievieno augšā epasta adresi, lai konfigurētu epasta notifikāciju paziņojumus",
"Advanced notification settings": "Īpašie notifikāciju uzstādījumi", "Advanced notification settings": "Īpašie notifikāciju uzstādījumi",
"All messages": "Visas ziņas", "All messages": "Visas ziņas",
"All messages (loud)": "Visas ziņas (skaļi)", "All messages (noisy)": "Visas ziņas (skaļi)",
"All Rooms": "Visas istabas", "All Rooms": "Visas istabas",
"All notifications are currently disabled for all targets.": "Visi notifikāciju paziņojumi ir atspējoti visiem saņēmējiem.", "All notifications are currently disabled for all targets.": "Visi notifikāciju paziņojumi ir atspējoti visiem saņēmējiem.",
"An error occurred whilst saving your email notification preferences.": "Radās kļūda saglabājot tavus epasta notifikāciju ziņu uzstādījumus.", "An error occurred whilst saving your email notification preferences.": "Radās kļūda saglabājot tavus epasta notifikāciju ziņu uzstādījumus.",

View File

@ -1,7 +1,7 @@
{ {
"Add an email address above to configure email notifications": "ഇ മെയില്‍ അറിയിപ്പുകൾ ലഭിക്കാന്‍ മുകളില്‍ ഇ-മെയില്‍ വിലാസം നല്‍കൂ", "Add an email address above to configure email notifications": "ഇ മെയില്‍ അറിയിപ്പുകൾ ലഭിക്കാന്‍ മുകളില്‍ ഇ-മെയില്‍ വിലാസം നല്‍കൂ",
"All messages": "എല്ലാ സന്ദേശങ്ങളും", "All messages": "എല്ലാ സന്ദേശങ്ങളും",
"All messages (loud)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)", "All messages (noisy)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)",
"%(appName)s via %(browserName)s on %(osName)s": "%(osName)sല് %(browserName)s വഴി %(appName)s", "%(appName)s via %(browserName)s on %(osName)s": "%(osName)sല് %(browserName)s വഴി %(appName)s",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">സഫാരിയിലും</a>പിന്നെ <a href=\"http://opera.com\">ഓപ്പേറയിലും</a>പ്രവര്‍ത്തിക്കുന്നു.", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">സഫാരിയിലും</a>പിന്നെ <a href=\"http://opera.com\">ഓപ്പേറയിലും</a>പ്രവര്‍ത്തിക്കുന്നു.",
"A new version of Riot is available.": "റയട്ടിന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.", "A new version of Riot is available.": "റയട്ടിന്റെ ഒരു പുതിയ പതിപ്പ് ലഭ്യമാണ്.",

View File

@ -2,7 +2,7 @@
"Add an email address above to configure email notifications": "Legg til en epost adresse for å sette opp epost varsling", "Add an email address above to configure email notifications": "Legg til en epost adresse for å sette opp epost varsling",
"Advanced notification settings": "Avanserte varslingsinnstillinger", "Advanced notification settings": "Avanserte varslingsinnstillinger",
"All messages": "Alle meldinger", "All messages": "Alle meldinger",
"All messages (loud)": "Alle meldinger (høy)", "All messages (noisy)": "Alle meldinger (høy)",
"All notifications are currently disabled for all targets.": "Alle varsler er deaktivert for alle mottakere.", "All notifications are currently disabled for all targets.": "Alle varsler er deaktivert for alle mottakere.",
"An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.", "An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.",
"Cancel Sending": "Avbryt sending", "Cancel Sending": "Avbryt sending",

View File

@ -2,7 +2,7 @@
"Add an email address above to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen te ontvangen", "Add an email address above to configure email notifications": "Voeg een e-mailadres toe om e-mailmeldingen te ontvangen",
"Advanced notification settings": "Geavanceerde meldingsinstellingen", "Advanced notification settings": "Geavanceerde meldingsinstellingen",
"All messages": "Alle berichten", "All messages": "Alle berichten",
"All messages (loud)": "Alle berichten (luid)", "All messages (noisy)": "Alle berichten (luid)",
"All notifications are currently disabled for all targets.": "Alle meldingen zijn momenteel uitgeschakeld voor alle doelen.", "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.", "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", "Call invitation": "Oproep-uitnodiging",
@ -57,7 +57,7 @@
"No rooms to show": "Geen kamers om te laten zien", "No rooms to show": "Geen kamers om te laten zien",
"Noisy": "Luidruchtig", "Noisy": "Luidruchtig",
"Notification targets": "Meldingsdoelen", "Notification targets": "Meldingsdoelen",
"Notifications": "Meldingen", "Notifications": "Notificaties",
"Notifications on the following keywords follow rules which cant be displayed here:": "Meldingen op de volgende trefwoorden volgen regels die hier niet kunnen worden getoond:", "Notifications on the following keywords follow rules which cant 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 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", "Notify me for anything else": "Stuur een melding voor al het andere",
@ -129,7 +129,7 @@
"Riot is not supported on mobile web. Install the app?": "Riot wordt niet ondersteund op het mobiele web. Wil je de app installeren?", "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",
"Search…": "Zoeken…", "Search…": "Zoeken…",
"Send": "Versturen", "Send": "Verstuur",
"Send logs": "Logboeken versturen", "Send logs": "Logboeken versturen",
"Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, uw browser werkt <b>niet</b> met Riot.", "Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, uw browser werkt <b>niet</b> met Riot.",
"This Room": "Deze kamer", "This Room": "Deze kamer",
@ -205,5 +205,21 @@
"Event sent!": "Event verstuurd!", "Event sent!": "Event verstuurd!",
"Event Type": "Event-type", "Event Type": "Event-type",
"Event Content": "Event-inhoud", "Event Content": "Event-inhoud",
"State Key": "Toestandssleutel" "State Key": "Toestandssleutel",
"Show message in desktop notification": "Toon boodschap in bureaublad popup",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Je kan de custom server opties gebruiken om op andere Matrix server in te loggen door een andere Home server URL op te geven.<br/> Dit laat je toe om Riot te gebruiken met een bestaande Matrix account op een andere home server.<br/><br/>Je kan ook een custom identiteits-server opzetten maar dan kan je geen gebruikers uitnodigen via hun email adres, of zelf uitgenodigd worden via je email adres.",
"Appear Offline": "Lijk offline",
"Away": "Afwezig",
"Send Account Data": "Stuur account informatie",
"Edit": "Aanpassen",
"Explore Account Data": "Bekijk account informatie",
"Unpin Message": "Maak pin los",
"Pin Message": "Bericht vastpinnen",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Installeer alstublieft <chromeLink>Chrome</chromeLink> of <firefoxLink>Firefox</firefoxLink> voor de beste gebruikerservaring.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> en <operaLink>Opera</operaLink> werken ook.",
"Register": "Registreer",
"Rooms": "Kamers",
"Invite to this community": "Nodig uit in deze community",
"Add rooms to this community": "Voeg kamers toe aan deze community",
"Toolbox": "Eigenschappen"
} }

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "Dodaj adres e-mail powyżej, aby skonfigurować powiadomienia e-mailowe", "Add an email address above to configure email notifications": "Dodaj adres e-mail powyżej, aby skonfigurować powiadomienia e-mailowe",
"Advanced notification settings": "Zaawansowane ustawienia powiadomień", "Advanced notification settings": "Zaawansowane ustawienia powiadomień",
"All messages": "Wszystkie wiadomości", "All messages": "Wszystkie wiadomości",
"All messages (loud)": "Wszystkie wiadomości (głośno)", "All messages (noisy)": "Wszystkie wiadomości (głośno)",
"All Rooms": "Wszystkie pokoje", "All Rooms": "Wszystkie pokoje",
"All notifications are currently disabled for all targets.": "Wszystkie powiadomienia są obecnie wyłączone dla wszystkich celów.", "All notifications are currently disabled for all targets.": "Wszystkie powiadomienia są obecnie wyłączone dla wszystkich celów.",
"An error occurred whilst saving your email notification preferences.": "Podczas zapisywania ustawień powiadomień e-mail wystąpił błąd.", "An error occurred whilst saving your email notification preferences.": "Podczas zapisywania ustawień powiadomień e-mail wystąpił błąd.",

View File

@ -1,7 +1,7 @@
{ {
"Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar as notificações por email", "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar as notificações por email",
"All messages": "Todas as mensagens", "All messages": "Todas as mensagens",
"All messages (loud)": "Todas as mensagens (alto)", "All messages (noisy)": "Todas as mensagens (alto)",
"An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao guardar as suas preferências de notificação por email.", "An error occurred whilst saving your email notification preferences.": "Ocorreu um erro ao guardar as suas preferências de notificação por email.",
"Call invitation": "Convite para chamada", "Call invitation": "Convite para chamada",
"Cancel Sending": "Cancelar o envio", "Cancel Sending": "Cancelar o envio",

View File

@ -1,7 +1,7 @@
{ {
"Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar suas notificações por email", "Add an email address above to configure email notifications": "Insira um endereço de email no campo acima para configurar suas notificações por email",
"All messages": "Todas as mensagens", "All messages": "Todas as mensagens",
"All messages (loud)": "Todas as mensagens (alto)", "All messages (noisy)": "Todas as mensagens (alto)",
"An error occurred whilst saving your email notification preferences.": "Um erro ocorreu enquanto o sistema estava salvando suas preferências de notificação por email.", "An error occurred whilst saving your email notification preferences.": "Um erro ocorreu enquanto o sistema estava salvando suas preferências de notificação por email.",
"Call invitation": "Convite para chamada", "Call invitation": "Convite para chamada",
"Cancel Sending": "Cancelar o envio", "Cancel Sending": "Cancelar o envio",

View File

@ -63,7 +63,7 @@
"You are not receiving desktop notifications": "Вы не получаете уведомления на рабочем столе", "You are not receiving desktop notifications": "Вы не получаете уведомления на рабочем столе",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Возможно вы настроили их не в Riot, а в другом Matrix-клиенте. Настроить их в Riot не удастся, но они будут в нем применяться", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Возможно вы настроили их не в Riot, а в другом Matrix-клиенте. Настроить их в Riot не удастся, но они будут в нем применяться",
"All messages": "Все сообщения", "All messages": "Все сообщения",
"All messages (loud)": "Все сообщения (со звуком)", "All messages (noisy)": "Все сообщения (со звуком)",
"Cancel Sending": "Отменить отправку", "Cancel Sending": "Отменить отправку",
"Close": "Закрыть", "Close": "Закрыть",
"Download this file": "Скачать этот файл", "Download this file": "Скачать этот файл",
@ -132,7 +132,7 @@
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot использует многие передовые возможности браузера, некоторые из которых недоступны или являются экспериментальным в вашем текущем браузере.",
"Search": "Поиск", "Search": "Поиск",
"Search…": "Поиск.…", "Search…": "Поиск.…",
"Send": "Отослать", "Send": "Отправить",
"Send logs": "Отправка журналов", "Send logs": "Отправка журналов",
"Sorry, your browser is <b>not</b> able to run Riot.": "К сожалению, ваш браузер <b>не способен</b> запустить Riot.", "Sorry, your browser is <b>not</b> able to run Riot.": "К сожалению, ваш браузер <b>не способен</b> запустить Riot.",
"This Room": "Эта комната", "This Room": "Эта комната",
@ -217,5 +217,10 @@
"Add rooms to this community": "Добавить комнаты в это сообщество", "Add rooms to this community": "Добавить комнаты в это сообщество",
"Toolbox": "Панель инструментов", "Toolbox": "Панель инструментов",
"Send Account Data": "Отправить данные аккаунта", "Send Account Data": "Отправить данные аккаунта",
"Explore Account Data": "Просмотр данных аккаунта" "Explore Account Data": "Просмотр данных аккаунта",
"Away": "Нет на месте",
"Appear Offline": "Отображать как не в сети",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Лучший опыт вы получите, установив <chromeLink>Chrome</chromeLink> или <firefoxLink>Firefox</firefoxLink>.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> и <operaLink>Opera</operaLink> работают тоже.",
"Reply": "Ответить"
} }

View File

@ -94,7 +94,7 @@
"Describe your problem here.": "Tu popíšte váš problém.", "Describe your problem here.": "Tu popíšte váš problém.",
"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:": "S cieľom lepšej diagnostiky problému sa spolu s vašim hlásením odošlú záznami o činnosti programu Riot. Ak si želáte odoslať len text hlásenia, odškrtnite nasledujúce pole:", "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:": "S cieľom lepšej diagnostiky problému sa spolu s vašim hlásením odošlú záznami o činnosti programu Riot. Ak si želáte odoslať len text hlásenia, odškrtnite nasledujúce pole:",
"Send logs": "Zahrnúť záznamy", "Send logs": "Zahrnúť záznamy",
"Send": "Poslať", "Send": "Odoslať",
"Unavailable": "Nedostupné", "Unavailable": "Nedostupné",
"Changelog": "Zoznam zmien", "Changelog": "Zoznam zmien",
"Back": "Naspäť", "Back": "Naspäť",
@ -130,12 +130,12 @@
"View Decrypted Source": "Zobraziť dešifrovaný zdroj", "View Decrypted Source": "Zobraziť dešifrovaný zdroj",
"Unhide Preview": "Zobraziť náhľad", "Unhide Preview": "Zobraziť náhľad",
"Permalink": "Trvalý odkaz", "Permalink": "Trvalý odkaz",
"Quote": "Citovať", "Quote": "Citácia",
"Source URL": "Pôvodná URL", "Source URL": "Pôvodná URL",
"Failed to set Direct Message status of room": "Nepodarilo sa nastaviť stav miestnosti priama konverzácia", "Failed to set Direct Message status of room": "Nepodarilo sa nastaviť stav miestnosti priama konverzácia",
"unknown error code": "neznámy kód chyby", "unknown error code": "neznámy kód chyby",
"Failed to forget room %(errCode)s": "Nepodarilo sa zabudnuť miestnosť %(errCode)s", "Failed to forget room %(errCode)s": "Nepodarilo sa zabudnuť miestnosť %(errCode)s",
"All messages (loud)": "Všetky správy (hlučné)", "All messages (noisy)": "Všetky správy (hlučné)",
"All messages": "Všetky správy", "All messages": "Všetky správy",
"Mentions only": "Len zmienky", "Mentions only": "Len zmienky",
"Mute": "Umlčať", "Mute": "Umlčať",
@ -178,7 +178,7 @@
"Couldn't find a matching Matrix room": "Nie je možné nájsť zodpovedajúcu Matrix miestnosť", "Couldn't find a matching Matrix room": "Nie je možné nájsť zodpovedajúcu Matrix miestnosť",
"Fetching third party location failed": "Nepodarilo sa získať umiestnenie tretej strany", "Fetching third party location failed": "Nepodarilo sa získať umiestnenie tretej strany",
"Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na servery", "Unable to look up room ID from server": "Nie je možné vyhľadať ID miestnosti na servery",
"World readable": "Viditeľná pre všetkých", "World readable": "Viditeľné pre každého",
"Guests can join": "Pripojiť sa môžu aj hostia", "Guests can join": "Pripojiť sa môžu aj hostia",
"Directory": "Adresár", "Directory": "Adresár",
"No rooms to show": "Žiadne miestnosti na zobrazenie", "No rooms to show": "Žiadne miestnosti na zobrazenie",
@ -215,5 +215,10 @@
"Contributing code to Matrix and Riot": "Prispievanie kódu projektom Matrix a Riot", "Contributing code to Matrix and Riot": "Prispievanie kódu projektom Matrix a Riot",
"Dev chat for the Riot/Web dev team": "Diskusia pre tím vývojárov Riot/Web", "Dev chat for the Riot/Web dev team": "Diskusia pre tím vývojárov Riot/Web",
"Dev chat for the Dendrite dev team": "Diskusia pre tím vývojárov Dendrite", "Dev chat for the Dendrite dev team": "Diskusia pre tím vývojárov Dendrite",
"Co-ordination for Riot/Web translators": "Koordinácia prekladov Riot/Web" "Co-ordination for Riot/Web translators": "Koordinácia prekladov Riot/Web",
"Appear Offline": "Zdá sa byť nedostupný",
"Away": "Preč",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Aby ste s používania mali čo možno najlepší dojem, nainštalujte si <chromeLink>Chrome</chromeLink> alebo <firefoxLink>Firefox</firefoxLink>.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "Správne fungujú aj <safariLink>Safari</safariLink> a <operaLink>Opera</operaLink>.",
"Reply": "Odpovedať"
} }

222
src/i18n/strings/sr.json Normal file
View File

@ -0,0 +1,222 @@
{
"Riot is not supported on mobile web. Install the app?": "RIot не ради на мобилном вебу. Инсталирати апликацију?",
"Collecting app version information": "Прикупљам податке о издању апликације",
"Collecting logs": "Прикупљам записнике",
"Uploading report": "Отпремам извештај",
"Waiting for response from server": "Чекам на одговор са сервера",
"Riot Desktop on %(platformName)s": "Riot стони програм за %(platformName)s",
"Unknown device": "Непознати уређај",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s преко прегледача %(browserName)s на систему %(osName)s",
"You need to be using HTTPS to place a screen-sharing call.": "Морате користити HTTPS да бисте започели позив са дељењем екрана.",
"Messages containing my display name": "Поруке које садрже моје приказно име",
"Messages containing my user name": "Поруке које садрже моје корисничко име",
"Messages in one-to-one chats": "Поруке у један-на-један ћаскањима",
"Messages in group chats": "Поруке у групним ћаскањима",
"When I'm invited to a room": "Када сам позван у собу",
"Call invitation": "Позивница за позив",
"Messages sent by bot": "Поруке послате од бота",
"Error saving email notification preferences": "Грешка при чувању поставки мејл обавештења",
"An error occurred whilst saving your email notification preferences.": "Догодила се грешка при чувању ваших поставки мејл обавештења.",
"Keywords": "Кључне речи",
"Enter keywords separated by a comma:": "Унесите кључне речи одвојене зарезима:",
"OK": "У реду",
"Failed to change settings": "Нисам успео да променим подешавања",
"Operation failed": "Радња није успела",
"Can't update user notification settings": "Не могу да ажурирам корисничка подешавања обавештења",
"Failed to update keywords": "Нисам успео да ажурирам кључне речи",
"Messages containing <span>keywords</span>": "Поруке које садрже <span>кључне речи</span>",
"Notify for all other messages/rooms": "Обавести за све друге поруке и собе",
"Notify me for anything else": "Обавести ме за било шта друго",
"Enable notifications for this account": "Омогући обавештења за овај налог",
"All notifications are currently disabled for all targets.": "Сва обавештења су тренутно онемогућена за све циљеве.",
"Add an email address above to configure email notifications": "Додајте мејл адресу изнад да бисте подесили мејл обавештења",
"Enable email notifications": "Омогући мејл обавештења",
"Notifications on the following keywords follow rules which cant be displayed here:": "Обавештења за следеће кључне речи прате правила која не могу бити приказана овде:",
"Unable to fetch notification target list": "Не могу да досегнем списак циљева за обавештења",
"Notification targets": "Циљеви обавештења",
"Advanced notification settings": "Напредна подешавања обавештења",
"There are advanced notifications which are not shown here": "Постоје напредна обавештења која нису приказана овде",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Можда сте их подесили у неком другом клијенту а не Riot-у. Не можете их преправљати у Riot-у али се и даље примењују",
"Enable desktop notifications": "Омогући стона обавештења",
"Show message in desktop notification": "Прикажи поруку у стоном обавештењу",
"Enable audible notifications in web client": "Омогући звучна обавештења у веб клијенту",
"Off": "Искључено",
"On": "Укључено",
"Noisy": "Бучно",
"Failed to set direct chat tag": "Нисам успео да поставим ознаку директног ћаскања",
"Failed to remove tag %(tagName)s from room": "Нисам успео да уклоним ознаку %(tagName)s са собе",
"Failed to add tag %(tagName)s to room": "Нисам успео да додам ознаку %(tagName)s на собу",
"Search…": "Претрага…",
"Search": "Претрага",
"This Room": "Ова соба",
"All Rooms": "Све собе",
"Sunday": "Недеља",
"Monday": "Понедељак",
"Tuesday": "Уторак",
"Wednesday": "Среда",
"Thursday": "Четвртак",
"Friday": "Петак",
"Saturday": "Субота",
"Today": "Данас",
"Yesterday": "Јуче",
"Custom Server Options": "Прилагођене опције сервера",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Можете користити опције прилагођеног сервера за пријаву у друге Матрикс сервере навођењем другачије адресе кућног сервера.<br/>Ово вам омогућава да користите Riot са постојећим Матрикс налогомна другом кућном серверу.<br/><br/>Такође, можете поставити прилагођени идентитески сервер али нећете моћи да позивате кориснике по мејл адреси а ни други вас.",
"Dismiss": "Одбаци",
"powered by Matrix": "покреће Матрикс",
"You are not receiving desktop notifications": "Не примате стона обавештења",
"Enable them now": "Омогућите их сада",
"What's New": "Шта је ново",
"Update": "Ажурирај",
"What's new?": "Шта је ново?",
"Appear Offline": "Прикажи себе као ван мреже",
"Away": "Одустан",
"A new version of Riot is available.": "Ново издање RIot-а је доступно.",
"To return to your account in future you need to <u>set a password</u>": "Да бисте се вратили на ваш налог у будућности, морате <u>поставити лозинку</u>",
"Set Password": "Постави лозинку",
"Error encountered (%(errorDetail)s).": "Догодила се грешка (%(errorDetail)s).",
"Checking for an update...": "Проверавам ажурирања...",
"No update available.": "Нема нових ажурирања.",
"Downloading update...": "Преузимам ажурирање...",
"Warning": "Упозорење",
"Error": "Грешка",
"You cannot delete this image. (%(code)s)": "Не можете обрисати ову слику. (%(code)s)",
"Uploaded on %(date)s by %(user)s": "Отпремљено датума %(date)s од корисника %(user)s",
"Remove": "Уклони",
"Close": "Затвори",
"Download this file": "Преузми ову датотеку",
"Please describe the bug and/or send logs.": "Опишите грешку и/или пошаљите записнике.",
"Loading bug report module": "Учитавам модул за извештавање о грешкама",
"Bug report sent": "Извештај о грешци послат",
"Thank you!": "Хвала вам!",
"Failed to send report: ": "Нисам успео да пошаљем извештај: ",
"Cancel": "Откажи",
"Report a bug": "Пријави грешку",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Опишите грешку. Шта сте урадили? Шта сте очекивали да се догоди? Шта се заправо догодило?",
"Describe your problem here.": "Опишите ваш проблем овде.",
"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:": "Да бисмо проучили проблеме, послаћемо записнике са овог клијента уз овај извештај о грешци. Уколико само желите да пошаљете текст изнад, дештиклирајте:",
"Send logs": "Пошаљи записнике",
"Send": "Пошаљи",
"Unavailable": "Недоступан",
"Changelog": "Записник о изменама",
"Back": "Назад",
"Send Custom Event": "Пошаљи прилагођени догађај",
"You must specify an event type!": "Морате навести врсту догађаја!",
"Event sent!": "Догађај је послат!",
"Failed to send custom event.": "Нисам успео да пошаљем прилагођени догађај.",
"Event Type": "Врста догађаја",
"State Key": "Кључ стања",
"Event Content": "Садржај догађаја",
"Send Account Data": "Пошаљи податке налога",
"Filter results": "Филтрирај резултате",
"Explore Room State": "Истражи стање собе",
"Edit": "Уреди",
"Explore Account Data": "Истражи податке налога",
"Toolbox": "Алатница",
"Developer Tools": "Програмерске алатке",
"You have successfully set a password!": "Успешно сте поставили лозинку!",
"You have successfully set a password and an email address!": "Успешно сте поставили лозинку и мејл адресу!",
"You can now return to your account after signing out, and sign in on other devices.": "Можете се вратити у ваш налог након што се одјавите и пријавите поново, на другим уређајима.",
"Remember, you can always set an email address in user settings if you change your mind.": "Запамтите, увек можете поставити мејл адресу у корисничким подешавањима, уколико се предомислите.",
"Continue": "Настави",
"Failed to change password. Is your password correct?": "Нисам успео да променим лозинку. Да ли је ваша лозинка исправна?",
"(HTTP status %(httpStatus)s)": "(HTTP стање %(httpStatus)s)",
"Please set a password!": "Поставите лозинку!",
"This will allow you to return to your account after signing out, and sign in on other devices.": "Ово ће вам омогућити да се вратите у ваш налог након што се одјавите и пријавите, на другим уређајима.",
"You cannot delete this message. (%(code)s)": "Не можете обрисати ову поруку. (%(code)s)",
"Resend": "Поново пошаљи",
"Cancel Sending": "Откажи слање",
"Forward Message": "Проследи поруку",
"Unpin Message": "Откачи поруку",
"Pin Message": "Закачи поруку",
"View Source": "Погледај извор",
"View Decrypted Source": "Погледај дешифровани извор",
"Unhide Preview": "Откриј преглед",
"Permalink": "Трајна веза",
"Quote": "Цитирај",
"Source URL": "Адреса извора",
"Failed to set Direct Message status of room": "Нисам успео да подесим стање директне поруке собе",
"unknown error code": "непознати код грешке",
"Failed to forget room %(errCode)s": "Нисам успео да заборавим собу %(errCode)s",
"All messages (loud)": "Све поруке (гласно)",
"All messages": "Све поруке",
"Mentions only": "Само спомињања",
"Mute": "Утишај",
"Leave": "Напусти",
"Forget": "Заборави",
"Reject": "Одбаци",
"Favourite": "Омиљено",
"Low Priority": "Најмања важност",
"Direct Chat": "Директно ћаскање",
"Sorry, your browser is <b>not</b> able to run Riot.": "Нажалост, ваш прегледач <b>не може</b> да покреће Riot.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot користи напредне могућности прегледача од којих неке нису доступне или су у пробној фази, у вашем прегледачу.",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Инсталирајте <chromeLink>Хром (Chrome)</chromeLink> или <firefoxLink>Фајерфокс (Firefox)</firefoxLink> за најбољи угођај.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Сафари</safariLink> и <operaLink>Опера</operaLink> такође раде.",
"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!": "Са вашим тренутним прегледачем изглед и угођај ове апликације може бити скроз неправилан и неке могућности можда неће радити. Уколико желите да ипак пробате, можете наставити али ћете бити без подршке за било које проблеме на које налетите!",
"I understand the risks and wish to continue": "Разумем опасност и желим да наставим",
"Couldn't load home page": "Нисам могао да учитам почетну страну",
"Login": "Пријава",
"Register": "Регистровање",
"Invite to this room": "Позови у ову собу",
"Members": "Чланови",
"Files": "Датотеке",
"Notifications": "Обавештења",
"Rooms": "Собе",
"Hide panel": "Сакриј површ",
"Invite to this community": "Позови у ову заједницу",
"Add rooms to this community": "Додај собе у ову заједницу",
"Failed to get protocol list from Home Server": "Нисам успео да добијем списак протокола од кућног сервера",
"The Home Server may be too old to support third party networks": "Кућни сервер је можда сувише застарео да би подржао мреже трећих страна",
"Failed to get public room list": "Нисам успео да добавим списак јавних соба",
"The server may be unavailable or overloaded": "Сервер је можда недоступан или преоптерећен",
"Unnamed room": "Неименована соба",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Обрисати алијас собе %(alias)s и уклонити %(name)s из фасцикле?",
"Remove %(name)s from the directory?": "Уклонити %(name)s из фасцикле?",
"Remove from Directory": "Уклони из фасцикле",
"remove %(name)s from the directory.": "уклони %(name)s из фасцикле.",
"delete the alias.": "обриши алијас.",
"Unable to join network": "Не могу да приступим мрежи",
"Riot does not know how to join a room on this network": "Riot не зна како да приступи соби на овој мрежи",
"Room not found": "Соба није пронађена",
"Couldn't find a matching Matrix room": "Не могу да нађем одговарајућу Матрикс собу",
"Fetching third party location failed": "Добављање локације треће стране није успело",
"Unable to look up room ID from server": "Не могу да погледам ИБ собе на серверу",
"World readable": "Читљиво за све",
"Guests can join": "Гости могу приступити",
"Directory": "Фасцикла",
"No rooms to show": "Нема соба за приказ",
"Search for a room": "Потражи собу",
"#example": "#пример",
"more": "више",
"Expand panel": "Прошири површ",
"Collapse panel": "Скупи површ",
"Filter room names": "Филтрирај називе соба",
"Welcome to Riot.im": "Добродошли у Riot.im",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Децентрализовано, шифровано ћаскање и сарадња коју покреће [matrix]",
"Search the room directory": "Претражи фасциклу са собама",
"Lots of rooms already exist in Matrix, linked to existing networks (Slack, IRC, Gitter etc) or independent. Check out the directory!": "Много соба већ постоји у Матриксу, неке су повезане на постојеће мреже (Slack, IRC, Gitter итд.) а неке независне. Погледајте фасциклу!",
"Chat with Riot Bot": "Ћаскајте са Riot ботом",
"Get started with some tips from Riot Bot!": "Крените уз пар савета од Riot бота!",
"General discussion about Matrix and Riot": "Општи разговори о Матриксу и Riot-у",
"Discussion of all things Matrix!": "Разговори о свим Матрикс стварима!",
"Riot/Web &amp; Desktop chat": "Riot/веб и стоно ћаскање",
"Riot/iOS &amp; matrix-ios-sdk chat": "Riot/iOS и matrix-ios-sdk ћаскање",
"Riot/Android &amp; matrix-android-sdk chat": "Riot/Андроид и matrix-android-sdk ћаскање",
"Matrix technical discussions": "Технички разговори о Матриксу",
"Running Matrix services": "Покренуте Матрикс услуге",
"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": "Стварање услуга уз помоћ Матрикса",
"Support for those using the Matrix spec": "Подршка за оне који користе Матрикс спецификацију",
"Design and implementation of E2E in Matrix": "Дизајн и имплементација E2E у Матриксу",
"Implementing VR services with Matrix": "Израда услуга за ВР уз Матрикс",
"Implementing VoIP services with Matrix": "Израда VoIP услуга уз Матрикс",
"Discussion of the Identity Service API": "Разговори о API-ју идентитетског сервиса",
"Support for those using, running and writing other bridges": "Подршка за оне који користе, одржавају и пишу друге мостове",
"Contributing code to Matrix and Riot": "Додавање кода у Матрикс и 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/веб преводиоце",
"Reply": "Одговори"
}

View File

@ -2,7 +2,7 @@
"Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar", "Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar",
"Advanced notification settings": "Avancerade aviseringsinställingar", "Advanced notification settings": "Avancerade aviseringsinställingar",
"All messages": "Alla meddelanden", "All messages": "Alla meddelanden",
"All messages (loud)": "Alla meddelanden (högljudd)", "All messages (noisy)": "Alla meddelanden (högljudd)",
"All notifications are currently disabled for all targets.": "Alla aviseringar är för tillfället avstängda för alla mål.", "All notifications are currently disabled for all targets.": "Alla aviseringar är för tillfället avstängda för alla mål.",
"An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.", "An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.",
"Call invitation": "Inbjudan till samtal", "Call invitation": "Inbjudan till samtal",

View File

@ -4,7 +4,7 @@
"Add an email address above to configure email notifications": "மின்னஞ்சல் மூலம் அறிவிப்புகளை பெற உங்கள் மின்னஞ்சல் முகவரியை மேலே இணைக்கவும்", "Add an email address above to configure email notifications": "மின்னஞ்சல் மூலம் அறிவிப்புகளை பெற உங்கள் மின்னஞ்சல் முகவரியை மேலே இணைக்கவும்",
"Advanced notification settings": "மேம்பட்ட அறிவிப்பிற்கான அமைப்புகள்", "Advanced notification settings": "மேம்பட்ட அறிவிப்பிற்கான அமைப்புகள்",
"All messages": "அனைத்து செய்திகள்", "All messages": "அனைத்து செய்திகள்",
"All messages (loud)": "அனைத்து செய்திகள் (உரக்க)", "All messages (noisy)": "அனைத்து செய்திகள் (உரக்க)",
"All Rooms": "அனைத்து அறைகள்", "All Rooms": "அனைத்து அறைகள்",
"All notifications are currently disabled for all targets.": "அனைத்து இலக்குகளுக்கான அனைத்து அறிவுப்புகளும் தற்போது முடக்கி வைக்கப்பட்டுள்ளது.", "All notifications are currently disabled for all targets.": "அனைத்து இலக்குகளுக்கான அனைத்து அறிவுப்புகளும் தற்போது முடக்கி வைக்கப்பட்டுள்ளது.",
"An error occurred whilst saving your email notification preferences.": "உங்கள் மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் ஏதோ பிழை ஏற்பட்டுள்ளது.", "An error occurred whilst saving your email notification preferences.": "உங்கள் மின்னஞ்சல் அறிவிப்பு விருப்பங்களை சேமிப்பதில் ஏதோ பிழை ஏற்பட்டுள்ளது.",

View File

@ -16,7 +16,7 @@
"Add an email address above to configure email notifications": "ఇమెయిల్ ప్రకటనలను రూపశిల్పం చేయడానికి ఎగువ ఇమెయిల్ చిరునామాను జోడించండి", "Add an email address above to configure email notifications": "ఇమెయిల్ ప్రకటనలను రూపశిల్పం చేయడానికి ఎగువ ఇమెయిల్ చిరునామాను జోడించండి",
"Advanced notification settings": "ఆధునిక తాఖీదు అమరిక", "Advanced notification settings": "ఆధునిక తాఖీదు అమరిక",
"All messages": "అన్ని సందేశాలు", "All messages": "అన్ని సందేశాలు",
"All messages (loud)": "అన్ని సందేశాలు (గట్టిగ)", "All messages (noisy)": "అన్ని సందేశాలు (గట్టిగ)",
"All Rooms": "అన్ని గదులు", "All Rooms": "అన్ని గదులు",
"Call invitation": "మాట్లాడడానికి ఆహ్వానం", "Call invitation": "మాట్లాడడానికి ఆహ్వానం",
"Cancel Sending": "పంపడాన్ని ఆపేయండి", "Cancel Sending": "పంపడాన్ని ఆపేయండి",

View File

@ -81,7 +81,7 @@
"Riot is not supported on mobile web. Install the app?": "Riot ไม่รองรับเว็บบนอุปกรณ์พกพา ติดตั้งแอป?", "Riot is not supported on mobile web. Install the app?": "Riot ไม่รองรับเว็บบนอุปกรณ์พกพา ติดตั้งแอป?",
"Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้", "Riot does not know how to join a room on this network": "Riot ไม่รู้วิธีเข้าร่วมห้องในเครือข่ายนี้",
"Direct Chat": "แชทโดยตรง", "Direct Chat": "แชทโดยตรง",
"All messages (loud)": "ทุกข้อความ (เสียงดัง)", "All messages (noisy)": "ทุกข้อความ (เสียงดัง)",
"Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง", "Custom Server Options": "กำหนดเซิร์ฟเวอร์เอง",
"Directory": "ไดเรกทอรี", "Directory": "ไดเรกทอรี",
"Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์", "Enable audible notifications in web client": "เปิดใช้งานเสียงแจ้งเตือนบนเว็บไคลเอนต์",

View File

@ -5,7 +5,7 @@
"Add an email address above to configure email notifications": "E-posta bildirimlerini yapılandırmak için yukarıya bir e-posta adresi ekleyin", "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ı", "Advanced notification settings": "Gelişmiş bildirim ayarları",
"All messages": "Tüm mesajlar", "All messages": "Tüm mesajlar",
"All messages (loud)": "Tüm mesajlar (uzun)", "All messages (noisy)": "Tüm mesajlar (uzun)",
"All Rooms": "Tüm Odalar", "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.", "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.", "An error occurred whilst saving your email notification preferences.": "E-posta bildirim tercihlerinizi kaydetme işlemi sırasında bir hata oluştu.",

View File

@ -1,7 +1,7 @@
{ {
"A new version of Riot is available.": "Доступне оновлення для Riot.", "A new version of Riot is available.": "Доступне оновлення для Riot.",
"All messages": "Усі повідомлення", "All messages": "Усі повідомлення",
"All messages (loud)": "Усі повідомлення (гучно)", "All messages (noisy)": "Усі повідомлення (гучно)",
"All Rooms": "Усі кімнати", "All Rooms": "Усі кімнати",
"All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.", "All notifications are currently disabled for all targets.": "Сповіщення для усіх цілей на даний момент вимкнені.",
"An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.", "An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.",
@ -216,5 +216,11 @@
"Add rooms to this community": "Добавити кімнати в це суспільство", "Add rooms to this community": "Добавити кімнати в це суспільство",
"Toolbox": "Панель інструментів", "Toolbox": "Панель інструментів",
"Send Account Data": "Відправити данні аккаунта", "Send Account Data": "Відправити данні аккаунта",
"Explore Account Data": "Продивитись данні аккаунта" "Explore Account Data": "Продивитись данні аккаунта",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "Ви можете використовувати параметри користувача сервера для входа на другі сервера Matrix, вказав другий URL-адресу домашнього сервера. <br/>Це дозволяє використовувати Riot з обліковим записом Matrix який існує на другому домашньому сервері.<br/><br/>Окрім цього, можливо встановити ідентифікаційний сервер користувача, але ви не зможете запросити других користувачів та бути запрошенному використовуючи адресу електронної пошти.",
"Appear Offline": "Відображати як не в мережі",
"Away": "Нема на місці",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "Краще встановіть <chromeLink>Chrome</chromeLink> або <firefoxLink>Firefox</firefoxLink>.",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> та <operaLink>Opera</operaLink> працюють теж.",
"Reply": "Відповісти"
} }

View File

@ -10,7 +10,7 @@
"Add an email address above to configure email notifications": "请在上方输入电子邮件地址以接收邮件通知", "Add an email address above to configure email notifications": "请在上方输入电子邮件地址以接收邮件通知",
"Advanced notification settings": "通知高级设置", "Advanced notification settings": "通知高级设置",
"All messages": "全部消息", "All messages": "全部消息",
"All messages (loud)": "全部消息(高亮)", "All messages (noisy)": "全部消息(高亮)",
"All Rooms": "全部聊天室", "All Rooms": "全部聊天室",
"All notifications are currently disabled for all targets.": "当前所有目标的通知均已禁用。", "All notifications are currently disabled for all targets.": "当前所有目标的通知均已禁用。",
"An error occurred whilst saving your email notification preferences.": "保存邮件通知首选项设定时出现错误。", "An error occurred whilst saving your email notification preferences.": "保存邮件通知首选项设定时出现错误。",
@ -203,5 +203,24 @@
"Event sent!": "事件已发出!", "Event sent!": "事件已发出!",
"Event Type": "事件类型", "Event Type": "事件类型",
"Event Content": "事件内容", "Event Content": "事件内容",
"State Key": "状态密钥" "State Key": "状态密钥",
"Show message in desktop notification": "在桌面通知中显示信息",
"You can use the custom server options to sign into other Matrix servers by specifying a different Home server URL.<br/>This allows you to use Riot with an existing Matrix account on a different home server.<br/><br/>You can also set a custom identity server but you won't be able to invite users by email address, or be invited by email address yourself.": "您可以使用自订的服务器选项,并指定不同的主服务器 URL 来登录其他的 Matrix 服务器。<br/>这让您可以在不同的服务器上以既有的 Matrix 帐号使用 Riot。<br/><br/>您也可以设置一个自订的身份服务器,但您可能无法透过电子邮件地址来邀请用户,或是让别人透过电子邮件邀请您。",
"Toolbox": "工具箱",
"Back": "返回",
"Edit": "编辑",
"Send Account Data": "发送账户数据",
"Explore Account Data": "探索账户数据",
"Explore Room State": "探索聊天室状态",
"Unpin Message": "取消置顶消息",
"Pin Message": "置顶消息",
"Register": "注册",
"Rooms": "聊天室",
"Invite to this community": "邀请加入此社区",
"Add rooms to this community": "添加聊天室到此社区",
"Appear Offline": "似乎离线了",
"Away": "离开",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "请安装 <chromeLink>Chrome</chromeLink> 或 <firefoxLink>Firefox</firefoxLink> 以获得最佳体验。",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> 和 <operaLink>Opera</operaLink> 也能工作。",
"Reply": "回复"
} }

View File

@ -8,7 +8,7 @@
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> 與 <a href=\"http://opera.com\">Opera</a> 也能使用。", "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> 與 <a href=\"http://opera.com\">Opera</a> 也能使用。",
"Advanced notification settings": "進階通知設定", "Advanced notification settings": "進階通知設定",
"All messages": "所有訊息", "All messages": "所有訊息",
"All messages (loud)": "所有訊息(吵鬧)", "All messages (noisy)": "所有訊息(吵鬧)",
"All Rooms": "所有的聊天室", "All Rooms": "所有的聊天室",
"Call invitation": "通話邀請", "Call invitation": "通話邀請",
"Cancel": "取消", "Cancel": "取消",
@ -43,14 +43,14 @@
"Messages sent by bot": "由機器人送出的訊息", "Messages sent by bot": "由機器人送出的訊息",
"more": "更多", "more": "更多",
"Mute": "靜音", "Mute": "靜音",
"No rooms to show": "無聊天室可顯示", "No rooms to show": "未顯示聊天室",
"Noisy": "吵鬧", "Noisy": "吵鬧",
"Notifications": "通知", "Notifications": "通知",
"Off": "關閉", "Off": "關閉",
"On": "開啟", "On": "開啟",
"Operation failed": "操作失敗", "Operation failed": "操作失敗",
"powered by Matrix": "由 Matrix 架設", "powered by Matrix": "由 Matrix 架設",
"Quote": "引", "Quote": "引",
"Remove": "移除", "Remove": "移除",
"Resend": "重新傳送", "Resend": "重新傳送",
"Room not found": "找不到聊天室", "Room not found": "找不到聊天室",
@ -66,7 +66,7 @@
"Unhide Preview": "取消隱藏預覽", "Unhide Preview": "取消隱藏預覽",
"Unknown device": "未知裝置", "Unknown device": "未知裝置",
"unknown error code": "未知的錯誤代碼", "unknown error code": "未知的錯誤代碼",
"Unnamed room": "命名的聊天室", "Unnamed room": "命名的聊天室",
"Update": "更新", "Update": "更新",
"Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上傳", "Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 上傳",
"Uploading report": "上傳報告", "Uploading report": "上傳報告",
@ -109,7 +109,7 @@
"Filter room names": "過濾聊天室名稱", "Filter room names": "過濾聊天室名稱",
"Forget": "忘記", "Forget": "忘記",
"Forward Message": "轉寄訊息", "Forward Message": "轉寄訊息",
"Guests can join": "訪客可加入", "Guests can join": "訪客可加入",
"Hide panel": "隱藏面板", "Hide panel": "隱藏面板",
"I understand the risks and wish to continue": "我了解這些風險並願意繼續", "I understand the risks and wish to continue": "我了解這些風險並願意繼續",
"Invite to this room": "邀請加入這個聊天室", "Invite to this room": "邀請加入這個聊天室",
@ -141,7 +141,7 @@
"Riot is not supported on mobile web. Install the app?": "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.": "Roit 使用了許多先進的瀏覽器功能,有些在你目前所用的瀏覽器上無法使用或僅為實驗中的功能。", "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Roit 使用了許多先進的瀏覽器功能,有些在你目前所用的瀏覽器上無法使用或僅為實驗中的功能。",
"There are advanced notifications which are not shown here": "有些進階的通知並未在此顯示", "There are advanced notifications which are not shown here": "有些進階的通知並未在此顯示",
"World readable": "公開可讀", "World readable": "所有人可讀",
"You cannot delete this image. (%(code)s)": "你不能刪除這個圖片。(%(code)s)", "You cannot delete this image. (%(code)s)": "你不能刪除這個圖片。(%(code)s)",
"You are not receiving desktop notifications": "你將不會收到桌面通知", "You are not receiving desktop notifications": "你將不會收到桌面通知",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "你也許不曾在其它 Riot 之外的客戶端設定它們。在 Riot 底下你無法調整它們但其仍然可用", "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "你也許不曾在其它 Riot 之外的客戶端設定它們。在 Riot 底下你無法調整它們但其仍然可用",
@ -176,7 +176,7 @@
"Implementing VoIP services with Matrix": "使用 Matrix 實作 VoIP 服務", "Implementing VoIP services with Matrix": "使用 Matrix 實作 VoIP 服務",
"Discussion of the Identity Service API": "識別服務 API 的討論", "Discussion of the Identity Service API": "識別服務 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": "貢獻程式碼給 Matrix 與 Riot", "Contributing code to Matrix and Riot": "為 Matrix 和 Riot 做出貢獻",
"Dev chat for the Riot/Web dev team": "Riot/Web 開發團隊的開發聊天", "Dev chat for the Riot/Web dev team": "Riot/Web 開發團隊的開發聊天",
"Dev chat for the Dendrite dev team": "Dendrite 開發團隊的開發聊天", "Dev chat for the Dendrite dev team": "Dendrite 開發團隊的開發聊天",
"Co-ordination for Riot/Web translators": "Riot/Web 翻譯者的協調區", "Co-ordination for Riot/Web translators": "Riot/Web 翻譯者的協調區",
@ -217,5 +217,10 @@
"Add rooms to this community": "新增聊天室到此社群", "Add rooms to this community": "新增聊天室到此社群",
"Toolbox": "工具箱", "Toolbox": "工具箱",
"Send Account Data": "傳送帳號資料", "Send Account Data": "傳送帳號資料",
"Explore Account Data": "探索帳號資料" "Explore Account Data": "探索帳號資料",
"Appear Offline": "顯示為離線",
"Away": "離開",
"Please install <chromeLink>Chrome</chromeLink> or <firefoxLink>Firefox</firefoxLink> for the best experience.": "請安裝 <chromeLink>Chrome</chromeLink> 或 <firefoxLink>Firefox</firefoxLink> 以取得最佳體驗。",
"<safariLink>Safari</safariLink> and <operaLink>Opera</operaLink> work too.": "<safariLink>Safari</safariLink> 與 <operaLink>Opera</operaLink> 也可以運作。",
"Reply": "回覆"
} }

View File

@ -1,6 +1,7 @@
/* /*
Copyright 2015, 2016 OpenMarket Ltd Copyright 2015, 2016 OpenMarket Ltd
Copyright 2017 Vector Creations Ltd Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -23,12 +24,7 @@ html {
} }
body { body {
/* Open Sans lacks combining diacritics, so these will fall through font-family: $font-family;
to the next font. Helevetica's diacritics however do not combine
nicely with Open Sans (on OSX, at least) and result in a huge
horizontal mess. Arial empirically gets it right, hence prioritising
Arial here. */
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
font-size: 15px; font-size: 15px;
background-color: $primary-bg-color; background-color: $primary-bg-color;
color: $primary-fg-color; color: $primary-fg-color;
@ -73,7 +69,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus {
/* Required by Firefox */ /* Required by Firefox */
textarea { textarea {
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif; font-family: $font-family;
} }
/* Prevent ugly dotted highlight around selected elements in Firefox */ /* Prevent ugly dotted highlight around selected elements in Firefox */
@ -123,6 +119,23 @@ textarea {
transition: height 120ms ease-out ! important; transition: height 120ms ease-out ! important;
} }
// These are magic constants which are excluded from tinting, to let themes
// (which only have CSS, unlike skins) tell the app what their non-tinted
// colourscheme is by inspecting the stylesheet DOM.
//
// They are not used for layout!!
#mx_theme_accentColor {
color: $accent-color;
}
#mx_theme_secondaryAccentColor {
color: $secondary-accent-color;
}
#mx_theme_tertiaryAccentColor {
color: $roomsublist-label-bg-color;
}
.mx_Dialog_wrapper { .mx_Dialog_wrapper {
position: fixed; position: fixed;
z-index: 4000; z-index: 4000;
@ -210,24 +223,19 @@ textarea {
} }
.mx_Dialog button, .mx_Dialog input[type="submit"] { .mx_Dialog button, .mx_Dialog input[type="submit"] {
border: 0px; @mixin mx_DialogButton;
height: 36px;
border-radius: 40px;
border: solid 1px $accent-color;
font-weight: 600;
font-size: 14px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
margin-left: 0px; margin-left: 0px;
margin-right: 8px; margin-right: 8px;
padding-left: 1.5em;
padding-right: 1.5em;
outline: none;
cursor: pointer;
color: $accent-color;
background-color: $primary-bg-color;
/* align images in buttons (eg spinners) */ // flip colours for the secondary ones
vertical-align: middle; font-weight: 600;
border: 1px solid $accent-color ! important;
color: $accent-color;
background-color: $accent-fg-color;
}
.mx_Dialog button:hover, .mx_Dialog input[type="submit"]:hover {
@mixin mx_DialogButton_hover;
} }
.mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus { .mx_Dialog button:focus, .mx_Dialog input[type="submit"]:focus {
@ -292,26 +300,18 @@ textarea {
color: $selection-fg-color; color: $selection-fg-color;
} }
/** green button with rounded corners */
.mx_textButton { .mx_textButton {
color: $accent-fg-color; @mixin mx_DialogButton_small;
background-color: $accent-color; }
border-radius: 17px;
text-align: center; .mx_textButton:hover {
padding-left: 1em; @mixin mx_DialogButton_hover;
padding-right: 1em;
cursor: pointer;
display: inline;
} }
.mx_button_row { .mx_button_row {
margin-top: 69px; margin-top: 69px;
} }
.changelog_text {
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
}
.mx_Beta { .mx_Beta {
color: red; color: red;
margin-right: 10px; margin-right: 10px;
@ -332,3 +332,30 @@ textarea {
border: 1px solid gray; border: 1px solid gray;
background-color: darkred; background-color: darkred;
} }
.mx_TintableSvgButton {
position: relative;
display: flex;
flex-direction: row;
justify-content: center;
align-content: center;
}
.mx_TintableSvgButton object {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
max-width: 100%;
max-height: 100%;
}
.mx_TintableSvgButton span {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
opacity: 0;
cursor: pointer;
}

View File

@ -11,10 +11,12 @@
@import "./matrix-react-sdk/structures/_RoomStatusBar.scss"; @import "./matrix-react-sdk/structures/_RoomStatusBar.scss";
@import "./matrix-react-sdk/structures/_RoomView.scss"; @import "./matrix-react-sdk/structures/_RoomView.scss";
@import "./matrix-react-sdk/structures/_SearchBox.scss"; @import "./matrix-react-sdk/structures/_SearchBox.scss";
@import "./matrix-react-sdk/structures/_TagPanel.scss";
@import "./matrix-react-sdk/structures/_UploadBar.scss"; @import "./matrix-react-sdk/structures/_UploadBar.scss";
@import "./matrix-react-sdk/structures/_UserSettings.scss"; @import "./matrix-react-sdk/structures/_UserSettings.scss";
@import "./matrix-react-sdk/structures/login/_Login.scss"; @import "./matrix-react-sdk/structures/login/_Login.scss";
@import "./matrix-react-sdk/views/avatars/_BaseAvatar.scss"; @import "./matrix-react-sdk/views/avatars/_BaseAvatar.scss";
@import "./matrix-react-sdk/views/avatars/_MemberPresenceAvatar.scss";
@import "./matrix-react-sdk/views/dialogs/_BugReportDialog.scss"; @import "./matrix-react-sdk/views/dialogs/_BugReportDialog.scss";
@import "./matrix-react-sdk/views/dialogs/_ChatCreateOrReuseChatDialog.scss"; @import "./matrix-react-sdk/views/dialogs/_ChatCreateOrReuseChatDialog.scss";
@import "./matrix-react-sdk/views/dialogs/_ChatInviteDialog.scss"; @import "./matrix-react-sdk/views/dialogs/_ChatInviteDialog.scss";
@ -34,13 +36,17 @@
@import "./matrix-react-sdk/views/elements/_EditableItemList.scss"; @import "./matrix-react-sdk/views/elements/_EditableItemList.scss";
@import "./matrix-react-sdk/views/elements/_MemberEventListSummary.scss"; @import "./matrix-react-sdk/views/elements/_MemberEventListSummary.scss";
@import "./matrix-react-sdk/views/elements/_ProgressBar.scss"; @import "./matrix-react-sdk/views/elements/_ProgressBar.scss";
@import "./matrix-react-sdk/views/elements/_Quote.scss";
@import "./matrix-react-sdk/views/elements/_RichText.scss"; @import "./matrix-react-sdk/views/elements/_RichText.scss";
@import "./matrix-react-sdk/views/elements/_RoleButton.scss"; @import "./matrix-react-sdk/views/elements/_RoleButton.scss";
@import "./matrix-react-sdk/views/elements/_ToolTipButton.scss"; @import "./matrix-react-sdk/views/elements/_ToolTipButton.scss";
@import "./matrix-react-sdk/views/groups/_GroupPublicityToggle.scss";
@import "./matrix-react-sdk/views/groups/_GroupRoomList.scss"; @import "./matrix-react-sdk/views/groups/_GroupRoomList.scss";
@import "./matrix-react-sdk/views/groups/_GroupUserSettings.scss";
@import "./matrix-react-sdk/views/login/_InteractiveAuthEntryComponents.scss"; @import "./matrix-react-sdk/views/login/_InteractiveAuthEntryComponents.scss";
@import "./matrix-react-sdk/views/login/_ServerConfig.scss"; @import "./matrix-react-sdk/views/login/_ServerConfig.scss";
@import "./matrix-react-sdk/views/messages/_MEmoteBody.scss"; @import "./matrix-react-sdk/views/messages/_MEmoteBody.scss";
@import "./matrix-react-sdk/views/messages/_MFileBody.scss";
@import "./matrix-react-sdk/views/messages/_MImageBody.scss"; @import "./matrix-react-sdk/views/messages/_MImageBody.scss";
@import "./matrix-react-sdk/views/messages/_MNoticeBody.scss"; @import "./matrix-react-sdk/views/messages/_MNoticeBody.scss";
@import "./matrix-react-sdk/views/messages/_MTextBody.scss"; @import "./matrix-react-sdk/views/messages/_MTextBody.scss";
@ -59,6 +65,7 @@
@import "./matrix-react-sdk/views/rooms/_PinnedEventTile.scss"; @import "./matrix-react-sdk/views/rooms/_PinnedEventTile.scss";
@import "./matrix-react-sdk/views/rooms/_PinnedEventsPanel.scss"; @import "./matrix-react-sdk/views/rooms/_PinnedEventsPanel.scss";
@import "./matrix-react-sdk/views/rooms/_PresenceLabel.scss"; @import "./matrix-react-sdk/views/rooms/_PresenceLabel.scss";
@import "./matrix-react-sdk/views/rooms/_QuotePreview.scss";
@import "./matrix-react-sdk/views/rooms/_RoomHeader.scss"; @import "./matrix-react-sdk/views/rooms/_RoomHeader.scss";
@import "./matrix-react-sdk/views/rooms/_RoomList.scss"; @import "./matrix-react-sdk/views/rooms/_RoomList.scss";
@import "./matrix-react-sdk/views/rooms/_RoomPreviewBar.scss"; @import "./matrix-react-sdk/views/rooms/_RoomPreviewBar.scss";
@ -80,7 +87,9 @@
@import "./vector-web/structures/_RoomSubList.scss"; @import "./vector-web/structures/_RoomSubList.scss";
@import "./vector-web/structures/_ViewSource.scss"; @import "./vector-web/structures/_ViewSource.scss";
@import "./vector-web/views/context_menus/_MessageContextMenu.scss"; @import "./vector-web/views/context_menus/_MessageContextMenu.scss";
@import "./vector-web/views/context_menus/_PresenceContextMenuOption.scss";
@import "./vector-web/views/context_menus/_RoomTileContextMenu.scss"; @import "./vector-web/views/context_menus/_RoomTileContextMenu.scss";
@import "./vector-web/views/context_menus/_TagTileContextMenu.scss";
@import "./vector-web/views/dialogs/_ChangelogDialog.scss"; @import "./vector-web/views/dialogs/_ChangelogDialog.scss";
@import "./vector-web/views/dialogs/_DevtoolsDialog.scss"; @import "./vector-web/views/dialogs/_DevtoolsDialog.scss";
@import "./vector-web/views/dialogs/_SetEmailDialog.scss"; @import "./vector-web/views/dialogs/_SetEmailDialog.scss";
@ -89,6 +98,7 @@
@import "./vector-web/views/elements/_ImageView.scss"; @import "./vector-web/views/elements/_ImageView.scss";
@import "./vector-web/views/elements/_InlineSpinner.scss"; @import "./vector-web/views/elements/_InlineSpinner.scss";
@import "./vector-web/views/elements/_Spinner.scss"; @import "./vector-web/views/elements/_Spinner.scss";
@import "./vector-web/views/elements/_SyntaxHighlight.scss";
@import "./vector-web/views/globals/_MatrixToolbar.scss"; @import "./vector-web/views/globals/_MatrixToolbar.scss";
@import "./vector-web/views/messages/_DateSeparator.scss"; @import "./vector-web/views/messages/_DateSeparator.scss";
@import "./vector-web/views/messages/_MessageTimestamp.scss"; @import "./vector-web/views/messages/_MessageTimestamp.scss";

View File

@ -94,6 +94,60 @@ limitations under the License.
left: 1px; left: 1px;
} }
.mx_ContextualMenu.mx_ContextualMenu_top {
top: 8px;
}
.mx_ContextualMenu_chevron_top {
position: absolute;
left: 0px;
top: -8px;
width: 0;
height: 0;
border-left: 8px solid transparent;
border-bottom: 8px solid $menu-border-color;
border-right: 8px solid transparent;
}
.mx_ContextualMenu_chevron_top:after{
content:'';
width: 0;
height: 0;
border-left: 7px solid transparent;
border-bottom: 7px solid $menu-bg-color;
border-right: 7px solid transparent;
position:absolute;
left: -7px;
top: 1px;
}
.mx_ContextualMenu.mx_ContextualMenu_bottom {
bottom: 8px;
}
.mx_ContextualMenu_chevron_bottom {
position: absolute;
left: 0px;
bottom: -8px;
width: 0;
height: 0;
border-left: 8px solid transparent;
border-top: 8px solid $menu-border-color;
border-right: 8px solid transparent;
}
.mx_ContextualMenu_chevron_bottom:after{
content:'';
width: 0;
height: 0;
border-left: 7px solid transparent;
border-top: 7px solid $menu-bg-color;
border-right: 7px solid transparent;
position:absolute;
left: -7px;
bottom: 1px;
}
.mx_ContextualMenu_field { .mx_ContextualMenu_field {
padding: 3px 6px 3px 6px; padding: 3px 6px 3px 6px;
cursor: pointer; cursor: pointer;

View File

@ -90,6 +90,8 @@ limitations under the License.
.mx_GroupView_header_leftCol { .mx_GroupView_header_leftCol {
flex: 1; flex: 1;
overflow: hidden;
} }
.mx_GroupView_header_rightCol { .mx_GroupView_header_rightCol {

View File

@ -94,7 +94,7 @@ limitations under the License.
text-align: center; text-align: center;
} }
.mx_MyGroups_joinedGroups .gm-scroll-view { .mx_MyGroups_joinedGroups {
border-top: 1px solid $primary-hairline-color; border-top: 1px solid $primary-hairline-color;
overflow-x: hidden; overflow-x: hidden;
@ -104,7 +104,7 @@ limitations under the License.
align-content: flex-start; align-content: flex-start;
} }
.mx_MyGroups_joinedGroups .gm-scroll-view .mx_GroupTile { .mx_MyGroups_joinedGroups .mx_GroupTile {
min-width: 300px; min-width: 300px;
max-width: 33%; max-width: 33%;
flex: 1 0 300px; flex: 1 0 300px;
@ -115,6 +115,10 @@ limitations under the License.
cursor: pointer; cursor: pointer;
} }
.mx_GroupTile_avatar {
cursor: grab, -webkit-grab;
}
.mx_GroupTile_profile { .mx_GroupTile_profile {
margin-left: 10px; margin-left: 10px;
display: flex; display: flex;
@ -122,13 +126,13 @@ limitations under the License.
justify-content: center; justify-content: center;
} }
.mx_GroupTile_profile h3.mx_GroupTile_name, .mx_GroupTile_profile .mx_GroupTile_name,
.mx_GroupTile_profile .mx_GroupTile_groupId, .mx_GroupTile_profile .mx_GroupTile_groupId,
.mx_GroupTile_profile .mx_GroupTile_desc { .mx_GroupTile_profile .mx_GroupTile_desc {
padding-right: 10px; padding-right: 10px;
} }
.mx_GroupTile_profile h3.mx_GroupTile_name { .mx_GroupTile_profile .mx_GroupTile_name {
margin: 0px; margin: 0px;
font-size: 15px; font-size: 15px;
} }

View File

@ -21,6 +21,8 @@ limitations under the License.
padding-top: 24px; padding-top: 24px;
padding-bottom: 22px; padding-bottom: 22px;
border-bottom: 1px solid $panel-divider-color;
display: flex; display: flex;
} }
@ -38,7 +40,7 @@ limitations under the License.
.mx_SearchBox_search { .mx_SearchBox_search {
flex: 1 1 auto; flex: 1 1 auto;
width: 0px; width: 0px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif; font-family: $font-family;
font-size: 12px; font-size: 12px;
margin-top: -2px; margin-top: -2px;
height: 24px; height: 24px;

View File

@ -0,0 +1,97 @@
/*
Copyright 2017 New Vector 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_TagPanel {
flex: 0 0 60px;
background-color: $tertiary-accent-color;
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
}
.mx_TagPanel .mx_TagPanel_tagTileContainer {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 65px;
flex-grow: 1;
}
.mx_TagPanel .mx_TagTile {
padding: 6px 3px;
opacity: 0.5;
position: relative;
}
.mx_TagPanel .mx_TagTile:focus,
.mx_TagPanel .mx_TagTile:hover,
.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
opacity: 1;
}
.mx_TagPanel .mx_TagTile.mx_TagTile_selected {
/* To offset border of mx_TagTile_avatar */
padding: 3px 0px;
}
.mx_TagPanel .mx_TagTile.mx_TagTile_selected .mx_TagTile_avatar {
border: 3px solid $accent-color;
border-radius: 60px;
}
.mx_TagPanel .mx_TagTile.mx_AccessibleButton:focus {
filter: none;
}
.mx_TagTile_tooltip {
position: relative;
top: -30px;
left: 5px;
}
.mx_TagTile_context_button {
min-width: 15px;
height: 15px;
position: absolute;
right: -5px;
top: 1px;
border-radius: 8px;
background-color: $neutral-badge-color;
color: #ffffff;
font-weight: 600;
font-size: 10px;
text-align: center;
padding-top: 1px;
padding-left: 4px;
padding-right: 4px;
}
.mx_TagPanel_createGroupButton {
opacity: 0.5;
margin-bottom: 17px;
height: 25px;
}
.mx_TagPanel_createGroupButton:hover {
opacity: 1;
}
.mx_TagPanel_createGroupButton object {
pointer-events: none;
}

View File

@ -64,30 +64,13 @@ limitations under the License.
} }
.mx_UserSettings_button { .mx_UserSettings_button {
@mixin mx_DialogButton;
display: inline; display: inline;
vertical-align: middle;
border: 0px;
border-radius: 36px;
font-weight: 400;
font-size: 16px;
color: $accent-fg-color;
background-color: $accent-color;
width: auto;
margin: auto; margin: auto;
padding: 7px;
padding-left: 1.5em;
padding-right: 1.5em;
cursor: pointer;
} }
.mx_UserSettings_button.mx_UserSettings_buttonSmall { .mx_UserSettings_button:hover {
height: 36px; @mixin mx_DialogButton_hover;
padding: 4px;
padding-left: 7px;
padding-right: 7px;
font-size: 12px;
margin-right: 5px;
line-height: 12px;
} }
.mx_UserSettings_button.danger { .mx_UserSettings_button.danger {

View File

@ -26,7 +26,6 @@ limitations under the License.
} }
.mx_Login h2 { .mx_Login h2 {
color: $primary-fg-color;
font-weight: 300; font-weight: 300;
margin-top: 32px; margin-top: 32px;
margin-bottom: 20px; margin-bottom: 20px;
@ -80,15 +79,14 @@ limitations under the License.
} }
.mx_Login_submit { .mx_Login_submit {
@mixin mx_DialogButton;
width: 100%;
margin-top: 35px; margin-top: 35px;
margin-bottom: 24px; margin-bottom: 24px;
width: 100%; }
border-radius: 40px;
height: 40px; .mx_Login_submit:hover {
border: 0px; @mixin mx_DialogButton_hover;
background-color: $accent-color;
font-size: 15px;
color: $accent-fg-color;
} }
.mx_Login_submit:disabled { .mx_Login_submit:disabled {
@ -137,8 +135,7 @@ limitations under the License.
} }
.mx_Login_forgot { .mx_Login_forgot {
font-size: 13px; font-size: 15px;
opacity: 0.8;
} }
.mx_Login_forgot:link { .mx_Login_forgot:link {
@ -224,7 +221,6 @@ limitations under the License.
height: 16px; height: 16px;
flex-shrink: 1; flex-shrink: 1;
min-width: 0px; min-width: 0px;
border-radius: 3px;
} }
.mx_Login_phoneNumberField { .mx_Login_phoneNumberField {

View File

@ -31,5 +31,5 @@ limitations under the License.
.mx_BaseAvatar_image { .mx_BaseAvatar_image {
border-radius: 40px; border-radius: 40px;
vertical-align: top; vertical-align: top;
background-color: #fff; background-color: $avatar-bg-color;
} }

View File

@ -0,0 +1,43 @@
/*
Copyright 2017 Travis Ralston
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_MemberPresenceAvatar {
display: inline-block;
position: relative;
}
.mx_MemberPresenceAvatar_status {
display: block;
width: 10px;
height: 10px;
border-radius: 10px;
position: absolute;
bottom: -2px;
right: -3px;
}
.mx_MemberPresenceAvatar_status_online {
background-color: $presence-online;
}
.mx_MemberPresenceAvatar_status_unavailable {
background-color: $presence-unavailable;
}
.mx_MemberPresenceAvatar_status_offline {
background-color: $presence-offline;
}

View File

@ -28,7 +28,7 @@ limitations under the License.
{ {
height: 26px; height: 26px;
font-size: 14px; font-size: 14px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif; font-family: $font-family;
padding-left: 12px; padding-left: 12px;
padding-right: 12px; padding-right: 12px;
margin: 0 !important; margin: 0 !important;

View File

@ -34,7 +34,7 @@ limitations under the License.
} }
.mx_ConfirmUserActionDialog_reasonField { .mx_ConfirmUserActionDialog_reasonField {
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif; font-family: $font-family;
font-size: 14px; font-size: 14px;
color: $primary-fg-color; color: $primary-fg-color;
background-color: $primary-bg-color; background-color: $primary-bg-color;

View File

@ -21,19 +21,7 @@ limitations under the License.
} }
.mx_EncryptedEventDialog .mx_MemberDeviceInfo_textButton { .mx_EncryptedEventDialog .mx_MemberDeviceInfo_textButton {
border: 0px; @mixin mx_DialogButton;
height: 36px;
border-radius: 40px;
border: solid 1px $accent-color;
font-weight: 600;
font-size: 14px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
margin-left: 0px;
margin-right: 8px;
padding-left: 1.5em;
padding-right: 1.5em;
outline: none;
cursor: pointer;
color: $accent-color;
background-color: $primary-bg-color; background-color: $primary-bg-color;
color: $accent-color;
} }

View File

@ -43,22 +43,9 @@ limitations under the License.
} }
.mx_UnknownDeviceDialog .mx_MemberDeviceInfo_textButton { .mx_UnknownDeviceDialog .mx_MemberDeviceInfo_textButton {
border: 0px; @mixin mx_DialogButton_small;
height: 24px;
border-radius: 40px;
border: solid 1px $accent-color;
font-weight: 600;
font-size: 13px;
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
margin-left: 0px;
margin-right: 8px;
padding-left: 0.5em;
padding-right: 0.5em;
width: 85px;
outline: none;
cursor: pointer;
color: $accent-color;
background-color: $primary-bg-color; background-color: $primary-bg-color;
color: $accent-color;
} }
.mx_UnknownDeviceDialog .mx_UnknownDeviceDialog_deviceList li { .mx_UnknownDeviceDialog .mx_UnknownDeviceDialog_deviceList li {

View File

@ -0,0 +1,26 @@
/*
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_Quote .mx_DateSeparator {
font-size: 1em !important;
margin-bottom: 0;
padding-bottom: 1px;
bottom: -5px;
}
.mx_Quote_show {
cursor: pointer;
}

View File

@ -0,0 +1,42 @@
/*
Copyright 2017 New Vector 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_GroupPublicity_toggle {
display: flex;
align-items: center;
margin: 8px;
}
.mx_GroupPublicity_toggle > label {
display: flex;
align-items: flex-start;
}
.mx_GroupPublicity_toggle > label,
.mx_GroupPublicity_toggle .mx_GroupTile {
width: 50%;
}
.mx_GroupPublicity_toggle input {
margin-right: 8px;
vertical-align: -4px;
}
.mx_GroupPublicity_toggle .mx_GroupTile {
display: flex;
align-items: flex-start;
cursor: pointer;
}

View File

@ -0,0 +1,23 @@
/*
Copyright 2017 New Vector 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_GroupUserSettings_groupPublicity_scrollbox {
height: 200px;
border: 1px solid $primary-hairline-color;
border-radius: 3px;
margin-right: 32px;
overflow: hidden;
}

View File

@ -0,0 +1,47 @@
/*
Copyright 2015, 2016 OpenMarket 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_MFileBody_download {
color: $accent-color;
}
.mx_MFileBody_download a {
color: $accent-color;
text-decoration: none;
cursor: pointer;
}
.mx_MFileBody_download object {
margin-left: -16px;
padding-right: 4px;
margin-top: -4px;
vertical-align: middle;
pointer-events: none;
}
/* Remove the border and padding for iframes for download links. */
.mx_MFileBody_download iframe {
margin: 0px;
padding: 0px;
border: none;
width: 100%;
/* Set the height of the iframe to be 1 line of text.
* Iframes don't automatically size themselves to fit their content.
* So either we have to fix the height of the iframe using CSS or
* use javascript's cross-origin postMessage API to communicate how
* big the content of the iframe is. */
height: 1.5em;
}

View File

@ -27,34 +27,3 @@ limitations under the License.
border-radius: 1px; border-radius: 1px;
*/ */
} }
.mx_MImageBody_download {
color: $accent-color;
}
.mx_MImageBody_download a {
color: $accent-color;
text-decoration: none;
}
.mx_MImageBody_download object {
margin-left: -16px;
padding-right: 4px;
margin-top: -4px;
vertical-align: middle;
pointer-events: none;
}
/* Remove the border and padding for iframes for download links. */
.mx_MImageBody_download iframe {
margin: 0px;
padding: 0px;
border: none;
width: 100%;
/* Set the height of the iframe to be 1 line of text.
* Iframes don't automatically size themselves to fit their content.
* So either we have to fix the height of the iframe using CSS or
* use javascript's cross-origin postMessage API to communicate how
* big the content of the iframe is. */
height: 1.5em;
}

View File

@ -14,8 +14,9 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
// .mx_AppsDrawer { .mx_AppsDrawer {
// } margin: 5px;
}
.mx_AppsContainer { .mx_AppsContainer {
display: flex; display: flex;
@ -75,17 +76,32 @@ limitations under the License.
} }
.mx_AppTileMenuBar { .mx_AppTileMenuBar {
// height: 15px;
margin: 0; margin: 0;
padding: 2px 10px; padding: 2px 10px;
// background-color: $e2e-verified-color;
border-bottom: 1px solid $primary-hairline-color; border-bottom: 1px solid $primary-hairline-color;
font-size: 10px; font-size: 10px;
background-color: $widget-menu-bar-bg-color;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
cursor: pointer;
}
.mx_AppTileMenuBarTitle {
display: flex;
flex-direction: row;
align-items: center;
pointer-events: none;
} }
.mx_AppTileMenuBarWidgets { .mx_AppTileMenuBarWidgets {
float: right; float: right;
display: flex;
flex-direction: row;
align-items: center;
} }
.mx_AppTileMenuBarWidget { .mx_AppTileMenuBarWidget {
// pointer-events: none; // pointer-events: none;
cursor: pointer; cursor: pointer;
@ -101,7 +117,7 @@ limitations under the License.
} }
.mx_AppTileMenuBarWidget:hover { .mx_AppTileMenuBarWidget:hover {
border: 1px solid $primary-hairline-color; border: 1px solid $primary-fg-color;
border-radius: 2px; border-radius: 2px;
} }
@ -193,8 +209,12 @@ form.mx_Custom_Widget_Form div {
.mx_AppPermissionWarning { .mx_AppPermissionWarning {
text-align: center; text-align: center;
padding: 30px 0;
background-color: $primary-bg-color; background-color: $primary-bg-color;
display: flex;
height: 100%;
flex-direction: column;
justify-content: center;
align-items: center;
} }
.mx_AppPermissionWarningImage { .mx_AppPermissionWarningImage {

View File

@ -1,7 +1,7 @@
.mx_Autocomplete { .mx_Autocomplete {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
z-index: 1000; z-index: 1001;
width: 100%; width: 100%;
border: 1px solid $primary-hairline-color; border: 1px solid $primary-hairline-color;
background: $primary-bg-color; background: $primary-bg-color;
@ -90,3 +90,4 @@
.mx_Autocomplete_Completion_description { .mx_Autocomplete_Completion_description {
color: gray; color: gray;
} }

View File

@ -96,6 +96,10 @@ limitations under the License.
line-height: 22px; line-height: 22px;
} }
.mx_EventTile_quote {
margin-right: 10px;
}
.mx_EventTile_info .mx_EventTile_line { .mx_EventTile_info .mx_EventTile_line {
padding-left: 83px; padding-left: 83px;
} }
@ -109,13 +113,13 @@ limitations under the License.
/* this is used for the tile for the event which is selected via the URL. /* this is used for the tile for the event which is selected via the URL.
* TODO: ultimately we probably want some transition on here. * TODO: ultimately we probably want some transition on here.
*/ */
.mx_EventTile_selected .mx_EventTile_line { .mx_EventTile_selected > .mx_EventTile_line {
border-left: $accent-color 5px solid; border-left: $accent-color 5px solid;
padding-left: 60px; padding-left: 60px;
background-color: $event-selected-color; background-color: $event-selected-color;
} }
.mx_EventTile:hover .mx_EventTile_line, .mx_EventTile:hover .mx_EventTile_line:not(.mx_EventTile_quote),
.mx_EventTile.menu .mx_EventTile_line .mx_EventTile.menu .mx_EventTile_line
{ {
background-color: $event-selected-color; background-color: $event-selected-color;
@ -156,18 +160,17 @@ limitations under the License.
.mx_EventTile_redacted .mx_EventTile_line .mx_UnknownBody { .mx_EventTile_redacted .mx_EventTile_line .mx_UnknownBody {
display: block; display: block;
width: 100%; width: 100%;
height: 36px; height: 22px;
background-image: $event-redacted-img; width: 250px;
background-repeat: no-repeat; border-radius: 11px;
background-size: contain; background: repeating-linear-gradient(
} -45deg,
$event-redacted-fg-color,
.mx_EventTile.mx_EventTile_redacted .mx_EventTile_line { $event-redacted-fg-color 3px,
/* transparent 3px,
Prevent changing colour of the background because transparent 6px
$event-redacted-img matches $primary-bg-color );
*/ box-shadow: 0px 0px 3px $event-redacted-border-color inset;
background-color: initial !important;
} }
.mx_EventTile_highlight, .mx_EventTile_highlight,
@ -210,7 +213,7 @@ limitations under the License.
visibility: visible; visibility: visible;
} }
.mx_EventTile_selected .mx_MessageTimestamp { .mx_EventTile_selected > div > a > .mx_MessageTimestamp {
left: 3px; left: 3px;
width: auto; width: auto;
} }
@ -225,6 +228,10 @@ limitations under the License.
width: 19px; width: 19px;
height: 19px; height: 19px;
background-image: url($edit-button-url); background-image: url($edit-button-url);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
} }
.mx_EventTile:hover .mx_EventTile_editButton, .mx_EventTile:hover .mx_EventTile_editButton,

View File

@ -26,19 +26,15 @@ limitations under the License.
} }
.mx_MemberDeviceInfo_textButton { .mx_MemberDeviceInfo_textButton {
color: $accent-fg-color; @mixin mx_DialogButton_small;
background-color: $accent-color;
border-radius: 17px;
text-align: center;
padding-left: 1em;
padding-right: 1em;
border: 0px;
font-size: 14px;
cursor: pointer;
margin: 2px; margin: 2px;
flex: 1; flex: 1;
} }
.mx_MemberDeviceInfo_textButton:hover {
@mixin mx_DialogButton_hover;
}
.mx_MemberDeviceInfo_deviceId { .mx_MemberDeviceInfo_deviceId {
font-size: 13px; font-size: 13px;
} }

Some files were not shown because too many files have changed in this diff Show More