This commit is contained in:
David Baker 2017-05-23 14:12:53 +01:00
parent 7d59742a22
commit 6b6fa59f3e
36 changed files with 7547 additions and 186 deletions

View file

@ -18,7 +18,8 @@ limitations under the License.
var React = require('react');
var ReactDOM = require('react-dom');
var sdk = require('matrix-react-sdk')
var sdk = require('matrix-react-sdk');
import _t from 'counterpart-riot';
var dis = require('matrix-react-sdk/lib/dispatcher');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
@ -120,7 +121,7 @@ module.exports = React.createClass({
homeButton = (
<AccessibleButton className="mx_BottomLeftMenu_homePage" onClick={ this.onHomeClick } onMouseEnter={ this.onHomeMouseEnter } onMouseLeave={ this.onHomeMouseLeave } >
<TintableSvg src="img/icons-home.svg" width="25" height="25" />
{ this.getLabel("Welcome page", this.state.homeHover) }
{ this.getLabel(_t("Welcome page"), this.state.homeHover) }
</AccessibleButton>
);
}
@ -131,19 +132,19 @@ module.exports = React.createClass({
{ homeButton }
<AccessibleButton className="mx_BottomLeftMenu_people" onClick={ this.onPeopleClick } onMouseEnter={ this.onPeopleMouseEnter } onMouseLeave={ this.onPeopleMouseLeave } >
<TintableSvg src="img/icons-people.svg" width="25" height="25" />
{ this.getLabel("Start chat", this.state.peopleHover) }
{ this.getLabel(_t("Start chat"), this.state.peopleHover) }
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_directory" onClick={ this.onDirectoryClick } onMouseEnter={ this.onDirectoryMouseEnter } onMouseLeave={ this.onDirectoryMouseLeave } >
<TintableSvg src="img/icons-directory.svg" width="25" height="25"/>
{ this.getLabel("Room directory", this.state.directoryHover) }
{ this.getLabel(_t("Room directory"), this.state.directoryHover) }
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_createRoom" onClick={ this.onRoomsClick } onMouseEnter={ this.onRoomsMouseEnter } onMouseLeave={ this.onRoomsMouseLeave } >
<TintableSvg src="img/icons-create-room.svg" width="25" height="25" />
{ this.getLabel("Create new room", this.state.roomsHover) }
{ this.getLabel(_t("Create new room"), this.state.roomsHover) }
</AccessibleButton>
<AccessibleButton className="mx_BottomLeftMenu_settings" onClick={ this.onSettingsClick } onMouseEnter={ this.onSettingsMouseEnter } onMouseLeave={ this.onSettingsMouseLeave } >
<TintableSvg src="img/icons-settings.svg" width="25" height="25" />
{ this.getLabel("Settings", this.state.settingsHover) }
{ this.getLabel(_t("Settings"), this.state.settingsHover) }
</AccessibleButton>
</div>
</div>

View file

@ -16,14 +16,15 @@ limitations under the License.
'use strict';
var React = require('react');
var sdk = require('matrix-react-sdk');
var Matrix = require("matrix-js-sdk");
var dis = require('matrix-react-sdk/lib/dispatcher');
var MatrixClientPeg = require("matrix-react-sdk/lib/MatrixClientPeg");
var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
var Modal = require('matrix-react-sdk/lib/Modal');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
import React from 'react';
import _t from 'counterpart-riot';
import sdk from 'matrix-react-sdk';
import Matrix from "matrix-js-sdk";
import dis from 'matrix-react-sdk/lib/dispatcher';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import rate_limited_func from 'matrix-react-sdk/lib/ratelimitedfunc';
import Modal from 'matrix-react-sdk/lib/Modal';
import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton';
module.exports = React.createClass({
displayName: 'RightPanel',
@ -34,7 +35,7 @@ module.exports = React.createClass({
collapsed: React.PropTypes.bool, // currently unused property to request for a minimized view of the panel
},
Phase : {
Phase: {
MemberList: 'MemberList',
FilePanel: 'FilePanel',
NotificationPanel: 'NotificationPanel',
@ -91,8 +92,8 @@ module.exports = React.createClass({
if (MatrixClientPeg.get().isGuest()) {
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
Modal.createDialog(NeedToRegisterDialog, {
title: "Please Register",
description: "Guest users can't invite users. Please register to invite."
title: _t('Please Register'),
description: _t('Guest users can\'t invite users. Please register to invite') + '.'
});
return;
}
@ -188,7 +189,7 @@ module.exports = React.createClass({
<div className="mx_RightPanel_icon" >
<TintableSvg src="img/icon-invite-people.svg" width="35" height="35" />
</div>
<div className="mx_RightPanel_message">Invite to this room</div>
<div className="mx_RightPanel_message">{ _t('Invite to this room') }</div>
</AccessibleButton>;
}
@ -197,30 +198,30 @@ module.exports = React.createClass({
if (this.props.roomId) {
buttonGroup =
<div className="mx_RightPanel_headerButtonGroup">
<AccessibleButton className="mx_RightPanel_headerButton"
title="Members" onClick={ this.onMemberListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">{ membersBadge ? membersBadge : <span>&nbsp;</span>}</div>
<TintableSvg src="img/icons-people.svg" width="25" height="25"/>
{ membersHighlight }
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_filebutton"
title="Files" onClick={ this.onFileListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-files.svg" width="25" height="25"/>
{ filesHighlight }
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_notificationbutton"
title="Notifications" onClick={ this.onNotificationListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-notifications.svg" width="25" height="25"/>
{ notificationsHighlight }
</AccessibleButton>
<div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" title="Hide panel" onClick={ this.onCollapseClick }>
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
</div>
</div>;
<AccessibleButton className="mx_RightPanel_headerButton"
title={ _t('Members') } onClick={ this.onMemberListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">{ membersBadge ? membersBadge : <span>&nbsp;</span>}</div>
<TintableSvg src="img/icons-people.svg" width="25" height="25"/>
{ membersHighlight }
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_filebutton"
title={ _t('Files') } onClick={ this.onFileListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-files.svg" width="25" height="25"/>
{ filesHighlight }
</AccessibleButton>
<AccessibleButton
className="mx_RightPanel_headerButton mx_RightPanel_notificationbutton"
title={ _t('Notifications') } onClick={ this.onNotificationListButtonClick }>
<div className="mx_RightPanel_headerButton_badge">&nbsp;</div>
<TintableSvg src="img/icons-notifications.svg" width="25" height="25"/>
{ notificationsHighlight }
</AccessibleButton>
<div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" title="Hide panel" onClick={ this.onCollapseClick }>
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
</div>
</div>;
}
if (!this.props.collapsed) {

View file

@ -30,6 +30,8 @@ var linkifyMatrix = require('matrix-react-sdk/lib/linkify-matrix');
var sanitizeHtml = require('sanitize-html');
var q = require('q');
import _t from 'counterpart-riot';
import {instanceForInstanceId, protocolNameForInstanceId} from '../../utils/DirectoryUtils';
linkifyMatrix(linkify);
@ -80,8 +82,8 @@ module.exports = React.createClass({
}
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get protocol list from Home Server",
description: "The Home Server may be too old to support third party networks",
title: _t('Failed to get protocol list from Home Server'),
description: _t('The Home Server may be too old to support third party networks'),
});
});
@ -176,8 +178,8 @@ module.exports = React.createClass({
console.error("Failed to get publicRooms: %s", JSON.stringify(err));
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get public room list",
description: ((err && err.message) ? err.message : "The server may be unavailable or overloaded"),
title: _t('Failed to get public room list'),
description: ((err && err.message) ? err.message : _t('The server may be unavailable or overloaded'))
});
});
},
@ -191,31 +193,31 @@ module.exports = React.createClass({
*/
removeFromDirectory: function(room) {
var alias = get_display_alias_for_room(room);
var name = room.name || alias || "Unnamed room";
var name = room.name || alias || _t('Unnamed room');
var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
var desc;
if (alias) {
desc = `Delete the room alias '${alias}' and remove '${name}' from the directory?`;
desc = _t('Delete the room alias %(alias)s and remove %(name)s from the directory?', {alias: alias, name: name});
} else {
desc = `Remove '${name}' from the directory?`;
desc = _t('Remove %(name)s from the directory?', {name: name});
}
Modal.createDialog(QuestionDialog, {
title: "Remove from Directory",
title: _t('Remove from Directory'),
description: desc,
onFinished: (should_delete) => {
if (!should_delete) return;
var Loader = sdk.getComponent("elements.Spinner");
var modal = Modal.createDialog(Loader);
var step = `remove '${name}' from the directory.`;
var step = _t('remove %(name)s from the directory', {name: name}) + '.';
MatrixClientPeg.get().setRoomDirectoryVisibility(room.room_id, 'private').then(() => {
if (!alias) return;
step = 'delete the alias.';
step = _t('delete the alias') + '.';
return MatrixClientPeg.get().deleteAlias(alias);
}).done(() => {
modal.close();
@ -225,8 +227,8 @@ module.exports = React.createClass({
this.refreshRoomList();
console.error("Failed to " + step + ": " + err);
Modal.createDialog(ErrorDialog, {
title: "Failed to " + step,
description: ((err && err.message) ? err.message : "The server may be unavailable or overloaded"),
title: _t('Error'),
description: ((err && err.message) ? err.message : _t('The server may be unavailable or overloaded'))
});
});
}
@ -314,8 +316,8 @@ module.exports = React.createClass({
if (!fields) {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Unable to join network",
description: "Riot does not know how to join a room on this network",
title: _t('Unable to join network'),
description: _t('Riot does not know how to join a room on this network'),
});
return;
}
@ -325,15 +327,15 @@ module.exports = React.createClass({
} else {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Room not found",
description: "Couldn't find a matching Matrix room",
title: _t('Room not found'),
description: _t('Couldn\'t find a matching Matrix room'),
});
}
}, (e) => {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Fetching third party location failed",
description: "Unable to look up room ID from server",
title: _t('Fetching third party location failed'),
description: _t('Unable to look up room ID from server'),
});
});
}
@ -353,8 +355,8 @@ module.exports = React.createClass({
if (!room.world_readable && !room.guest_can_join) {
var NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog");
Modal.createDialog(NeedToRegisterDialog, {
title: "Failed to join the room",
description: "This room is inaccessible to guests. You may be able to join if you register."
title: _t('Failed to join the room'),
description: _t('This room is inaccessible to guests. You may be able to join if you register') + '.'
});
return;
}
@ -368,7 +370,7 @@ module.exports = React.createClass({
avatarUrl: room.avatar_url,
// XXX: This logic is duplicated from the JS SDK which
// would normally decide what the name is.
name: room.name || room_alias || "Unnamed room",
name: room.name || room_alias || _t('Unnamed room'),
};
}
// It's not really possible to join Matrix rooms by ID because the HS has no way to know
@ -393,18 +395,18 @@ module.exports = React.createClass({
var self = this;
var guestRead, guestJoin, perms;
for (var i = 0; i < rooms.length; i++) {
var name = rooms[i].name || get_display_alias_for_room(rooms[i]) || "Unnamed room";
var name = rooms[i].name || get_display_alias_for_room(rooms[i]) || _t('Unnamed room');
guestRead = null;
guestJoin = null;
if (rooms[i].world_readable) {
guestRead = (
<div className="mx_RoomDirectory_perm">World readable</div>
<div className="mx_RoomDirectory_perm">{ _t('World readable') }</div>
);
}
if (rooms[i].guest_can_join) {
guestJoin = (
<div className="mx_RoomDirectory_perm">Guests can join</div>
<div className="mx_RoomDirectory_perm">{ _t('Guests can join') }</div>
);
}
@ -493,7 +495,7 @@ module.exports = React.createClass({
if (this.state.protocolsLoading) {
return (
<div className="mx_RoomDirectory">
<SimpleRoomHeader title="Directory" />
<SimpleRoomHeader title={ _t('Directory') } />
<Loader />
</div>
);
@ -511,7 +513,7 @@ module.exports = React.createClass({
// request from the scrollpanel because there isn't one
let scrollpanel_content;
if (rows.length == 0) {
scrollpanel_content = <i>No rooms to show</i>;
scrollpanel_content = <i>{ _t('No rooms to show') }</i>;
} else {
scrollpanel_content = <table ref="directory_table" className="mx_RoomDirectory_table">
<tbody>
@ -545,9 +547,9 @@ module.exports = React.createClass({
}
let placeholder = 'Search for a room';
let placeholder = _t('Search for a room');
if (!this.state.instanceId) {
placeholder = '#example:' + this.state.roomServer;
placeholder = _t('#example') + ':' + this.state.roomServer;
} else if (instance_expected_field_type) {
placeholder = instance_expected_field_type.placeholder;
}
@ -564,7 +566,7 @@ module.exports = React.createClass({
const DirectorySearchBox = sdk.getComponent('elements.DirectorySearchBox');
return (
<div className="mx_RoomDirectory">
<SimpleRoomHeader title="Directory" icon="img/icons-directory.svg"/>
<SimpleRoomHeader title={ _t('Directory') } icon="img/icons-directory.svg" />
<div className="mx_RoomDirectory_list">
<div className="mx_RoomDirectory_listheader">
<DirectorySearchBox

View file

@ -20,7 +20,8 @@ var React = require('react');
var ReactDOM = require('react-dom');
var classNames = require('classnames');
var DropTarget = require('react-dnd').DropTarget;
var sdk = require('matrix-react-sdk')
var sdk = require('matrix-react-sdk');
import _t from 'counterpart-riot';
var dis = require('matrix-react-sdk/lib/dispatcher');
var Unread = require('matrix-react-sdk/lib/Unread');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
@ -463,7 +464,7 @@ var RoomSubList = React.createClass({
return (
<AccessibleButton className="mx_RoomSubList_ellipsis" onClick={this._showFullMemberList}>
<div className="mx_RoomSubList_line"></div>
<div className="mx_RoomSubList_more">more</div>
<div className="mx_RoomSubList_more">{ _t("more") }</div>
<div className={ badgeClasses }>{ content }</div>
</AccessibleButton>
);
@ -509,8 +510,8 @@ var RoomSubList = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + self.props.tagName + " to room" + err);
Modal.createDialog(ErrorDialog, {
title: "Failed to add tag " + self.props.tagName + " to room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to add tag %(tagName)s to room', {tagName: self.props.tagName}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
break;
@ -530,7 +531,7 @@ var RoomSubList = React.createClass({
var target;
if (this.state.sortedList.length == 0 && this.props.editable) {
target = <RoomDropTarget label={ 'Drop here to ' + this.props.verb }/>;
target = <RoomDropTarget label={ _t("Drop here %(toAction)s", {toAction: this.props.verb}) }/>;
}
if (this.state.sortedList.length > 0 || this.props.editable) {

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
import _t from 'counterpart-riot';
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
@ -134,7 +135,7 @@ module.exports = React.createClass({
className="mx_SearchBox_search"
value={ this.state.searchTerm }
onChange={ this.onChange }
placeholder="Filter room names"
placeholder={ _t('Filter room names') }
/>
];
}

View file

@ -21,6 +21,7 @@ var React = require('react');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var dis = require('matrix-react-sdk/lib/dispatcher');
var sdk = require('matrix-react-sdk');
import _t from 'counterpart-riot';
var Modal = require('matrix-react-sdk/lib/Modal');
var Resend = require("matrix-react-sdk/lib/Resend");
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
@ -74,8 +75,8 @@ module.exports = React.createClass({
// display error message stating you couldn't delete this.
var code = e.errcode || e.statusCode;
Modal.createDialog(ErrorDialog, {
title: "Error",
description: "You cannot delete this message. (" + code + ")"
title: _t('Error'),
description: _t('You cannot delete this message. (%(code)s)', {code: code})
});
}).done();
},
@ -121,7 +122,7 @@ module.exports = React.createClass({
if (eventStatus === 'not_sent') {
resendButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onResendClick}>
Resend
{ _t('Resend') }
</div>
);
}
@ -129,7 +130,7 @@ module.exports = React.createClass({
if (!eventStatus && !this.props.mxEvent.isRedacted()) { // sent and not redacted
redactButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onRedactClick}>
Redact
{ _t('Redact') }
</div>
);
}
@ -137,21 +138,21 @@ module.exports = React.createClass({
if (eventStatus === "queued" || eventStatus === "not_sent") {
cancelButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onCancelSendClick}>
Cancel Sending
{ _t('Cancel Sending') }
</div>
);
}
viewSourceButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onViewSourceClick}>
View Source
{ _t('View Source') }
</div>
);
if (this.props.mxEvent.getType() !== this.props.mxEvent.getWireType()) {
viewClearSourceButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onViewClearSourceClick}>
View Decrypted Source
{ _t('View Decrypted Source') }
</div>
);
}
@ -160,7 +161,7 @@ module.exports = React.createClass({
if (this.props.eventTileOps.isWidgetHidden()) {
unhidePreviewButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onUnhidePreviewClick}>
Unhide Preview
{ _t('Unhide Preview') }
</div>
)
}
@ -170,13 +171,13 @@ module.exports = React.createClass({
permalinkButton = (
<div className="mx_MessageContextMenu_field">
<a href={ "https://matrix.to/#/" + this.props.mxEvent.getRoomId() +"/"+ this.props.mxEvent.getId() }
target="_blank" rel="noopener" onClick={ this.closeMenu }>Permalink</a>
target="_blank" rel="noopener" onClick={ this.closeMenu }>{ _t('Permalink') }</a>
</div>
);
const quoteButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onQuoteClick}>
Quote
{ _t('Quote') }
</div>
);
@ -185,7 +186,7 @@ module.exports = React.createClass({
externalURLButton = (
<div className="mx_MessageContextMenu_field">
<a href={ this.props.mxEvent.event.content.external_url }
rel="noopener" target="_blank" onClick={ this.closeMenu }>Source URL</a>
rel="noopener" target="_blank" onClick={ this.closeMenu }>{ _t('Source URL') }</a>
</div>
);
}

View file

@ -21,6 +21,7 @@ import q from 'q';
import React from 'react';
import classNames from 'classnames';
import sdk from 'matrix-react-sdk';
import _t from 'counterpart-riot';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import dis from 'matrix-react-sdk/lib/dispatcher';
import DMRoomMap from 'matrix-react-sdk/lib/utils/DMRoomMap';
@ -70,8 +71,8 @@ module.exports = React.createClass({
}).fail(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to remove tag " + tagNameOff + " from room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to remove tag %(tagName)s from room', {tagName: tagNameOff}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
@ -87,8 +88,8 @@ module.exports = React.createClass({
}).fail(function(err) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to add tag " + tagNameOn + " to room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to remove tag %(tagName)s from room', {tagName: tagNameOn}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
@ -148,8 +149,8 @@ module.exports = React.createClass({
}, (err) => {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to set Direct Message status of room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to set Direct Message status of room'),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
},
@ -187,8 +188,8 @@ module.exports = React.createClass({
var errCode = err.errcode || "unknown error code";
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: `Failed to forget room (${errCode})`,
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to forget room %(errCode)s', {errCode: errCode}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
@ -274,22 +275,22 @@ module.exports = React.createClass({
<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_icon mx_filterFlipColor" src="img/icon-context-mute-off-copy.svg" width="16" height="12" />
All messages (loud)
{ _t('All messages (loud)') }
</div>
<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_icon mx_filterFlipColor" src="img/icon-context-mute-off.svg" width="16" height="12" />
All messages
{ _t('All messages') }
</div>
<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_icon mx_filterFlipColor" src="img/icon-context-mute-mentions.svg" width="16" height="12" />
Mentions only
{ _t('Mentions only') }
</div>
<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_icon mx_filterFlipColor" src="img/icon-context-mute.svg" width="16" height="12" />
Mute
{ _t('Mute') }
</div>
</div>
);
@ -306,16 +307,16 @@ module.exports = React.createClass({
switch (membership) {
case "join":
leaveClickHandler = this._onClickLeave;
leaveText = "Leave";
leaveText = _t('Leave');
break;
case "leave":
case "ban":
leaveClickHandler = this._onClickForget;
leaveText = "Forget";
leaveText = _t('Forget');
break;
case "invite":
leaveClickHandler = this._onClickReject;
leaveText = "Reject";
leaveText = _t('Reject');
break;
}
@ -353,17 +354,17 @@ module.exports = React.createClass({
<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_set" src="img/icon_context_fave_on.svg" width="15" height="15" />
Favourite
{ _t('Favourite') }
</div>
<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_set" src="img/icon_context_low_on.svg" width="15" height="15" />
Low Priority
{ _t('Low Priority') }
</div>
<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_set" src="img/icon_context_person_on.svg" width="15" height="15" />
Direct Chat
{ _t('Direct Chat') }
</div>
</div>
);

View file

@ -25,6 +25,7 @@ var filesize = require('filesize');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
const Modal = require('matrix-react-sdk/lib/Modal');
const sdk = require('matrix-react-sdk');
import _t from 'counterpart-riot';
module.exports = React.createClass({
displayName: 'ImageView',
@ -76,8 +77,8 @@ module.exports = React.createClass({
// display error message stating you couldn't delete this.
var code = e.errcode || e.statusCode;
Modal.createDialog(ErrorDialog, {
title: "Error",
description: "You cannot delete this image. (" + code + ")"
title: _t('Error'),
description: _t('You cannot delete this image. (%(code)s)', {code: code})
});
}).done();
}
@ -150,14 +151,14 @@ module.exports = React.createClass({
var eventMeta;
if(showEventMeta) {
eventMeta = (<div className="mx_ImageView_metadata">
Uploaded on { DateUtils.formatDate(new Date(this.props.mxEvent.getTs())) } by { this.props.mxEvent.getSender() }
{ _t('Uploaded on %(date)s by %(user)s', {date: DateUtils.formatDate(new Date(this.props.mxEvent.getTs())), user: this.props.mxEvent.getSender()}) }
</div>);
}
var eventRedact;
if(showEventMeta) {
eventRedact = (<div className="mx_ImageView_button" onClick={this.onRedactClick}>
Redact
{ _t('Redact') }
</div>);
}
@ -169,7 +170,7 @@ module.exports = React.createClass({
<img src={this.props.src} style={style}/>
<div className="mx_ImageView_labelWrapper">
<div className="mx_ImageView_label">
<AccessibleButton className="mx_ImageView_cancel" onClick={ this.props.onFinished }><img src="img/cancel-white.svg" width="18" height="18" alt="Close"/></AccessibleButton>
<AccessibleButton className="mx_ImageView_cancel" onClick={ this.props.onFinished }><img src="img/cancel-white.svg" width="18" height="18" alt={ _t('Close') }/></AccessibleButton>
<div className="mx_ImageView_shim">
</div>
<div className="mx_ImageView_name">
@ -178,7 +179,7 @@ module.exports = React.createClass({
{ eventMeta }
<a className="mx_ImageView_link" href={ this.props.src } download={ this.props.name } target="_blank" rel="noopener">
<div className="mx_ImageView_download">
Download this file<br/>
{ _t('Download this file') }<br/>
<span className="mx_ImageView_size">{ size_res }</span>
</div>
</a>

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
import _t from 'counterpart-riot';
var Notifier = require("matrix-react-sdk/lib/Notifier");
var sdk = require('matrix-react-sdk')
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
@ -37,7 +38,7 @@ module.exports = React.createClass({
<div className="mx_MatrixToolbar">
<img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div className="mx_MatrixToolbar_content">
You are not receiving desktop notifications. <a className="mx_MatrixToolbar_link" onClick={ this.onClick }>Enable them now</a>
{ _t('You are not receiving desktop notifications') } <a className="mx_MatrixToolbar_link" onClick={ this.onClick }> { _t('Enable them now') }</a>
</div>
<AccessibleButton className="mx_MatrixToolbar_close" onClick={ this.hideToolbar } ><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton>
</div>

View file

@ -15,6 +15,7 @@ limitations under the License.
*/
var React = require("react");
import _t from 'counterpart-riot';
module.exports = React.createClass({
displayName: 'VectorCustomServerDialog',
@ -26,24 +27,14 @@ module.exports = React.createClass({
return (
<div className="mx_ErrorDialog">
<div className="mx_Dialog_title">
Custom Server Options
{ _t('Custom Server Options') }
</div>
<div className="mx_Dialog_content">
<span>
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.
</span>
<span dangerouslySetInnerHTML={{__html: _t('customServer_text')}} />
</div>
<div className="mx_Dialog_buttons">
<button onClick={this.props.onFinished} autoFocus={true}>
Dismiss
{ _t('Dismiss') }
</button>
</div>
</div>

View file

@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
import _t from 'counterpart-riot';
module.exports = React.createClass({
displayName: 'VectorLoginFooter',
@ -30,7 +31,7 @@ module.exports = React.createClass({
<a href="https://medium.com/@RiotChat">blog</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://twitter.com/@RiotChat">twitter</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://github.com/vector-im/vector-web">github</a>&nbsp;&nbsp;&middot;&nbsp;&nbsp;
<a href="https://matrix.org">powered by Matrix</a>
<a href="https://matrix.org">{ _t('powered by Matrix') }</a>
</div>
);
}

View file

@ -14,19 +14,23 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
'use strict';
// 'use strict';
var React = require('react');
import React from 'react';
import _t from 'counterpart-riot';
import DateUtils from 'matrix-react-sdk/lib/DateUtils';
var days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
];
function getdaysArray() {
var days = [];
days.push(_t('Sunday'));
days.push(_t('Monday'));
days.push(_t('Tuesday'));
days.push(_t('Wednesday'));
days.push(_t('Thursday'));
days.push(_t('Friday'));
days.push(_t('Saturday'));
return days;
}
module.exports = React.createClass({
displayName: 'DateSeparator',
@ -34,19 +38,20 @@ module.exports = React.createClass({
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 = "Today";
label = _t('Today');
}
else if (date.toDateString() === yesterday.toDateString()) {
label = "Yesterday";
label = _t('Yesterday');
}
else if (today.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
label = days[date.getDay()];
}
else {
label = date.toDateString();
label = DateUtils.formatFullDate(date);
}
return (

View file

@ -23,6 +23,7 @@ import {DropTarget} from 'react-dnd';
import dis from 'matrix-react-sdk/lib/dispatcher';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import sdk from 'matrix-react-sdk';
import _t from 'counterpart-riot';
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';
@ -90,8 +91,8 @@ var roomTileSource = {
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to set direct chat tag " + err);
Modal.createDialog(ErrorDialog, {
title: "Failed to set direct chat tag",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to set direct chat tag'),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
return;
@ -115,8 +116,8 @@ var roomTileSource = {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to remove tag " + prevTag + " from room: " + err);
Modal.createDialog(ErrorDialog, {
title: "Failed to remove tag " + prevTag + " from room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to remove tag %(tagName)s from room', {tagName: prevTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
@ -137,8 +138,8 @@ var roomTileSource = {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to add tag " + newTag + " to room: " + err);
Modal.createDialog(ErrorDialog, {
title: "Failed to add tag " + newTag + " to room",
description: ((err && err.message) ? err.message : "Operation failed"),
title: _t('Failed to add tag %(tagName)s to room', {tagName: newTag}),
description: ((err && err.message) ? err.message : _t('Operation failed')),
});
});
}
@ -241,4 +242,3 @@ DragSource('RoomTile', roomTileSource, function(connect, monitor) {
isDragging: monitor.isDragging()
};
})(RoomTile));

View file

@ -16,6 +16,7 @@ limitations under the License.
'use strict';
var React = require('react');
import _t from 'counterpart-riot';
var q = require("q");
var sdk = require('matrix-react-sdk');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
@ -131,8 +132,8 @@ module.exports = React.createClass({
}, (error) => {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Error saving email notification preferences",
description: "An error occurred whilst saving your email notification preferences.",
title: _t('Error saving email notification preferences'),
description: _t('An error occurred whilst saving your email notification preferences') + '.',
});
});
},
@ -175,9 +176,10 @@ module.exports = React.createClass({
var TextInputDialog = sdk.getComponent("dialogs.TextInputDialog");
Modal.createDialog(TextInputDialog, {
title: "Keywords",
description: "Enter keywords separated by a comma:",
title: _t('Keywords'),
description: _t('Enter keywords separated by a comma') + ':',
value: keywords,
button: _t('OK'),
onFinished: function onFinished(should_leave, newValue) {
if (should_leave && newValue !== keywords) {
@ -240,8 +242,8 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to change settings: " + error);
Modal.createDialog(ErrorDialog, {
title: "Failed to change settings",
description: ((error && error.message) ? error.message : "Operation failed"),
title: _t('Failed to change settings'),
description: ((error && error.message) ? error.message : _t('Operation failed')),
onFinished: self._refreshFromServer
});
});
@ -310,8 +312,8 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Can't update user notification settings: " + error);
Modal.createDialog(ErrorDialog, {
title: "Can't update user notification settings",
description: ((error && error.message) ? error.message : "Operation failed"),
title: _t('Can\'t update user notification settings'),
description: ((error && error.message) ? error.message : _t('Operation failed')),
onFinished: self._refreshFromServer
});
});
@ -352,8 +354,8 @@ module.exports = React.createClass({
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
console.error("Failed to update keywords: " + error);
Modal.createDialog(ErrorDialog, {
title: "Failed to update keywords",
description: ((error && error.message) ? error.message : "Operation failed"),
title: _t('Failed to update keywords'),
description: ((error && error.message) ? error.message : _t('Operation failed')),
onFinished: self._refreshFromServer
});
}
@ -562,8 +564,8 @@ module.exports = React.createClass({
// Build the rules not managed by Vector UI
var otherRulesDescriptions = {
'.m.rule.message': "Notify for all other messages/rooms",
'.m.rule.fallback': "Notify me for anything else"
'.m.rule.message': _t('Notify for all other messages/rooms'),
'.m.rule.fallback': _t('Notify me for anything else'),
};
for (var i in defaultRules.others) {
@ -698,7 +700,7 @@ module.exports = React.createClass({
</div>
<div className="mx_UserNotifSettings_labelCell">
<label htmlFor="enableNotifications">
Enable notifications for this account
{ _t('Enable notifications for this account') }
</label>
</div>
</div>
@ -713,7 +715,7 @@ module.exports = React.createClass({
{masterPushRuleDiv}
<div className="mx_UserSettings_notifTable">
All notifications are currently disabled for all targets.
{ _t('All notifications are currently disabled for all targets') }.
</div>
</div>
);
@ -723,13 +725,13 @@ module.exports = React.createClass({
let emailNotificationsRow;
if (emailThreepids.length === 0) {
emailNotificationsRow = <div>
Add an email address above to configure email notifications
{ _t('Add an email address above to configure email notifications') }
</div>;
} else {
// This only supports the first email address in your profile for now
emailNotificationsRow = this.emailNotificationsRow(
emailThreepids[0].address,
"Enable email notifications ("+emailThreepids[0].address+")"
_t('Enable email notifications') + ' (' + emailThreepids[0].address + ')'
);
}
@ -737,7 +739,7 @@ module.exports = React.createClass({
var externalRules = [];
for (var i in this.state.externalPushRules) {
var rule = this.state.externalPushRules[i];
externalRules.push(<li>{ rule.description }</li>);
externalRules.push(<li>{ _t(rule.description) }</li>);
}
// Show keywords not displayed by the vector UI as a single external push rule
@ -748,12 +750,12 @@ module.exports = React.createClass({
}
if (externalKeyWords.length) {
externalKeyWords = externalKeyWords.join(", ");
externalRules.push(<li>Notifications on the following keywords follow rules which cant be displayed here: { externalKeyWords }</li>);
externalRules.push(<li>{ _t('Notifications on the following keywords follow rules which cant be displayed here:') } { externalKeyWords }</li>);
}
var devicesSection;
if (this.state.pushers === undefined) {
devicesSection = <div className="error">Unable to fetch notification target list</div>
devicesSection = <div className="error">{ _t('Unable to fetch notification target list') }</div>
} else if (this.state.pushers.length == 0) {
devicesSection = null;
} else {
@ -774,7 +776,7 @@ module.exports = React.createClass({
}
if (devicesSection) {
devicesSection = (<div>
<h3>Notification targets</h3>
<h3>{ _t('Notification targets') }</h3>
{ devicesSection }
</div>);
}
@ -783,9 +785,9 @@ module.exports = React.createClass({
if (externalRules.length) {
advancedSettings = (
<div>
<h3>Advanced notifications settings</h3>
There are advanced notifications which are not shown here.<br/>
You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply.
<h3>{ _t('Advanced notifications settings') }</h3>
{ _t('There are advanced notifications which are not shown here') }.<br/>
{ _t('You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply') }.
<ul>
{ externalRules }
</ul>
@ -812,7 +814,7 @@ module.exports = React.createClass({
</div>
<div className="mx_UserNotifSettings_labelCell">
<label htmlFor="enableDesktopNotifications">
Enable desktop notifications
{ _t('Enable desktop notifications') }
</label>
</div>
</div>
@ -830,7 +832,7 @@ module.exports = React.createClass({
</div>
<div className="mx_UserNotifSettings_labelCell">
<label htmlFor="enableDesktopAudioNotifications">
Enable audible notifications in web client
{ _t('Enable audible notifications in web client') }
</label>
</div>
</div>
@ -842,9 +844,9 @@ module.exports = React.createClass({
<thead>
<tr>
<th width="55%"></th>
<th width="15%">Off</th>
<th width="15%">On</th>
<th width="15%">Noisy</th>
<th width="15%">{ _t('Off') }</th>
<th width="15%">{ _t('On') }</th>
<th width="15%">{ _t('Noisy') }</th>
</tr>
</thead>
<tbody>

1
src/i18n/basefile.json Normal file
View file

@ -0,0 +1 @@
{}

88
src/i18n/be.json Normal file
View file

@ -0,0 +1,88 @@
{
"Add an email address above to configure email notifications": "Дадайце адрас электроннай пошты вышэй, каб наладзіць апавяшчэнні",
"All messages": "Усе паведамленні",
"All messages (loud)": "Усе паведамленні (гучна)",
"All notifications are currently disabled for all targets.": "Усе апавяшчэнні ў цяперашні час адключаныя для ўсіх мэтаў.",
"An error occurred whilst saving your email notification preferences": "Адбылася памылка падчас захавання налады апавяшчэнняў па электроннай пошце",
"Cancel Sending": "Адмяніць адпраўку",
"Can't update user notification settings": "Немагчыма абнавіць налады апавяшчэнняў карыстальніка",
"Close": "Зачыніць",
"Create new room": "Стварыць новы пакой",
"Couldn't find a matching Matrix room": "Не атрымалася знайсці адпаведны пакой Matrix",
"Custom Server Options": "Карыстальніцкія параметры сервера",
"delete the alias": "выдаліць псеўданім",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Выдаліць псеўданім пакоя %(alias)s і выдаліць %(name)s з каталога?",
"Direct Chat": "Прамы чат",
"Directory": "Каталог",
"Dismiss": "Aдхіліць",
"Download this file": "Спампаваць гэты файл",
"Drop here to %(verb)s": "Перацягнуць сюды %(verb)s",
"Enable audible notifications in web client": "Ўключыць гукавыя апавяшчэнні ў вэб-кліенце",
"Enable desktop notifications": "Ўключыць апавяшчэнні на працоўным стале",
"Enable email notifications": "Ўключыць паведамлення па электроннай пошце",
"Enable notifications for this account": "Ўключыць апавяшчэнні для гэтага ўліковага запісу",
"Enable them now": "Уключыць іх зараз",
"Enter keywords separated by a comma": "Калі ласка, увядзіце ключавыя словы, падзеленыя коскамі",
"Error": "Памылка",
"Error saving email notification preferences": "Памылка захавання налад апавяшчэнняў па электроннай пошце",
"#example": "#прыклад",
"Failed to": "Не атрымалася",
"Failed to add tag %(tagName)s to room": "Не атрымалася дадаць %(tagName)s ў пакоі",
"Failed to change settings": "Не атрымалася змяніць налады",
"Failed to forget room %(errCode)s": "Не атрымалася забыць пакой %(errCode)s",
"Failed to update keywords": "Не атрымалася абнавіць ключавыя словы",
"Failed to get protocol list from Home Server": "Не ўдалося атрымаць спіс пратаколаў ад хатняга сервера",
"Failed to get public room list": "Не ўдалося атрымаць спіс агульных пакояў",
"Failed to join the room": "Не ўдалося далучыцца да пакоя",
"Failed to remove tag %(prevTag)s from room": "Не ўдалося выдаліць %(prevTag)s з пакоя",
"Failed to set direct chat tag": "Не ўдалося ўсталяваць тэг прамога чата",
"Failed to set Direct Message status of room": "Не ўдалося ўсталяваць статут прамога паведамлення пакою",
"Favourite": "Улюбёнае",
"Fetching third party location failed": "Не ўдалося атрымаць месцазнаходжанне трэцяга боку",
"Files": "Файлы",
"Filter room names": "Фільтр iмёнаў пакояў",
"Forget": "Забыць",
" from room": " з пакоя",
"Guests can join": "Госці могуць далучыцца",
"Guest users can't invite users. Please register to invite": осцi не могуць запрашаць карыстальнікаў. Калі ласка, зарэгіструйцеся, каб запрасiць",
"Invite to this room": "Запрасіць у гэты пакой",
"Keywords": "Ключавыя словы",
"Leave": "Пакінуць",
"Low Priority": "Нізкі прыярытэт",
"Members": "Удзельнікі",
"Mentions only": "Толькі згадкі",
"Mute": "Без гуку",
"No rooms to show": "Няма пакояў для паказу",
"Noisy": "Шумна",
"Notification targets": "Мэты апавяшчэння",
"Notifications": "Апавяшчэнні",
"Notifications on the following keywords follow rules which cant be displayed here": "Апавяшчэнні па наступных ключавых словах прытрымліваюцца правілаў, якія не могуць быць адлюстраваны тут",
"Notify for all other messages/rooms": "Апавяшчаць для ўсіх іншых паведамленняў/пакояў",
"Notify me for anything else": "Паведаміць мне што-небудзь яшчэ",
"Off": "Выключыць",
"On": "Уключыць",
"Operation failed": "Не атрымалася выканаць аперацыю",
"Permalink": "Пастаянная спасылка",
"Please Register": "Калі ласка, зарэгіструйцеся",
"powered by Matrix": "працуе на Matrix",
"Quote": "Цытата",
"Redact": "Адрэдагаваць",
"Reject": "Адхіліць",
"Remove %(name)s from the directory?": "Выдаліць %(name)s з каталога?",
"Remove": "Выдалiць",
"remove %(name)s from the directory": "выдаліць %(name)s з каталога",
"Remove from Directory": "Выдалiць з каталога",
"Resend": "Паўторна",
"Riot does not know how to join a room on this network": "Riot не ведае, як увайсці ў пакой у гэтай сетке",
"Room directory": "Каталог пакояў",
"Room not found": "Пакой не знойдзены",
"Search for a room": "Пошук па пакоі",
"Settings": "Налады",
"Source URL": "URL-адрас крыніцы",
"Start chat": "Пачаць чат",
"The Home Server may be too old to support third party networks": "Хатні сервер можа быць занадта стары для падтрымкі іншых сетак",
"There are advanced notifications which are not shown here": "Ёсць пашыраныя апавяшчэння, якія не паказаныя тут",
"The server may be unavailable or overloaded": "Сервер можа быць недаступны ці перагружаны",
"This room is inaccessible to guests. You may be able to join if you register": "Гэты пакой недаступны для гасцей. Вы можаце далучыцца, калі вы зарэгіструецеся",
" to room": " ў пакоі"
}

84
src/i18n/da.json Normal file
View file

@ -0,0 +1,84 @@
{
"Add an email address above to configure email notifications": "Tilføj en emailadresse ovenfor for at konfigurere e-mail-underretninger",
"All notifications are currently disabled for all targets.": "Alle meddelelser er for øjeblikket deaktiveret for alle mål.",
"An error occurred whilst saving your email notification preferences": "Der opstod en fejl under opbevaring af dine e-mail-underretningsindstillinger",
"and remove": "Og fjern",
"Can't update user notification settings": "Kan ikke opdatere brugermeddelelsesindstillinger",
"Create new room": "Opret nyt rum",
"Couldn't find a matching Matrix room": "Kunne ikke finde et matchende Matrix-rum",
"Custom Server Options": "Brugerdefinerede serverindstillinger",
"delete the alias": "Slet aliaset",
"Delete the room alias": "Slet room alias",
"Direct Chat": "Personligt Chat",
"Directory": "Rum fortegnelse",
"Dismiss": "Afskedige",
"Drop here to": "Drop her til",
"Enable audible notifications in web client": "Aktivér hørbare underretninger i webklienten",
"Enable desktop notifications": "Aktivér desktop meddelelser",
"Enable email notifications": "Aktivér e-mail-underretninger",
"Enable notifications for this account": "Aktivér underretninger for dette brugernavn",
"Enable them now": "Aktivér dem nu",
"Enter keywords separated by a comma": "Indtast søgeord adskilt af et komma",
"Error": "Fejl",
"Error saving email notification preferences": "Fejl ved at gemme e-mail-underretningsindstillinger",
"#example": "#eksempel",
"Failed to": "Var ikke i stand til at",
"Failed to add tag ": "Kunne ikke tilføje tag ",
"Failed to change settings": "Kunne ikke ændre indstillinger",
"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 public room list": "Kunne ikke få offentlig rumliste",
"Failed to join the room": "Kunne ikke komme ind i rumet",
"Failed to remove tag ": "Kunne ikke fjerne tag ",
"Failed to set Direct Message status of room": "Kunne ikke indstille direkte beskedstatus for rumet",
"Favourite": "Favorit",
"Fetching third party location failed": "Hentning af tredjeparts placering mislykkedes",
"Files": "Filer",
"Filter room names": "Filtrer rumnavne",
"Forget": "Glem",
"from the directory": "fra fortegnelsen",
" from room": " fra rum",
"Guests can join": "Gæster kan deltage",
"Guest users can't invite users. Please register to invite": "Gæstebrugere kan ikke invitere brugere. Tilmeld dig venligst for at invitere",
"Invite to this room": "Inviter til dette rum",
"Keywords": "Søgeord",
"Leave": "Forlade",
"Low Priority": "Lav prioritet",
"Members": "Medlemmer",
"No rooms to show": "Ingen rum at vise",
"Noisy": "Støjende",
"Notification targets": "Meddelelsesmål",
"Notifications": "Meddelser",
"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 me for anything else": "Underret mig om noget andet",
"Off": "Slukket",
"On": "Tændt",
"Operation failed": "Operation mislykkedes",
"Please Register": "Vær venlig at registrere",
"powered by Matrix": "Drevet af Matrix",
"Reject": "Afvise",
"Remove": "Fjerne",
"remove": "fjerner",
"Remove from Directory": "Fjern fra fortegnelse",
"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 directory": "Rum fortegnelse",
"Room not found": "Rumet ikke fundet",
"Search for a room": "Søg efter et rum",
"Settings": "Indstillinger",
"Start chat": "Begyndt chat",
"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",
"The server may be unavailable or overloaded": "Serveren kan være utilgængelig eller overbelastet",
"This room is inaccessible to guests. You may be able to join if you register": "Dette rum er utilgængeligt for gæster. Du kan være i stand til at deltage, hvis du registrerer dig",
" to room": " til rum",
"Unable to fetch notification target list": "Kan ikke hente meddelelsesmålliste",
"Unable to join network": "Kan ikke deltage i netværket",
"Unable to look up room ID from server": "Kunne ikke slå op på rum-id fra server",
"unknown error code": "Ukendt fejlkode",
"Unnamed room": "Unnamed rum",
"World readable": "Læselig til alle",
"You are not receiving desktop notifications": "Du modtager ikke desktop meddelelser",
"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"
}

122
src/i18n/de_DE.json Normal file
View file

@ -0,0 +1,122 @@
{
"Please Register": "Bitte registrieren",
"Guest users can't invite users. Please register to invite.": "Gäste können keine User einladen. Zum Einladen bitte anmelden.",
"Members": "Mitglieder",
"Files": "Dateien",
"Notifications": "Benachrichtigungen",
"Invite to this room": "In diesen Raum einladen",
"Filter room names": "Raum Namen filtern",
"Start chat": "Neuen Chat starten",
"Room directory": "Raum Verzeichnis",
"Create new room": "Neuen Raum erstellen",
"Settings": "Einstellungen",
"powered by Matrix": "gebaut mit Matrix",
"Custom Server Options": "Optionen für eigenen Server",
"customServer_text": "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.",
"Dismiss": "ausblenden",
"Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokollliste vom Home Server",
"The Home Server may be too old to support third party networks": "Der Home Server kann zu alt sein, um Drittanbieter-Netzwerke zu unterstützen",
"Directory": "Raum Verzeichnis",
"#example:": "#beispiel:",
"Search for a room": "Suche einen Raum",
"No rooms to show": "Keine Räume zum anzeigen",
"World readable": "Jeder kann lesen",
"Guests can join": "Gäste können beitreten",
"You are not receiving desktop notifications": "Du erhältst keine Desktop Benachrichtigungen",
"Enable them now": "Aktiviere diese jetzt",
"Add an email address above to configure email notifications": "Füge eine E-Mail Adresse hinzu um Benachrichtigungen via E-Mail zu erhalten",
"All notifications are currently disabled for all targets.": "Im Moment sind alle Benachrichtigungen für alle Ziele deaktiviert.",
"An error occurred whilst saving your email notification preferences": "Ein Fehler trat auf während deine E-Mail Einstellungen gespeichert wurden",
"and remove": "und entfernen",
"Can't update user notification settings": "Kann Benutzerdefinierte Einstellungen nicht aktualisieren",
"Couldn't find a matching Matrix room": "Kann keinen entsprechenden Matrix Raum finden",
"delete the alias": "Lösche den Alias",
"Delete the room alias": "Lösche den Raum Alias",
"Direct Chat": "Privater Chat",
"Drop here to": "Hier ablegen",
"Enable audible notifications in web client": "Aktiviere Audio Benachrichtigungen",
"Enable desktop notifications": "Aktiviere Desktop Benachrichtigungen",
"Enable email notifications": "Aktiviere E-Mail Benachrichtigungen",
"Enable notifications for this account": "Aktiviere Benachrichtigungen für diesen Benutzer",
"Enter keywords separated by a comma": "Gebe Suchbegriffe getrennt durch Kommata ein",
"Error": "Fehler",
"Error saving email notification preferences": "Fehler beim Speichern der E-Mail Benachrichtigungseinstellungen",
"#example": "#Beispiel",
"Failed to": "Konnte nicht",
"Failed to add tag ": "Konnte Tag nicht hinzufügen ",
"Failed to change settings": "Konnte Einstellungen nicht ändern",
"Failed to update keywords": "Konnte Suchbegriff nicht aktualisieren",
"Failed to get public room list": "Konnte keine öffentliche Raumliste laden",
"Failed to join the room": "Fehler beim Betreten des Raumes",
"Failed to remove tag ": "Konnte Tag nicht entfernen ",
"Failed to set Direct Message status of room": "Konnte den direkten Benachrichtigungsstatus nicht setzen",
"Favourite": "Favorit",
"Fetching third party location failed": "Das Abrufen des Drittanbieterstandorts ist fehlgeschlagen",
"Forget": "Lösche",
"from the directory": "aus dem Verzeichnis",
" from room": " aus dem Raum",
"Guest users can't invite users. Please register to invite": "Gastnutzer können keine Nutzer einladen. Bitte registriere dich um Nutzer einzuladen",
"Keywords": "Suchbegriff",
"Leave": "Verlassen",
"Low Priority": "Niedrige Priorität",
"Noisy": "Laut",
"Notification targets": "Benachrichtigungsziel",
"Notifications on the following keywords follow rules which cant be displayed here": "Benachrichtigungen zu folgenden Stichwörtern folgen Regeln, die hier nicht angezeigt werden können",
"Notify for all other messages/rooms": "Benachrichtigung für alle anderen Mitteilungen/ Räume",
"Operation failed": "Ausführung fehlgeschlagen",
"Reject": "ablehnen",
"Remove": "Entferne",
"remove": "Entferner",
"Remove from Directory": "Vom Raum Verzeichnis entfernen",
"Riot does not know how to join a room on this network": "Riot weiß nicht, wie es einem Raum auf diesem Netzwerk beitreten soll",
"Room not found": "Raum nicht gefunden",
"There are advanced notifications which are not shown here": "Es existieren erweiterte Benachrichtigungen, welche hier nicht angezeigt werden",
"The server may be unavailable or overloaded": "Der Server ist vermutlich nicht erreichbar oder überlastet",
"This room is inaccessible to guests. You may be able to join if you register": "Dieser Raum ist nicht verfügbar für Gäste. Vermutlich klappt es wenn du dich anmeldest",
"Unable to fetch notification target list": "Nicht möglich die Zielliste für Benachrichtigungen zu erhalten",
"Unable to join network": "Es ist nicht möglich, dem Netzwerk beizutreten",
"unknown error code": "Unbekannter Fehlercode",
"Unnamed room": "Unbenannter Raum",
"Notify me for anything else": "Benachrichtige mich für alles andere",
"Off": "Aus",
"On": "An",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Du hast sie eventuell auf einem anderen Client als Riot konfiguriert. Sie sind in Riot nicht anpassbar gelten aber trotzdem",
" to room": " an Raum",
"Drop here to %(verb)s": "%(verb)s hierher ziehen",
"All messages": "Alle Nachrichten",
"All messages (loud)": "Alle Nachrichten (laut)",
"Cancel Sending": "Senden abbrechen",
"Close": "Schließen",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Soll der Raumalias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?",
"Download this file": "Datei Herunterladen",
"Failed to add tag %(tagName)s to room": "Das Hinzufügen des Tags %(tagName)s für den Raum ist fehlgeschlagen",
"Failed to forget room %(errCode)s": "Das Entfernen des Raums %(errCode)s aus deiner Liste ist fehlgeschlagen",
"Failed to remove tag %(prevTag)s from room": "Das Entfernen des Tags %(prevTag)s für den Raum ist fehlgeschlagen",
"Failed to set direct chat tag": "Fehler beim setzen der Direct Chat Kennzeichnung",
"Mentions only": "Nur, wenn du erwähnt wirst",
"Mute": "Lautlos",
"Permalink": "Permanenter Link",
"Quote": "Zitat",
"Redact": "Redaktionell entfernen",
"Remove %(name)s from the directory?": "Soll der Raum %(name)s aus dem Verzeichnis entfernt werden?",
"remove %(name)s from the directory": "entferne %(name)s aus dem Verzeichnis",
"Resend": "Erneut Senden",
"Source URL": "Quell-URL",
"Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen",
"Unhide Preview": "Vorschau wieder anzeigen",
"Uploaded on %(date)s by %(user)s": "Hochgeladen am %(date)s durch %(user)s",
"View Decrypted Source": "Entschlüsselten Quellcode ansehen",
"View Source": "Quellcode ansehen",
"You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Die Nachricht kann nicht gelöscht werden. (%(code)s)",
"Today": "Heute",
"Wednesday": "Mittwoch",
"Thursday": "Donnerstag",
"Friday": "Freitag",
"Saturday": "Samstag",
"Tuesday": "Dienstag",
"Sunday": "Sonntag",
"Monday": "Montag",
"Yesterday": "Gestern",
"Welcome page": "Willkommensseite"
}

120
src/i18n/en_EN.json Normal file
View file

@ -0,0 +1,120 @@
{
"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 (loud)",
"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",
"Cancel Sending": "Cancel Sending",
"Can't update user notification settings": "Can't update user notification settings",
"Close": "Close",
"Create new room": "Create new room",
"Couldn't find a matching Matrix room": "Couldn't find a matching Matrix room",
"Custom Server Options": "Custom Server Options",
"delete the alias": "delete the alias",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Delete the room alias %(alias)s and remove %(name)s from the directory?",
"Direct Chat": "Direct Chat",
"Directory": "Directory",
"Dismiss": "Dismiss",
"Download this file": "Download this file",
"Drop here to %(verb)s": "Drop here to %(verb)s",
"Enable audible notifications in web client": "Enable audible notifications in web client",
"Enable desktop notifications": "Enable desktop notifications",
"Enable email notifications": "Enable email notifications",
"Enable notifications for this account": "Enable notifications for this account",
"Enable them now": "Enable them now",
"Enter keywords separated by a comma": "Enter keywords separated by a comma",
"Error": "Error",
"Error saving email notification preferences": "Error saving email notification preferences",
"#example": "#example",
"Failed to": "Failed to",
"Failed to add tag %(tagName)s to room": "Failed to add tag %(tagName)s to room",
"Failed to change settings": "Failed to change settings",
"Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s",
"Failed to update keywords": "Failed to update keywords",
"Failed to get protocol list from Home Server": "Failed to get protocol list from Home Server",
"Failed to get public room list": "Failed to get public room list",
"Failed to join the room": "Failed to join the room",
"Failed to remove tag %(prevTag)s from room": "Failed to remove tag %(prevTag)s from room",
"Failed to set direct chat tag": "Failed to set direct chat tag",
"Failed to set Direct Message status of room": "Failed to set Direct Message status of room",
"Favourite": "Favourite",
"Fetching third party location failed": "Fetching third party location failed",
"Files": "Files",
"Filter room names": "Filter room names",
"Forget": "Forget",
" from room": " from room",
"Guests can join": "Guests can join",
"Guest users can't invite users. Please register to invite": "Guest users can't invite users. Please register to invite",
"Invite to this room": "Invite to this room",
"Keywords": "Keywords",
"Leave": "Leave",
"Low Priority": "Low Priority",
"Members": "Members",
"Mentions only": "Mentions only",
"Messages containing my display name": "Messages containing my display name",
"Messages containing my user name": "Messages containing my user name",
"Messages in group chats": "Messages in group chats",
"Messages in one-to-one chats": "Messages in one-to-one chats",
"Messages sent by bot": "Messages sent by bot",
"more": "more",
"Mute": "Mute",
"No rooms to show": "No rooms to show",
"Noisy": "Noisy",
"Notification targets": "Notification targets",
"Notifications": "Notifications",
"Notifications on the following keywords follow rules which cant be displayed here": "Notifications on the following keywords follow rules which cant be displayed here",
"Notify for all other messages/rooms": "Notify for all other messages/rooms",
"Notify me for anything else": "Notify me for anything else",
"Off": "Off",
"On": "On",
"Operation failed": "Operation failed",
"Permalink": "Permalink",
"Please Register": "Please Register",
"powered by Matrix": "powered by Matrix",
"Quote": "Quote",
"Redact": "Redact",
"Reject": "Reject",
"Remove %(name)s from the directory?": "Remove %(name)s from the directory?",
"Remove": "Remove",
"remove %(name)s from the directory": "remove %(name)s from the directory",
"Remove from Directory": "Remove from Directory",
"Resend": "Resend",
"Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network",
"Room directory": "Room directory",
"Room not found": "Room not found",
"Search for a room": "Search for a room",
"Settings": "Settings",
"Source URL": "Source URL",
"Start chat": "Start chat",
"The Home Server may be too old to support third party networks": "The Home Server may be too old to support third party networks",
"There are advanced notifications which are not shown here": "There are advanced notifications which are not shown here",
"The server may be unavailable or overloaded": "The server may be unavailable or overloaded",
"This room is inaccessible to guests. You may be able to join if you register": "This room is inaccessible to guests. You may be able to join if you register",
" to room": " to room",
"Unable to fetch notification target list": "Unable to fetch notification target list",
"Unable to join network": "Unable to join network",
"Unable to look up room ID from server": "Unable to look up room ID from server",
"Unhide Preview": "Unhide Preview",
"unknown error code": "unknown error code",
"Unnamed room": "Unnamed room",
"Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s",
"View Decrypted Source": "View Decrypted Source",
"View Source": "View Source",
"When I'm invited to a room": "When I'm invited to a room",
"World readable": "World readable",
"You cannot delete this image. (%(code)s)": "You cannot delete this image. (%(code)s)",
"You cannot delete this message. (%(code)s)": "You cannot delete this message. (%(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": "You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply",
"Sunday": "Sunday",
"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Today": "Today",
"Yesterday": "Yesterday",
"Welcome page": "Welcome page"
}

66
src/i18n/fr.json Normal file
View file

@ -0,0 +1,66 @@
{
"Add an email address above to configure email notifications": "Ajouter une adresse email pour la configuration des notifications par email",
"All messages": "Tous les messages",
"All messages (loud)": "Tous les messages (fort)",
"All notifications are currently disabled for all targets.": "Toutes les notification sont désactivées pour tous les appareils.",
"An error occurred whilst saving your email notification preferences": "Une erreur est survenue lors de la sauvegarde de vos préférences de notifications mails",
"Cancel Sending": "Annuler Envois",
"Can't update user notification settings": "Impossible de mettre à jour les notifications utilisateur",
"Close": "Fermer",
"Create new room": "Créer un nouveau salon",
"Couldn't find a matching Matrix room": "Impossible de trouver un salon Matrix",
"Custom Server Options": "Options de Serveur Personnalisé",
"delete the alias": "Supprimer l'alias",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer le salon alias %(alias)s et supprimer %(name)s du répertoire?",
"Direct Chat": "Chat direct",
"Directory": "Dossier",
"Dismiss": "Rejeter",
"Download this file": "Télécharger ce fichier",
"Drop here to %(verb)s": "Déposer ici pour %(verb)s",
"Enable audible notifications in web client": "Activer les notifications sonores pour le client web",
"Enable desktop notifications": "Activer les notifications de bureau",
"Enable email notifications": "Activer les notifications par e-mail",
"Enable notifications for this account": "Activer les notifications pour ce compte",
"Enable them now": "Les activer maintenant",
"Enter keywords separated by a comma": "Entrez les mots clés séparés par une virgule",
"Error": "Erreur",
"Error saving email notification preferences": "Erreur lors de la sauvegarde des notifications par email",
"#example": "#exemple",
"Failed to": "Echec pour",
"Failed to add tag %(tagName)s to room": "Echec lors de l'ajout du tag %(tagName)s pour le salon",
"Failed to change settings": "Changement de configuration échouée",
"Failed to forget room %(errCode)s": "Echec lors de l'oublie du salon %(errCode)s",
"Failed to update keywords": "Échec dans la mise à jour des mots clés",
"Failed to get protocol list from Home Server": "Echec lors de la récupération depuis le serveur maison",
"Failed to get public room list": "Echec lors de la récupération de la liste des salons publics",
"Failed to join the room": "Échec pour joindre le salon",
"Failed to remove tag %(prevTag)s from room": "Échec dans la suppression de létiquette %(prevTag)s du salon",
"Failed to set direct chat tag": "Échec dans l'attribution d'une étiquette dans le chat direct",
"Favourite": "Favouris",
"Operation failed": "L'opération a échoué",
"Please Register": "Veuillez vous enregistrer",
"powered by Matrix": "propulsé par Matrix",
"Quote": "Citer",
"Redact": "Rédiger",
"Reject": "Rejeter",
"Remove %(name)s from the directory?": "Supprimer %(name)s du répertoire?",
"Remove": "Supprimer",
"Resend": "Renvoyer",
"Settings": "Paramètres",
"Start chat": "Démarrer la discussion",
"unknown error code": "Code erreur inconnu",
"View Source": "Voir la Source",
"You cannot delete this image. (%(code)s)": "Vous ne pouvez pas supprimer cette image. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Vous ne pouvez pas supprimer ce message. (%(code)s)",
"You are not receiving desktop notifications": "Vous ne recevez pas les notifications sur votre bureau",
"Sunday": "Dimanche",
"Monday": "Lundi",
"Tuesday": "Mardi",
"Wednesday": "Mercredi",
"Thursday": "Jeudi",
"Friday": "Vendredi",
"Saturday": "Samedi",
"Today": "Aujourd'hui",
"Yesterday": "Hier",
"Welcome page": "Page de bienvenue"
}

5
src/i18n/ml.json Normal file
View file

@ -0,0 +1,5 @@
{
"Add an email address above to configure email notifications": "ഇ മെയില്‍ അറിയിപ്പുകൾ ലഭിക്കാന്‍ മുകളില്‍ ഇ-മെയില്‍ വിലാസം നല്‍കൂ",
"All messages": "എല്ലാ സന്ദേശങ്ങളും",
"All messages (loud)": "എല്ലാ സന്ദേശങ്ങളും (ഉച്ചത്തിൽ)"
}

1
src/i18n/pl.json Normal file
View file

@ -0,0 +1 @@
{}

116
src/i18n/pt.json Normal file
View file

@ -0,0 +1,116 @@
{
"Add an email address above to configure email notifications": "Adicione um endereço de email acima para configurar as notificações por email",
"All messages": "Todas as mensagens",
"All messages (loud)": "Todas as mensagens (alto)",
"All notifications are currently disabled for all targets": "Todas as notificações estão atualmente desativadas para todos os destinos",
"An error occurred whilst saving your email notification preferences": "Um erro ocorreu enquanto salvava suas preferências de notificação por email",
"Cancel Sending": "Cancelar o envio",
"Can't update user notification settings": "Não é possível atualizar as preferências de notificação",
"Close": "Fechar",
"Create new room": "Criar nova sala",
"Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix",
"Custom Server Options": "Opções de customização do servidor",
"delete the alias": "apagar o apelido da sala",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(nome)s da lista pública?",
"Direct Chat": "Conversa pessoal",
"Directory": "Diretório",
"Dismiss": "Encerrar",
"Download this file": "Baixar este arquivo",
"Drop here to %(verb)s": "Arraste aqui para %(verb)s",
"Enable audible notifications in web client": "Ativar notificações de áudio no cliente web",
"Enable desktop notifications": "Ativar notificações no desktop",
"Enable email notifications": "Ativar notificações por email",
"Enable notifications for this account": "Ativar notificações para esta conta",
"Enable them now": "Habilitar agora",
"Enter keywords separated by a comma": "Coloque cada palavras-chave separada por vírgula",
"Error": "Erro",
"Error saving email notification preferences": "Erro ao salvar as preferências de notificação por email",
"#example:": "#exemplo",
"Failed to": "Falha ao",
"Failed to add tag %(tagName)s to room": "Falha ao adicionar %(tagName)s à sala",
"Failed to change settings": "Falha ao mudar as preferências",
"Failed to forget room %(errCode)s": "Falha ao esquecer a sala %(errCode)s",
"Failed to update keywords": "Falha ao alterar as palavras-chave",
"Failed to get protocol list from Home Server": "Falha em acessar a lista de protocolos do servidor padrão",
"Failed to get public room list": "Falha ao acessar a lista pública de salas",
"Failed to join the room": "Falha ao entrar na sala",
"Failed to remove tag %(tag)s from room": "Falha ao remover a palavra-chave %(tag)s da sala",
"Failed to set direct chat tag": "Falha ao definir conversa como pessoal",
"Failed to set Direct Message status of room": "Falha em definr a mensagem de status da sala",
"Favourite": "Favorito",
"Fetching third party location failed": "Falha ao acessar localização de terceiros",
"Files": "Arquivos",
"Filter room names": "Filtrar salas por título",
"Forget": "Esquecer",
" from room": " da sala",
"Guests can join": "Convidados podem entrar",
"Guest users can't invite users. Please register to invite": "Usuários convidados não podem convidar outros usuários. Por gentileza se registre para enviar convites",
"Invite to this room": "Convidar para esta sala",
"Keywords": "Palavras-chave",
"Leave": "Sair",
"Low Priority": "Baixa prioridade",
"Members": "Membros",
"Mentions only": "Apenas menções",
"Mute": "Mudo",
"No rooms to show": "Não existem salas a serem exibidas",
"Noisy": "Barulhento",
"Notification targets": "Alvos de notificação",
"Notifications": "Notificações",
"Notifications on the following keywords follow rules which cant be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui",
"Notify for all other messages/rooms": "Notificar para todas as outras mensagens e salas",
"Notify me for anything else": "Notificar-me sobre qualquer outro evento",
"Off": "Desativado",
"On": "Ativado",
"Operation failed": "A operação falhou",
"Permalink": "Link permanente",
"Please Register": "Por favor, cadastre-se",
"powered by Matrix": "distribuído por Matrix",
"Quote": "Citar",
"Redact": "Remover",
"Reject": "Rejeitar",
"Remove": "Remover",
"Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
"remove %(name)s from the directory": "remover %(name)s da lista pública de salas",
"Remove from Directory": "Remover da lista pública de salas",
"Resend": "Reenviar",
"Riot does not know how to join a room on this network": "O sistema não sabe como entrar na sala desta rede",
"Room directory": "Lista de salas públicas",
"Room not found": "Sala não encontrada",
"Search for a room": "Procurar por uma sala",
"Settings": "Configurações",
"Source URL": "URL fonte",
"Start chat": "Começar conversa",
"The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros",
"There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui",
"The server may be unavailable or overloaded": "O servidor pode estar inacessível ou sobrecarregado",
"This room is inaccessible to guests. You may be able to join if you register": "Esta sala é inacessível para convidados. Você poderá entrar caso se registre",
" to room": " na sala",
"Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação",
"Unable to join network": "Não foi possível conectar na rede",
"Unable to look up room ID from server": "Não foi possivel buscar identificação da sala no servidor",
"Unhide Preview": "Mostrar a pré-visualização novamente",
"unknown error code": "código de erro desconhecido",
"Unnamed room": "Sala sem nome",
"Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s",
"View Decrypted Source": "Ver a fonte descriptografada",
"View Source": "Ver a fonte",
"World readable": "Público",
"You cannot delete this image. (%(code)s)": "Você não pode apagar esta imagem. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Você não pode apagar esta mensagem. (%(code)s)",
"You are not receiving desktop notifications": "Você não está recebendo notificações desktop",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Você pode te-las configurado em outro cliente além do Riot. Você não pode ajustá-las no Riot, mas ainda assim elas se aplicam aqui",
"Sunday": "Domingo",
"Monday": "Segunda",
"Tuesday": "Terça",
"Wednesday": "Quarta",
"Thursday": "Quinta",
"Friday": "Sexta",
"Saturday": "Sábado",
"Today": "Hoje",
"Yesterday": "Ontem",
"All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os recipientes.",
"#example": "#exemplo",
"Failed to remove tag %(prevTag)s from room": "Não foi possível remover a marcação %(prevTag)s desta sala",
"Notifications on the following keywords follow rules which cant be displayed here": "As notificações sobre as palavras-chave abaixo seguem regras que não podem ser mostradas aqui",
"Welcome page": "Página de boas vindas"
}

124
src/i18n/pt_BR.json Normal file
View file

@ -0,0 +1,124 @@
{
"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 (loud)": "Todas as mensagens (alto)",
"All notifications are currently disabled for all targets": "Todas as notificações estão atualmente desativadas para todos os destinos",
"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",
"Cancel Sending": "Cancelar o envio",
"Can't update user notification settings": "Não é possível atualizar as preferências de notificação",
"Close": "Fechar",
"Create new room": "Criar nova sala",
"Couldn't find a matching Matrix room": "Não foi possível encontrar uma sala correspondente no servidor Matrix",
"Custom Server Options": "Opções de personalização do servidor",
"delete the alias": "apagar o apelido da sala",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Apagar o apelido %(alias)s da sala e remover %(nome)s da lista pública?",
"Direct Chat": "Conversa pessoal",
"Directory": "Diretório",
"Dismiss": "Encerrar",
"Download this file": "Baixar este arquivo",
"Drop here to %(verb)s": "Arraste aqui para %(verb)s",
"Enable audible notifications in web client": "Ativar notificações de áudio no cliente web",
"Enable desktop notifications": "Ativar notificações no desktop",
"Enable email notifications": "Ativar notificações por email",
"Enable notifications for this account": "Ativar notificações para esta conta",
"Enable them now": "Habilitar agora",
"Enter keywords separated by a comma": "Coloque cada palavras-chave separada por vírgula",
"Error": "Erro",
"Error saving email notification preferences": "Erro ao salvar as preferências de notificação por email",
"#example:": "#exemplo",
"Failed to": "Falha ao",
"Failed to add tag %(tagName)s to room": "Falha ao adicionar %(tagName)s à sala",
"Failed to change settings": "Falhou ao mudar as preferências",
"Failed to forget room %(errCode)s": "Falhou ao esquecer a sala %(errCode)s",
"Failed to update keywords": "Falhou ao alterar as palavras-chave",
"Failed to get protocol list from Home Server": "Falha em acessar a lista de protocolos do servidor padrão",
"Failed to get public room list": "Falha ao acessar a lista pública de salas",
"Failed to join the room": "Falhou ao entrar na sala",
"Failed to remove tag %(tag)s from room": "Falha ao remover a palavra-chave %(tag)s da sala",
"Failed to set direct chat tag": "Falha ao definir conversa como pessoal",
"Failed to set Direct Message status of room": "Falha em definir a mensagem de status da sala",
"Favourite": "Favorito",
"Fetching third party location failed": "Falha ao acessar localização de terceiros",
"Files": "Arquivos",
"Filter room names": "Filtrar salas por título",
"Forget": "Esquecer",
" from room": " da sala",
"Guests can join": "Convidados podem entrar",
"Guest users can't invite users. Please register to invite": "Usuários convidados não podem convidar outros usuários. Por gentileza se registre para enviar convites",
"Invite to this room": "Convidar para esta sala",
"Keywords": "Palavras-chave",
"Leave": "Sair",
"Low Priority": "Baixa prioridade",
"Members": "Membros",
"Mentions only": "Apenas menções",
"Messages containing my display name": "Mensagens contendo meu nome público",
"Messages containing my user name": "Mensagens contendo meu nome de usuário",
"Messages in group chats": "Mensagens em salas",
"Messages in one-to-one chats": "Mensagens em conversas pessoais",
"Messages sent by bot": "Mensagens enviadas por bots",
"more": "ver mais",
"Mute": "Mudo",
"No rooms to show": "Não existem salas a serem exibidas",
"Noisy": "Barulhento",
"Notification targets": "Alvos de notificação",
"Notifications": "Notificações",
"Notifications on the following keywords follow rules which cant be displayed here:": "Notificações sobre as seguintes palavras-chave seguem regras que não podem ser exibidas aqui",
"Notify for all other messages/rooms": "Notificar para todas as outras mensagens e salas",
"Notify me for anything else": "Notificar-me sobre qualquer outro evento",
"Off": "Desativado",
"On": "Ativado",
"Operation failed": "A operação falhou",
"Permalink": "Link permanente",
"Please Register": "Por favor, cadastre-se",
"powered by Matrix": "distribuído por Matrix",
"Quote": "Citar",
"Redact": "Remover",
"Reject": "Rejeitar",
"Remove": "Remover",
"Remove %(name)s from the directory?": "Remover %(name)s da lista pública de salas?",
"remove %(name)s from the directory": "remover %(name)s da lista pública de salas",
"Remove from Directory": "Remover da lista pública de salas",
"Resend": "Reenviar",
"Riot does not know how to join a room on this network": "O sistema não sabe como entrar na sala desta rede",
"Room directory": "Lista de salas públicas",
"Room not found": "Sala não encontrada",
"Search for a room": "Procurar por uma sala",
"Settings": "Configurações",
"Source URL": "URL fonte",
"Start chat": "Começar conversa",
"The Home Server may be too old to support third party networks": "O servidor pode ser muito antigo para suportar redes de terceiros",
"There are advanced notifications which are not shown here": "Existem opções avançadas que não são exibidas aqui",
"The server may be unavailable or overloaded": "O servidor pode estar inacessível ou sobrecarregado",
"This room is inaccessible to guests. You may be able to join if you register": "Esta sala é inacessível para convidados. Você poderá entrar caso se registre",
" to room": " para sala",
"Unable to fetch notification target list": "Não foi possível obter a lista de alvos de notificação",
"Unable to join network": "Não foi possível conectar na rede",
"Unable to look up room ID from server": "Não foi possível buscar identificação da sala no servidor",
"Unhide Preview": "Mostrar a pré-visualização novamente",
"unknown error code": "código de erro desconhecido",
"Unnamed room": "Sala sem nome",
"Uploaded on %(date)s by %(user)s": "Enviada em %(date)s por %(user)s",
"View Decrypted Source": "Ver a fonte descriptografada",
"View Source": "Ver a fonte",
"When I'm invited to a room": "Quando sou convidada(o) a uma sala",
"World readable": "Público",
"You cannot delete this image. (%(code)s)": "Você não pode apagar esta imagem. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Você não pode apagar esta mensagem. (%(code)s)",
"You are not receiving desktop notifications": "Você não está recebendo notificações desktop",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Você pode te-las configurado em outro cliente além do Riot. Você não pode ajustá-las no Riot, mas ainda assim elas se aplicam aqui",
"Sunday": "Domingo",
"Monday": "Segunda",
"Tuesday": "Terça",
"Wednesday": "Quarta",
"Thursday": "Quinta",
"Friday": "Sexta",
"Saturday": "Sábado",
"Today": "Hoje",
"Yesterday": "Ontem",
"All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os destinatários.",
"#example": "#exemplo",
"Failed to remove tag %(prevTag)s from room": "Não foi possível remover a marcação %(prevTag)s desta sala",
"Notifications on the following keywords follow rules which cant be displayed here": "As notificações sobre as palavras-chave abaixo seguem regras que não podem ser mostradas aqui",
"Welcome page": "Página de boas vindas"
}

119
src/i18n/ru.json Normal file
View file

@ -0,0 +1,119 @@
{
"Add an email address above to configure email notifications": "Добавьте email адресс для настройки оповещений",
"All notifications are currently disabled for all targets.": "Все оповещения отключены.",
"An error occurred whilst saving your email notification preferences": "Возникла ошибка при сохранении настроек оповещения вашего email",
"and remove": "и удалить",
"Can't update user notification settings": "Не возможно обновить пользовательские настройки оповещения",
"Create new room": "Создать комнату",
"Couldn't find a matching Matrix room": "Не возможно найти подходящую Матрикс комнату",
"Custom Server Options": "Настройки пользовательского сервера",
"delete the alias": "удалить привязку",
"Delete the room alias": "Удалить привязку комнаты",
"Direct Chat": "Персональное сообщение",
"Directory": "Каталог",
"Dismiss": "Отелонено",
"Drop here to": "Перетащите сюда",
"Enable audible notifications in web client": "Включить звуковые оповещения в веб клиенте",
"Enable desktop notifications": "Включить оповещения на рабочем столе",
"Enable email notifications": "Включить email оповещения",
"Enable notifications for this account": "Включить оповещения для этого аккаунта",
"Enable them now": "Включить сейчас",
"Enter keywords separated by a comma": "Введите ключевые слова, разделенные запятой",
"Error": "Ошибка",
"Error saving email notification preferences": "Ошибка сохранения настроек email оповещений",
"#example": "#пример",
"Failed to": "Не удалось",
"Failed to add tag ": "Не удалось добавить тег ",
"Failed to change settings": "Не удалось изменить настройки",
"Failed to update keywords": "Не удалось обновить ключевые слова",
"Failed to get protocol list from Home Server": "Не удалось получить список протоколов с Пользовательского Сервера",
"Failed to get public room list": "Не удалось получить список публичных комнат",
"Failed to join the room": "Не удалось присоединиться к комнате",
"Failed to remove tag ": "Не удалось удалить тег ",
"Failed to set Direct Message status of room": "Не удалось задать статус комнаты Персональное Сообщение",
"Favourite": "Фаворит",
"Fetching third party location failed": "Не удалось получить местоположение",
"Files": "Файлы",
"Filter room names": "Отфильтровать по названию комнаты",
"Forget": "Забыть",
"from the directory": "из каталога",
" from room": " из комнаты",
"Guests can join": "Гость может присоединиться",
"Guest users can't invite users. Please register to invite": "Гость не может приглашать пользователей. Зарегистрируйтесь для приглошений",
"Invite to this room": "Пригласить в эту комнату",
"Keywords": "Ключевые слова",
"Leave": "Покинуть",
"Low Priority": "Низкий приоритет",
"Members": "Пользователи",
"No rooms to show": "Нет комнат для отображения",
"Noisy": "Шумный",
"Notification targets": "Цели уведомления",
"Notifications": "Уведомления",
"Notifications on the following keywords follow rules which cant be displayed here": "Уведомления по следующим ключевым словам соответствуют правилам, которые нельзя отобразить здесь",
"Notify for all other messages/rooms": "Уведомить обо всех других сообщениях/комнатах",
"Notify me for anything else": "Уведомить меня обо всем кроме",
"Off": "Выключить",
"On": "Включить",
"Operation failed": "Операция не удалась",
"Please Register": "Пожалуйста зарегистрируйтесь",
"powered by Matrix": "разработано в Matrix",
"Reject": "Отклонить",
"Remove": "Удалить",
"remove": "удалить",
"Remove from Directory": "Удалить из каталога",
"Riot does not know how to join a room on this network": "Riot не знает как присоединиться к этой сети",
"Room directory": "Каталог комнат",
"Room not found": "Комната не найдена",
"Search for a room": "Искать комнату",
"Settings": "Настройки",
"Start chat": "Начать чат",
"The Home Server may be too old to support third party networks": "Пользовательский сервер может быть слишком старым для поддержки сторонних сетей",
"There are advanced notifications which are not shown here": "TЗдесь представлены расширенные уведомления, которые здесь не показаны",
"The server may be unavailable or overloaded": "Возможно, сервер недоступен или перегружен",
"This room is inaccessible to guests. You may be able to join if you register": "Эта комната недоступна для гостей. Вы можете присоединиться, если зарегистрируетесь",
" to room": " к комнате",
"Unable to fetch notification target list": "Не удалось получить список целевых уведомлений",
"Unable to join network": "Не возможно присоединиться к сети",
"Unable to look up room ID from server": "Не возможно найти ID комнаты на сервере",
"unknown error code": "неизвестная ошибка",
"Unnamed room": "Комната без названия",
"World readable": "Читаем мир",
"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, но они все еще применяются",
"All messages": "Все сообщения",
"All messages (loud)": "Все сообщения (громко)",
"Cancel Sending": "Отмена отправки",
"Close": "Закрыть",
"Download this file": "Скачать этот файл",
"Drop here to %(verb)s": "Вставить сюда для %(verb)s",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Удалить псевдоним комнаты %(alias)s и очистить %(name)s из каталога?",
"Failed to add tag %(tagName)s to room": "Не удалось добавить тег %(tagName)s в комнату",
"Failed to forget room %(errCode)s": "Не удалось забыть комнату %(errCode)s",
"Failed to remove tag %(prevTag)s from room": "Не удалось удалить тег %(prevTag)s из комнаты",
"Failed to set direct chat tag": "Не удалось установить прямой чат тег",
"Unhide Preview": "Показать пред. просмотр",
"Uploaded on %(date)s by %(user)s": "Загружено %(date)s %(user)s",
"View Decrypted Source": "Просмотр зашыфрованного источника",
"View Source": "Просмотр источника",
"You cannot delete this image. (%(code)s)": "Вы не можете удалить это изображение. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Вы не можете удалить это сообщение. (%(code)s)",
"Sunday": "Воскресенье",
"Monday": "Понедельник",
"Tuesday": "Вторник",
"Wednesday": "Среда",
"Thursday": "Четверг",
"Friday": "Пятница",
"Saturday": "Субота",
"Today": "Сегодня",
"Yesterday": "Вчера",
"Mentions only": "Только упоминание",
"Mute": "Беззвучный",
"Permalink": "Пстоянная ссылка",
"Quote": "Цитата",
"Redact": "Удалить",
"Remove %(name)s from the directory?": "Удалить %(name)s из каталога?",
"remove %(name)s from the directory": "удалить %(name)s из каталога",
"Resend": "Переслать снова",
"Source URL": "Источник URL",
"Welcome page": "Домашняя страница"
}

View file

@ -18,6 +18,7 @@ limitations under the License.
var StandardActions = require('./StandardActions');
var PushRuleVectorState = require('./PushRuleVectorState');
import _t from 'counterpart-riot';
class VectorPushRuleDefinition {
constructor(opts) {

View file

@ -175,7 +175,8 @@ limitations under the License.
}
.mx_Login_type_dropdown {
width: 125px;
display: inline-block;
min-width: 125px;
align-self: flex-end;
}

View file

@ -55,6 +55,9 @@ if (process.env.NODE_ENV !== 'production') {
var RunModernizrTests = require("./modernizr"); // this side-effects a global
var ReactDOM = require("react-dom");
// Workaround for broken export
import * as counterpart from 'counterpart-riot';
var languageHandler = require("matrix-react-sdk/lib/languageHandler");
var sdk = require("matrix-react-sdk");
var PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg");
sdk.loadSkin(require('../component-index'));
@ -62,6 +65,7 @@ var VectorConferenceHandler = require('../VectorConferenceHandler');
var UpdateChecker = require("./updater");
var q = require('q');
var request = require('browser-request');
import Modal from 'matrix-react-sdk/lib/Modal';
import url from 'url';
@ -214,6 +218,20 @@ function getConfig() {
return deferred.promise;
}
// This is needed to not load the UserSettingsStore before languages are laoded
function getLocalSettings() {
const localSettingsString = localStorage.getItem('mx_local_settings') || '{}';
return JSON.parse(localSettingsString);
}
// This is needed to not load the UserSettingsStore before languages are laoded
function setLocalSetting(type, value) {
const settings = getLocalSettings();
settings[type] = value;
// FIXME: handle errors
localStorage.setItem('mx_local_settings', JSON.stringify(settings));
}
function onLoadCompleted() {
// if we did a token login, we're now left with the token, hs and is
// url as query params in the url; a little nasty but let's redirect to
@ -228,8 +246,8 @@ function onLoadCompleted() {
}
}
async function loadApp() {
const fragparts = parseQsFromFragment(window.location);
const params = parseQs(window.location);
@ -263,6 +281,17 @@ async function loadApp() {
configError = e;
}
if (!configJson.languages) {
let languages;
try {
languages = await languageHandler.getAllLanguageKeysFromJson();
} catch (e) {
console.log("couldn't load languages from languages.json: error = "+e);
languages = ['en'];
}
configJson.languages = languages;
}
if (window.localStorage && window.localStorage.getItem('mx_accepts_unsupported_browser')) {
console.log('User has previously accepted risks in using an unsupported browser');
validBrowser = true;
@ -309,4 +338,17 @@ async function loadApp() {
}
}
loadApp();
function loadLanguage(callback) {
const _localSettings = getLocalSettings();
var languages = [];
if (!_localSettings.hasOwnProperty('language')) {
languages = languageHandler.getNormalizedLanguageKeys(languageHandler.getLanguageFromBrowser());
}else {
languages = languageHandler.getNormalizedLanguageKeys(_localSettings.language);
}
languageHandler.setLanguage(languages, counterpart);
setLocalSetting('language', languages[0]);
callback();
}
loadLanguage(loadApp);