Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 6c48279

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents e266edf + ecbc724 commit 6c48279

File tree

8 files changed

+119
-16
lines changed

8 files changed

+119
-16
lines changed

src/components/structures/login/Login.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ limitations under the License.
1818
'use strict';
1919

2020
import React from 'react';
21-
import { _t } from '../../../languageHandler';
21+
import { _t, _tJsx } from '../../../languageHandler';
2222
import ReactDOM from 'react-dom';
2323
import sdk from '../../../index';
2424
import Login from '../../../Login';

src/components/views/elements/LanguageDropdown.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,7 @@ export default class LanguageDropdown extends React.Component {
4040
}
4141

4242
componentWillMount() {
43-
languageHandler.getAllLanguageKeysFromJson().then((langKeys) => {
44-
const langs = [];
45-
langKeys.forEach((languageKey) => {
46-
langs.push({
47-
value: languageKey,
48-
label: _t(languageKey)
49-
});
50-
});
43+
languageHandler.getAllLanguagesFromJson().then((langs) => {
5144
langs.sort(function(a, b){
5245
if(a.label < b.label) return -1;
5346
if(a.label > b.label) return 1;

src/components/views/elements/PowerSelector.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ module.exports = React.createClass({
118118
});
119119
options.push({ value: "Custom", text: "Custom level" });
120120
options = options.map((op) => {
121-
return <option value={op.value}>{op.text}</option>;
121+
return <option value={op.value} key={op.value}>{op.text}</option>;
122122
});
123123

124124
select =
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
Copyright 2017 Vector Creations Ltd
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import React from 'react';
18+
import MatrixClientPeg from '../../../MatrixClientPeg';
19+
import { ContentRepo } from 'matrix-js-sdk';
20+
import { _t, _tJsx } from '../../../languageHandler';
21+
import sdk from '../../../index';
22+
import Modal from '../../../Modal';
23+
import AccessibleButton from '../elements/AccessibleButton';
24+
25+
module.exports = React.createClass({
26+
displayName: 'RoomAvatarEvent',
27+
28+
propTypes: {
29+
/* the MatrixEvent to show */
30+
mxEvent: React.PropTypes.object.isRequired,
31+
},
32+
33+
onAvatarClick: function(name) {
34+
var httpUrl = MatrixClientPeg.get().mxcUrlToHttp(this.props.mxEvent.getContent().url);
35+
var ImageView = sdk.getComponent("elements.ImageView");
36+
var params = {
37+
src: httpUrl,
38+
name: name,
39+
};
40+
Modal.createDialog(ImageView, params, "mx_Dialog_lightbox");
41+
},
42+
43+
render: function() {
44+
var ev = this.props.mxEvent;
45+
var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
46+
var BaseAvatar = sdk.getComponent("avatars.BaseAvatar");
47+
48+
var room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
49+
var name = _t('%(senderDisplayName)s changed the avatar for %(roomName)s', {
50+
senderDisplayName: senderDisplayName,
51+
roomName: room ? room.name : '',
52+
});
53+
54+
if (!ev.getContent().url || ev.getContent().url.trim().length === 0) {
55+
return (
56+
<div className="mx_TextualEvent">
57+
{ _t('%(senderDisplayName)s removed the room avatar.', {senderDisplayName: senderDisplayName}) }
58+
</div>
59+
);
60+
}
61+
62+
var url = ContentRepo.getHttpUriForMxc(
63+
MatrixClientPeg.get().getHomeserverUrl(),
64+
ev.getContent().url,
65+
14 * window.devicePixelRatio,
66+
14 * window.devicePixelRatio,
67+
'crop'
68+
);
69+
70+
// it sucks that _tJsx doesn't support normal _t substitutions :((
71+
return (
72+
<div className="mx_RoomAvatarEvent">
73+
{ _tJsx('$senderDisplayName changed the room avatar to <img/>',
74+
[
75+
/\$senderDisplayName/,
76+
/<img\/>/,
77+
],
78+
[
79+
(sub) => senderDisplayName,
80+
(sub) =>
81+
<AccessibleButton key="avatar" className="mx_RoomAvatarEvent_avatar"
82+
onClick={ this.onAvatarClick.bind(this, name) }>
83+
<BaseAvatar width={14} height={14} url={ url }
84+
name={ name } />
85+
</AccessibleButton>,
86+
]
87+
)
88+
}
89+
</div>
90+
);
91+
},
92+
});

src/components/views/messages/TextualEvent.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ import sdk from '../../../index';
2424
module.exports = React.createClass({
2525
displayName: 'TextualEvent',
2626

27+
propTypes: {
28+
/* the MatrixEvent to show */
29+
mxEvent: React.PropTypes.object.isRequired,
30+
},
31+
2732
render: function() {
2833
const EmojiText = sdk.getComponent('elements.EmojiText');
2934
var text = TextForEvent.textForEvent(this.props.mxEvent);

src/components/views/rooms/EventTile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ var eventTileTypes = {
3838
'm.call.answer' : 'messages.TextualEvent',
3939
'm.call.hangup' : 'messages.TextualEvent',
4040
'm.room.name' : 'messages.TextualEvent',
41+
'm.room.avatar' : 'messages.RoomAvatarEvent',
4142
'm.room.topic' : 'messages.TextualEvent',
4243
'm.room.third_party_invite' : 'messages.TextualEvent',
4344
'm.room.history_visibility' : 'messages.TextualEvent',

src/i18n/strings/en_EN.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -776,5 +776,8 @@
776776
"Online": "Online",
777777
"Idle": "Idle",
778778
"Offline": "Offline",
779-
"Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)"
779+
"Disable URL previews for this room (affects only you)": "Disable URL previews for this room (affects only you)",
780+
"$senderDisplayName changed the room avatar to <img/>": "$senderDisplayName changed the room avatar to <img/>",
781+
"%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removed the room avatar.",
782+
"%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s changed the avatar for %(roomName)s"
780783
}

src/languageHandler.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export function setLanguage(preferredLangs) {
133133
throw new Error("Unable to find an appropriate language");
134134
}
135135

136-
return getLanguage(i18nFolder + availLangs[langToUse]);
136+
return getLanguage(i18nFolder + availLangs[langToUse].fileName);
137137
}).then((langData) => {
138138
counterpart.registerTranslations(langToUse, langData);
139139
counterpart.setLocale(langToUse);
@@ -142,16 +142,25 @@ export function setLanguage(preferredLangs) {
142142

143143
// Set 'en' as fallback language:
144144
if (langToUse != "en") {
145-
return getLanguage(i18nFolder + availLangs['en']);
145+
return getLanguage(i18nFolder + availLangs['en'].fileName);
146146
}
147147
}).then((langData) => {
148148
if (langData) counterpart.registerTranslations('en', langData);
149149
});
150150
};
151151

152-
export function getAllLanguageKeysFromJson() {
153-
return getLangsJson().then((langs) => {
154-
return Object.keys(langs);
152+
export function getAllLanguagesFromJson() {
153+
return getLangsJson().then((langsObject) => {
154+
var langs = [];
155+
for (var langKey in langsObject) {
156+
if (langsObject.hasOwnProperty(langKey)) {
157+
langs.push({
158+
'value': langKey,
159+
'label': langsObject[langKey].label
160+
});
161+
}
162+
}
163+
return langs;
155164
});
156165
}
157166

0 commit comments

Comments
 (0)