Compare commits

...

331 Commits

Author SHA1 Message Date
David Baker
26bb962a3c v0.10.2 2017-06-06 17:45:07 +01:00
David Baker
88e159e462 Prepare changelog for v0.10.2 2017-06-06 17:45:06 +01:00
David Baker
951b63898b v0.10.2 2017-06-06 17:43:57 +01:00
David Baker
3d51156b7e Temporarily revert 2017-06-06 17:43:34 +01:00
David Baker
d648dc867e v0.10.2 2017-06-06 17:41:57 +01:00
David Baker
a62ed0eb03 reatc-sdk 0.9.2 2017-06-06 17:41:26 +01:00
Matthew Hodgson
5add4a1b95 v0.10.1 2017-06-02 22:48:18 +01:00
Matthew Hodgson
7b7482f21f Prepare changelog for v0.10.1 2017-06-02 22:48:17 +01:00
Matthew Hodgson
a4526097ce v0.10.1 2017-06-02 22:46:25 +01:00
Matthew Hodgson
dea012f460 bump to 0.9.1 2017-06-02 22:45:59 +01:00
Matthew Hodgson
49e9d58418 oops, expand the dropdown a bit if possible 2017-06-02 22:10:29 +01:00
Matthew Hodgson
4b92bbe6f4 enable swedish, as it's got bigger than danish & dutch 2017-06-02 22:05:46 +01:00
David Baker
24a5297fc8 v0.10.0 2017-06-02 14:37:10 +01:00
David Baker
545b26ba80 Prepare changelog for v0.10.0 2017-06-02 14:37:09 +01:00
David Baker
4bbf950b3d v0.10.0 2017-06-02 14:36:39 +01:00
David Baker
b4a0e85d90 released react-sdk 2017-06-02 14:25:12 +01:00
RiotTranslate
fd6815d943 Update from Weblate. (#4159)
* Translated using Weblate (Chinese (Traditional))

Currently translated at 61.1% (99 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/zh_Hant/

* Translated using Weblate (German)

Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 90.7% (147 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/zh_Hant/

* Translated using Weblate (Swedish)

Currently translated at 43.8% (71 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/

* Translated using Weblate (Swedish)

Currently translated at 46.2% (75 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/

* Translated using Weblate (German)

Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Swedish)

Currently translated at 61.7% (100 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/

* Translated using Weblate (Swedish)

Currently translated at 72.2% (117 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/
2017-06-02 13:56:50 +01:00
RiotTranslate
4c28637ecf Update from Weblate. (#4155)
* Translated using Weblate (Chinese (Traditional))

Currently translated at 61.1% (99 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/zh_Hant/

* Translated using Weblate (German)

Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 90.7% (147 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/zh_Hant/

* Translated using Weblate (Swedish)

Currently translated at 43.8% (71 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/

* Translated using Weblate (Swedish)

Currently translated at 46.2% (75 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/
2017-06-02 13:51:19 +01:00
dtygel
a1a6cc6572 sync pt with pt_BR (#4158)
* fix after rebase

* add string to translate in messagecontextmenu

* sync pt with pt_BR
2017-06-02 13:50:21 +01:00
Matthew Hodgson
43f8b22737 Merge pull request #4152 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-06-02 12:27:03 +01:00
Bamstam
0ca819a0f8 Translated using Weblate (German)
Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-06-02 09:56:28 +00:00
dtygel
64663ab725 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/
2017-06-02 05:36:39 +00:00
Krombel
d211a5b855 Translated using Weblate (German)
Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-06-02 05:35:38 +00:00
RiotTranslate
cd78be2a0a Merge remote-tracking branch 'origin/develop' into develop 2017-06-02 02:40:47 +00:00
jx tsai
f542de7bc1 Translated using Weblate (Chinese (Traditional))
Currently translated at 0.0% (0 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/zh_Hant/
2017-06-02 02:40:47 +00:00
dtygel
136ebcd792 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/
2017-06-02 02:40:45 +00:00
Matthew Hodgson
921ffc3762 v0.10.0-rc.2 2017-06-02 01:21:19 +01:00
Matthew Hodgson
9c6e130f50 Prepare changelog for v0.10.0-rc.2 2017-06-02 01:21:18 +01:00
Matthew Hodgson
774c410eda v0.10.0-rc.2 2017-06-02 01:20:34 +01:00
Matthew Hodgson
ce4a2e48d6 bump deps 2017-06-02 01:18:37 +01:00
Matthew Hodgson
943c9d931e v0.10.0-rc.1 2017-06-02 01:12:19 +01:00
Matthew Hodgson
35f0dc7a78 Prepare changelog for v0.10.0-rc.1 2017-06-02 01:12:19 +01:00
Matthew Hodgson
e6745e5eea Merge pull request #4150 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-06-02 01:08:49 +01:00
Matthew Hodgson
949fd71c17 Merge pull request #4019 from vector-im/t3chguy/webrtc_settings
styling for webrtc settings
2017-06-02 00:48:06 +01:00
Matthew Hodgson
5cf9a48575 fix fr layout 2017-06-02 00:20:52 +01:00
Matthew Hodgson
a5db7f4f19 expand dropdown for fr i18n 2017-06-02 00:16:27 +01:00
Jean GB
ee70c02af0 Translated using Weblate (French)
Currently translated at 100.0% (162 of 162 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-06-01 21:48:53 +00:00
Matthew Hodgson
e921a0714f missing string 2017-06-01 22:08:17 +01:00
Matthew Hodgson
ac2a5a882d Merge pull request #4140 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-06-01 21:34:02 +01:00
Matthew Hodgson
f099f56f01 Merge pull request #4132 from uhoreg/compact
add styles for compact layout
2017-06-01 21:32:46 +01:00
David Baker
19f9900b55 Merge pull request #4147 from vector-im/rav/fetch_deps_tweaks
Various tweaks to fetch-develop-deps
2017-06-01 18:48:43 +01:00
David Baker
9e46d174a5 Merge pull request #4145 from vector-im/rav/pin_to_node_6.3
Don't try to build with node 6.0
2017-06-01 18:40:26 +01:00
Matthew Hodgson
1fbec01edb Merge pull request #4143 from turt2live/travis/date-sep-12h
Support 12hr time on DateSeparator
2017-06-01 18:29:53 +01:00
Richard van der Hoff
81c0c7bd4f Various tweaks to fetch-develop-deps
* tell git to checkout the right branch, rather than cloning and then changing.
* clone with depth 1 under travis, to save time.
* less pushd/popd, which print out confusing text - use `cd` in a subshell
  instead. (and just avoid it where possible).
* add some markers to the output to let travis roll it up.
2017-06-01 18:18:46 +01:00
Richard van der Hoff
71aed70d4b Don't try to build with node 6.0
because it has broken npm
2017-06-01 17:55:52 +01:00
Hubert Chathi
9f597e9d3c fix alignment of info event tiles 2017-06-01 12:09:36 -04:00
turt2live
640fa108fc Support 12hr time on DateSeparator
Signed-off-by: Travis Ralston <travpc@gmail.com>
2017-06-01 09:52:42 -06:00
RiotTranslate
fcdfec9d64 Merge remote-tracking branch 'origin/develop' into develop 2017-06-01 15:18:21 +00:00
Jean GB
569e54e5a9 Translated using Weblate (French)
Currently translated at 100.0% (161 of 161 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-06-01 15:18:20 +00:00
Richard van der Hoff
e868dbbb94 No need to make olm an external (#4139)
matrix-js-sdk now loads olm from global.Olm instead of requiring it
(https://github.com/matrix-org/matrix-js-sdk/pull/446), so we no longer need to
define it as an external.
2017-06-01 15:46:37 +01:00
Matthew Hodgson
4f1fad2739 improve legibility and compactness by shrinking sender name a bit 2017-06-01 15:28:02 +01:00
dtygel
33cf39e9a0 Add language picker labels (#4141)
* fix after rebase

* add string to translate in messagecontextmenu

* add labels for language picker
2017-06-01 14:38:36 +01:00
RiotTranslate
09f722a466 Merge remote-tracking branch 'origin/develop' into develop 2017-06-01 13:08:11 +00:00
Matthew Hodgson
81ea3845a0 tweak roomavatarevent css 2017-06-01 13:29:27 +01:00
RiotTranslate
78b6d4dd94 Merge remote-tracking branch 'origin/develop' into develop 2017-06-01 12:18:57 +00:00
Matthew Hodgson
e825a66e1f add CSS for RoomAvatarEvent and always make AccessibleButtons have a cursor pointer 2017-06-01 13:09:23 +01:00
RiotTranslate
31c75ff240 Update from Weblate. (#4137)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (128 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 92.9% (119 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 87.5% (112 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.5% (122 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (French)

Currently translated at 93.0% (120 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (German)

Currently translated at 100.0% (161 of 161 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (French)

Currently translated at 100.0% (161 of 161 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-06-01 12:40:27 +01:00
Amandine
0452db7e80 Translated using Weblate (French)
Currently translated at 100.0% (161 of 161 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-06-01 11:37:53 +00:00
RiotTranslate
08646f102f Merge remote-tracking branch 'origin/develop' into develop 2017-06-01 10:59:37 +00:00
Krombel
0940d57d42 Translated using Weblate (German)
Currently translated at 100.0% (161 of 161 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-06-01 10:59:34 +00:00
Matthew Hodgson
cb33302f10 add spanish & dutch 2017-06-01 11:44:55 +01:00
RiotTranslate
746647d426 Merge remote-tracking branch 'origin/develop' into develop 2017-06-01 10:33:36 +00:00
Hubert Chathi
9aa10ba15c also shrink the composer bar when you don't have permissions 2017-05-31 23:03:30 -04:00
Hubert Chathi
0c865e81a2 add styles for compact layout
Signed-off-by: Hubert Chathi <hubert@uhoreg.ca>
2017-05-31 22:21:20 -04:00
Matthew Hodgson
3bab49ba86 v0.10.0-rc.1 2017-06-01 02:48:53 +01:00
Matthew Hodgson
0fbd73a3c9 bump js & react sdk 2017-06-01 02:16:57 +01:00
Matthew Hodgson
21cf79bc54 Merge pull request #4030 from vector-im/t3chguy/electron_profiles
basic electron profile support
2017-06-01 01:33:01 +01:00
Matthew Hodgson
292b50f1ac fix myriad bugs in i18n files 2017-06-01 00:51:56 +01:00
RiotTranslate
d12c349e1f Update from Weblate. (#4105)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (128 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 92.9% (119 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 87.5% (112 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.5% (122 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (French)

Currently translated at 93.0% (120 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-06-01 00:37:08 +01:00
Matthew Hodgson
6f9d94f72f Merge pull request #4122 from vector-im/kegan/translation-macaque
Finish translations for vector-im/riot-web
2017-06-01 00:36:54 +01:00
Matthew Hodgson
aa5587ba95 Merge branch 'develop' into kegan/translation-macaque 2017-06-01 00:36:37 +01:00
Matthew Hodgson
bac5ae89ce Merge pull request #4119 from vector-im/kegan/translation-chimp
Translate src/vector
2017-06-01 00:34:45 +01:00
Matthew Hodgson
d988eb58c1 Merge pull request #4128 from vector-im/t3chguy/electron_flash
electron flashFrame was way too annoying
2017-06-01 00:14:58 +01:00
Michael Telatynski
5762323bd1 Merge branch 'develop' into t3chguy/electron_profiles 2017-06-01 00:01:53 +01:00
Michael Telatynski
33ee42f821 use loudNotification for flashFrame, resetting on count=0 or focus
win32 check is optional just there so we're not attaching pointless handlers

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-06-01 00:00:00 +01:00
Richard van der Hoff
89e5c4f8ae Fix fetch-develop-deps.sh
This got broken by https://github.com/vector-im/riot-web/pull/4120 so that it
didn't work on a clean git clone.
2017-05-31 23:50:06 +01:00
Amandine
9275b310ad Translated using Weblate (French)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-31 18:59:30 +00:00
Kegan Dougal
7dc55a9a47 Import correctly 2017-05-31 17:53:32 +01:00
Kegan Dougal
a7659a57a8 Add remaining translations 2017-05-31 16:56:50 +01:00
RiotTranslate
80bef09b85 Merge remote-tracking branch 'origin/develop' into develop 2017-05-31 15:42:02 +00:00
Jean GB
5d03488673 Translated using Weblate (French)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-31 15:42:00 +00:00
Kegan Dougal
a3ebeb5c69 Sanitize translated HTML 2017-05-31 16:38:51 +01:00
Kegan Dougal
c4c2b760ba Add translation from #4103 2017-05-31 16:07:12 +01:00
Kegan Dougal
1dce9cda9e Translate src/components/views/globals
directory and elements already done
2017-05-31 16:02:59 +01:00
Kegan Dougal
162f3872e5 Translate src/components/context_menus|dialogs 2017-05-31 15:40:49 +01:00
Richard van der Hoff
0e742cec27 scripts/fetch-develop.deps.sh: set -e (#4120)
... so that when the git clone fails, it doesn't plough on regardless.
2017-05-31 15:37:30 +01:00
Kegan Dougal
fd5e7ff37a Translate src/vector 2017-05-31 15:06:03 +01:00
Kegan Dougal
52ddcd8a60 Translate src/vector/platform 2017-05-31 14:51:08 +01:00
dtygel
decd6668c0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/
2017-05-31 12:07:35 +00:00
Jean GB
21783d6ade Translated using Weblate (French)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-31 09:55:54 +00:00
Jean GB
a0d641df18 Translated using Weblate (French)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-31 08:40:46 +00:00
RiotTranslate
4b26453f91 Merge remote-tracking branch 'origin/develop' into develop 2017-05-31 04:16:36 +00:00
RiotTranslate
020d496cb1 Update from Weblate. (#4094)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (128 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 92.9% (119 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 87.5% (112 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/

* Translated using Weblate (German)

Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 94.5% (122 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/

* Translated using Weblate (French)

Currently translated at 93.0% (120 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-31 00:38:30 +01:00
RiotTranslate
325727377b Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 23:33:42 +00:00
Thomas Juberg
dfa1b553f0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 94.5% (122 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/
2017-05-30 23:33:41 +00:00
Amandine
db0c84f317 Translated using Weblate (French)
Currently translated at 93.0% (120 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-30 23:33:41 +00:00
Krombel
4d06739a3c Translated using Weblate (German)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 23:33:39 +00:00
Matthew Hodgson
448c10736a Merge pull request #4012 from vector-im/t3chguy/electron_settings
auto-launch support [Electron]
2017-05-30 23:59:15 +01:00
Szimszon
c8eb2b0f19 Translated using Weblate (Hungarian)
Currently translated at 100.0% (129 of 129 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/
2017-05-30 20:27:41 +00:00
RiotTranslate
09b180c84c Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 20:20:16 +00:00
dtygel
b588618b0e Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.9% (119 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/pt_BR/
2017-05-30 20:20:15 +00:00
Thomas Juberg
94c4e54d7c Translated using Weblate (Norwegian Bokmål)
Currently translated at 87.5% (112 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/
2017-05-30 20:20:15 +00:00
Szimszon
7b96b18c70 Translated using Weblate (Hungarian)
Currently translated at 100.0% (128 of 128 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/
2017-05-30 20:20:13 +00:00
Matthew Hodgson
4493994dd5 Merge pull request #4092 from turt2live/travis/12hrtime-hotfix
Show 12hr time on hover too
2017-05-30 20:15:00 +01:00
RiotTranslate
e79df6a947 Update from Weblate. (#4091)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 20:14:23 +01:00
Matthew Hodgson
386fcb96fd Merge pull request #4087 from vector-im/kegan/translation-ape
Translate src/notifications
2017-05-30 20:14:10 +01:00
turt2live
676bd6196f Show 12hr time on hover too
Signed-off-by: Travis Ralston <travpc@gmail.com>
2017-05-30 13:07:49 -06:00
RiotTranslate
a3f024bc69 Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 18:26:53 +00:00
Bamstam
5c5b42e930 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 18:26:53 +00:00
RiotTranslate
045c32bd2e Update from Weblate. (#4089)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 18:48:06 +01:00
RiotTranslate
7a744e751d Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 17:16:49 +00:00
Bamstam
84661ee544 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 17:16:48 +00:00
Matthew Hodgson
f4c7aaf138 Merge pull request #4084 from vector-im/kegan/translation-monkey
Translate src/components/structures
2017-05-30 18:13:36 +01:00
RiotTranslate
cd4efc903d Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 17:10:19 +00:00
RiotTranslate
88edd1620c Update from Weblate. (#4083)
* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 18:09:39 +01:00
Bamstam
bef8e3ba42 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 17:04:28 +00:00
Kegan Dougal
2a122a25fa Translate notification strings 2017-05-30 17:39:41 +01:00
RiotTranslate
b9d13c6113 Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 16:29:10 +00:00
Matthew Hodgson
485d080f85 Merge pull request #4085 from turt2live/travis/12h-ts-collision
Smaller font size on timestamp to better fit in the available space
2017-05-30 17:23:39 +01:00
Bamstam
2199fd7959 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 15:50:51 +00:00
turt2live
3f04a42229 Smaller font size on timestamp to better fit in the available space
Part of addressing vector-im/riot-web#4046

Signed-off-by: Travis Ralston <travpc@gmail.com>
2017-05-30 09:32:27 -06:00
Kegan Dougal
1b4444cc73 Add missing translations 2017-05-30 16:30:56 +01:00
Kegan Dougal
7e21e00c99 Translate src/components/structures 2017-05-30 16:27:48 +01:00
RiotTranslate
90a308e6cb Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 15:12:53 +00:00
Richard van der Hoff
469bb8fbc6 Merge pull request #4079 from vector-im/rav/node_versions
Make travis run the build with several versions of node
2017-05-30 16:06:48 +01:00
Matthew Hodgson
60a56d0617 Merge pull request #4056 from vector-im/t3chguy/piwik
Piwik Analytics
2017-05-30 15:59:08 +01:00
Krombel
eaaca91ba2 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 14:55:37 +00:00
Richard van der Hoff
33b95d4965 Standardise on node v6/v7 2017-05-30 15:53:21 +01:00
Bamstam
e5009a0932 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 14:48:13 +00:00
Bamstam
6568249558 Translated using Weblate (German)
Currently translated at 99.1% (119 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 14:47:50 +00:00
Bamstam
79b1031e39 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 14:46:43 +00:00
Matthew Hodgson
e405d3f179 Merge pull request #4077 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-30 15:09:18 +01:00
RiotTranslate
d96c3656a6 Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 14:01:24 +00:00
Matthew Hodgson
8e1dea7bd1 Merge pull request #4078 from vector-im/t3chguy/pl_redact_fix
managed to eat the eventStatus check, can't redact a local-echo etc
2017-05-30 14:21:41 +01:00
Michael Telatynski
6a57742343 managed to eat the eventStatus check, can't redact a local-echo etc
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-30 14:19:33 +01:00
RiotTranslate
a61b7af17a Merge remote-tracking branch 'origin/develop' into develop 2017-05-30 13:14:29 +00:00
RiotTranslate
e15d070e8f [WEBLATE] fix issues. 2017-05-30 13:11:04 +00:00
Bhuvan Krishna
83926eefce Added translation using Weblate (Telugu) 2017-05-30 12:22:01 +00:00
Michael Telatynski
0e96968c4e explicitly call install:electron in case electron-builder is silly
(which has hit me once)

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-30 12:35:57 +01:00
Michael Telatynski
53b7b6cb14 Merge branch 't3chguy/electron_settings' of github.com:vector-im/riot-web into t3chguy/electron_settings 2017-05-30 12:34:05 +01:00
Michael Telatynski
662ce3c4b4 Merge branch 'develop' of github.com:vector-im/riot-web into t3chguy/electron_settings 2017-05-30 12:33:41 +01:00
Michael Telatynski
c54e2a30b6 explicitly hide because setApplicationMenu on Linux otherwise shows...
https://github.com/electron/electron/issues/9621

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-30 12:33:32 +01:00
Michael Telatynski
db602f2bc0 Merge branch 'develop' into t3chguy/electron_profiles 2017-05-30 11:00:51 +01:00
Michael Telatynski
b27600adbe Improve for Mac - Tested on 10.10.5 2017-05-30 10:53:01 +01:00
Luke Barnard
543f4efc37 Merge pull request #3925 from vector-im/t3chguy/show_redact_if_can
show redact in context menu only if has PL to/sent message
2017-05-30 10:13:20 +01:00
RiotTranslate
b3426a1268 Update from Weblate. (#4064)
* Added translation using Weblate (Ukrainian)

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-30 04:00:36 +01:00
Michael Telatynski
17c4e7a748 check PL on change as well as on comp load, that way it'll show remove button if PL increases later.
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 23:49:56 +01:00
Michael Telatynski
d3f9304598 Merge branch 'develop' of github.com:vector-im/riot-web into t3chguy/show_redact_if_can 2017-05-29 23:17:44 +01:00
Michael Telatynski
9c25aab509 Fix bad merge (3993 before 4021 broke things)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 22:12:36 +01:00
Michael Telatynski
1d2bd68200 Merge branch 'develop' of github.com:vector-im/riot-web into t3chguy/electron_settings 2017-05-29 22:12:06 +01:00
Michael Telatynski
b9ec25b32f add flow annotation
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 20:03:21 +01:00
Michael Telatynski
e991461e8d add new BasePlatform method, Analytics fun on the Webpack train
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 19:51:28 +01:00
Michael Telatynski
8a59acb5c3 explicit protocol in configs, otherwise breaks in Electron
when it tries file://

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 19:32:44 +01:00
Michael Telatynski
dda73cecf9 make eslint happy about MatrixToolbar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 19:12:04 +01:00
Matthew Hodgson
8ef7dda7bd fixing missing OK button on TextInputDialog 2017-05-29 16:43:28 +01:00
Bamstam
7674a43e7f Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-29 15:07:11 +00:00
Michael Telatynski
3e7b738b11 move all piwik init stuff to MatrixChat/Analytics
as it now relies on SDKConfig

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 14:22:57 +01:00
Michael Telatynski
3e7ef112f0 opt out based on analyticsOptOut localSetting
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-29 13:17:12 +01:00
Strix Aluco
00cf1da758 Added translation using Weblate (Ukrainian) 2017-05-29 06:57:55 +00:00
Matthew Hodgson
fabae2f19f Merge pull request #3722 from turt2live/travis/redact-to-remove
Change redact -> remove to improve clarity
2017-05-28 22:41:52 +01:00
Matthew Hodgson
da7c6ca856 Merge branch 'develop' into travis/redact-to-remove 2017-05-28 22:41:38 +01:00
Matthew Hodgson
47d412df73 Merge pull request #4058 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-28 21:46:38 +01:00
Matthew Hodgson
ab9ecc4f64 remove duplicate i18n keys 2017-05-28 21:35:47 +01:00
Radium
3df6ecfe84 Added translation using Weblate (Chinese (Traditional)) 2017-05-28 16:11:35 +00:00
Chazy Chaz
0bdbdc2d1c Translated using Weblate (Spanish)
Currently translated at 95.0% (114 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/es/
2017-05-28 15:43:24 +00:00
Chazy Chaz
367585cf6f Translated using Weblate (Spanish)
Currently translated at 18.3% (22 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/es/
2017-05-28 13:35:30 +00:00
RiotTranslate
7b00be7f57 remove wrong generated file 2017-05-28 13:34:53 +00:00
Chazy Chaz
efe3c239e1 Added translation using Weblate (Spanish) 2017-05-28 12:41:24 +00:00
Chazy Chaz
44e58d2eff Added translation using Weblate (_ES (generated)) 2017-05-28 12:40:43 +00:00
PureTryOut
c238fe6605 Translated using Weblate (Dutch)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nl/
2017-05-28 12:33:35 +00:00
Michael Telatynski
28d929f901 correct electron config to not point at personal piwik
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-28 13:10:13 +01:00
Michael Telatynski
6969baa5a6 change event wording
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-28 13:08:09 +01:00
Michael Telatynski
c2c417b207 add piwik config to riot.im electron build config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-28 13:07:56 +01:00
PureTryOut
c02ee7a0dd Translated using Weblate (Dutch)
Currently translated at 5.0% (6 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nl/
2017-05-28 11:18:32 +00:00
PureTryOut
03f698ce8c Translated using Weblate (Dutch)
Currently translated at 4.1% (5 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nl/
2017-05-28 11:17:54 +00:00
RiotTranslate
fb523fd613 [WEBLATE] fix merge issue 2017-05-28 11:17:13 +00:00
Thomas Juberg
46bca69321 Translated using Weblate (Norwegian Bokmål)
Currently translated at 9.1% (11 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/nb_NO/
2017-05-28 11:04:08 +00:00
PureTryOut
6039e5a2be Added translation using Weblate (Dutch) 2017-05-28 11:04:06 +00:00
Michael Telatynski
2e75640cdd sample piwik config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-28 11:27:33 +01:00
Matthew Hodgson
0c140df789 Merge pull request #3688 from t3chguy/forward_message
Message Forwarding
2017-05-28 02:37:24 +01:00
Matthew Hodgson
2f71dc9fe5 Merge branch 'develop' into forward_message 2017-05-28 02:37:10 +01:00
RiotTranslate
73a811aa91 Update from Weblate. (#4057)
* Added translation using Weblate (Norwegian Bokmål)

* Translated using Weblate (German)

Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/

* Translated using Weblate (Hungarian)

Currently translated at 55.0% (66 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/
2017-05-27 23:28:44 +01:00
RiotTranslate
bbdfe39745 Merge remote-tracking branch 'origin/develop' into develop 2017-05-27 22:13:01 +00:00
Szimszon
918aa01ee5 Translated using Weblate (Hungarian)
Currently translated at 55.0% (66 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/
2017-05-27 22:13:00 +00:00
Bamstam
c83188be51 Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-27 22:13:00 +00:00
Thomas Juberg
664b5c29c3 Added translation using Weblate (Norwegian Bokmål) 2017-05-27 22:12:59 +00:00
Michael Telatynski
21b88ecfd5 Merge branch 'develop' of github.com:vector-im/riot-web into t3chguy/piwik 2017-05-27 20:59:26 +01:00
Michael Telatynski
195fcba696 correct DNT check
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-27 20:56:25 +01:00
Michael Telatynski
61a67c52c5 initial piwik stuff
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-27 20:39:52 +01:00
Matthew Hodgson
4a3480b935 fix broken vars in i18n 2017-05-27 20:17:19 +01:00
Matthew Hodgson
85e6cbe0c7 oops, fix var names 2017-05-27 19:28:54 +01:00
Matthew Hodgson
4293273e55 fix a bunch of i18n fails picked up by check-i18n.pl 2017-05-27 19:26:19 +01:00
Matthew Hodgson
29653e88f7 Merge pull request #4053 from ollieh/issues/3927
Fixed an input field's background color in dark theme
2017-05-27 17:21:31 +01:00
Oliver Hunt
a526bd95aa Fixed an input field's background color in dark theme 2017-05-27 15:15:45 +01:00
Matthew Hodgson
ded2f95003 Merge pull request #4051 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-27 12:32:18 +01:00
RiotTranslate
94dd41f34e Merge remote-tracking branch 'origin/develop' into develop 2017-05-27 11:30:15 +00:00
nouts
b33eab0188 Translated using Weblate (French)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fr/
2017-05-27 11:30:14 +00:00
Tulir Asokan
4ff09199d7 Translated using Weblate (Finnish)
Currently translated at 0.8% (1 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/fi/
2017-05-27 11:30:14 +00:00
Matthew Hodgson
59a6879db9 Merge pull request #4049 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-27 11:21:54 +01:00
Tulir Asokan
a60ab42ee3 Added translation using Weblate (Finnish) 2017-05-27 07:33:17 +00:00
Matthew Hodgson
1a3c09dc1b Merge pull request #4048 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-27 01:08:21 +01:00
RiotTranslate
012cdf590a Merge remote-tracking branch 'origin/develop' into develop 2017-05-26 23:21:48 +00:00
Max Sandholm
ac42fbbd49 Translated using Weblate (Swedish)
Currently translated at 31.6% (38 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/sv/
2017-05-26 23:21:48 +00:00
dambador
0074fa00ac Translated using Weblate (Russian)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/ru/
2017-05-26 23:21:48 +00:00
Szimszon
8e250531ce Translated using Weblate (Hungarian)
Currently translated at 11.6% (14 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/hu/
2017-05-26 23:21:48 +00:00
Matthew Hodgson
1ff6d4846c css for alwaysShowTimestamps 2017-05-27 00:13:59 +01:00
Matthew Hodgson
a12cfdb53c Merge pull request #4040 from RiotTranslate/weblate-riot-web-riot-web
Update from Weblate.
2017-05-26 23:00:35 +01:00
David Baker
d0395b939a Add babel eslint plugin
As our linter has been failing because it needs it
2017-05-26 22:59:40 +01:00
David Baker
22e5e2126b rev-parse the commit from the deps
Because it's not added to package.json by npm anymore
2017-05-26 22:52:49 +01:00
Matthew Hodgson
35a671d43c more i18n instructions 2017-05-26 22:45:14 +01:00
David Baker
96393f69b6 Remove old versions before linking react/js sdk 2017-05-26 22:37:44 +01:00
Max Sandholm
34af9f9b4b Added translation using Weblate (Swedish) 2017-05-26 21:20:16 +00:00
Szimszon
411a8be61d Added translation using Weblate (Hungarian) 2017-05-26 20:17:47 +00:00
Stanislav N
930e8af48b Translated using Weblate (Russian)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/ru/
2017-05-26 20:11:47 +00:00
Stanislav N
3a7888e8a8 Translated using Weblate (Russian)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/ru/
2017-05-26 20:07:45 +00:00
RiotTranslate
84fdcf1fff Merge remote-tracking branch 'origin/develop' into develop 2017-05-26 20:00:29 +00:00
dambador
de07654f2d Translated using Weblate (Russian)
Currently translated at 90.8% (109 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/ru/
2017-05-26 20:00:27 +00:00
Matthew Hodgson
3815872cf7 Merge pull request #4041 from turt2live/patch-1
Update translating.md: Minor suggestions
2017-05-26 20:12:56 +01:00
Travis Ralston
8ddf4ced64 Update translating.md: Minor suggestions
Primarily spelling, wording, and grammar. A little bit of formatting too.
2017-05-26 13:09:40 -06:00
RiotTranslate
cd9d3ea248 Merge branch 'develop' of git://github.com/vector-im/riot-web into develop 2017-05-26 18:52:19 +00:00
Matthew Hodgson
963c90c833 switch to develop deps... 2017-05-26 19:51:04 +01:00
Krombel
d626542baf Translated using Weblate (German)
Currently translated at 100.0% (120 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-26 18:47:45 +00:00
RiotTranslate
10d2caf5d6 Merge remote-tracking branch 'origin/develop' into develop 2017-05-26 18:43:09 +00:00
Krombel
2819799843 Translated using Weblate (German)
Currently translated at 97.5% (117 of 120 strings)

Translation: Riot Web/Riot Web
Translate-URL: https://translate.nordgedanken.de/projects/riot-web/riot-web/de/
2017-05-26 18:43:08 +00:00
Matthew Hodgson
09adfbd6d6 remove stale i18n instructions 2017-05-26 19:39:05 +01:00
Matthew Hodgson
1bcdf31afc Merge pull request #3993 from vector-im/t3chguy/tidy_electron_files
tidy electron files, they weren't pwetty
2017-05-26 18:52:41 +01:00
Matthew Hodgson
ff5adeff2c Merge branch 'develop' into t3chguy/tidy_electron_files 2017-05-26 18:50:48 +01:00
Matthew Hodgson
445a55c7ca Merge pull request #3992 from vector-im/t3chguy/electron_call_sleep
Prevent Power Save when in call (Electron)
2017-05-26 18:44:53 +01:00
David Baker
d313f4c7b6 Merge https://github.com/MTRNord/riot-web/pull/70/ 2017-05-26 18:44:08 +01:00
David Baker
5e0457c32d Merge pull request #4035 from vector-im/dbkr/translations
Translations!
2017-05-26 18:39:07 +01:00
Matthew Hodgson
9156a871f5 Merge pull request #3961 from Kieran-Gould/kieran-gould/12hourtimestamp
Kieran gould/12hourtimestamp
2017-05-26 18:23:11 +01:00
Matthew Hodgson
e26422ef10 fix a typo 2017-05-26 18:22:53 +01:00
David Baker
d3875ec794 Oops, include file extension in language list 2017-05-26 17:11:11 +01:00
David Baker
4fcaccbc7f Merge https://github.com/MTRNord/riot-web/pull/69 2017-05-26 16:56:49 +01:00
David Baker
6c3c4fc547 Language generation and file structure
* Move language files to strings/ subdir to be consistent with
   react-sdk
 * Only copy static list of languages (to avoid including
   languages that are only a few percent translated)
 * Make copy-res script work with watch mode
 * Other general cleanups like only write each language file once,
   rather than n times.
2017-05-26 16:48:21 +01:00
David Baker
e07f9a8bc9 Pass through i18n keys in karma tests 2017-05-26 15:29:58 +01:00
Richard van der Hoff
0db118f766 Merge pull request #4033 from vector-im/dbkr/dont_put_src_in_resolve_root
Don't include src in the test resolve root
2017-05-26 14:09:17 +01:00
David Baker
0ab9486829 Merge branch 'dbkr/dont_put_src_in_resolve_root' into dbkr/translations 2017-05-26 14:02:44 +01:00
David Baker
9c7731e141 Don't include src in the test resolve root
As https://github.com/matrix-org/matrix-react-sdk/pull/931
2017-05-26 14:02:03 +01:00
David Baker
ee2a49ad41 Punctuation in translation strings 2017-05-26 13:46:01 +01:00
David Baker
8ad189c79d Remove unused _t import 2017-05-26 13:45:46 +01:00
David Baker
92579cf463 Array literal 2017-05-26 13:36:58 +01:00
David Baker
d688eade43 Remove commented use strict
It's even less use in a comment
2017-05-26 13:34:18 +01:00
David Baker
82b2741ed9 Move english custom server text to en file
As it is in English and not German
2017-05-26 13:33:00 +01:00
David Baker
810fb42458 Fix indenting 2017-05-26 13:25:46 +01:00
David Baker
5356eab159 Correct docs
Change array.push guideline to not using _t at class-load time
which was probably the actual problem. Update guidelines to
include punctuation.
2017-05-26 13:16:36 +01:00
David Baker
bde501a9ce Languages on config file is no longer a thing 2017-05-26 13:10:57 +01:00
Michael Telatynski
e63baf62c4 quit -> exit as screen is not accessible in alt instance
when using makeSingleInstance
which leads to a weird error
Unhandled exception { Error: Cannot find module '../screen'

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-26 09:49:23 +01:00
Michael Telatynski
0fb6a305a3 uber basic multi-profile support for electron app
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-26 09:48:32 +01:00
David Baker
2982174028 No need for repeated OKs anymore 2017-05-25 18:21:40 +01:00
David Baker
c15a66d1d4 Fix up notification settings strings 2017-05-25 17:21:41 +01:00
David Baker
003238c1e7 Update for new API in react-sdk
We now get multiple languages from the browser as there may be
a whole preference list
2017-05-25 16:47:12 +01:00
David Baker
5ccab395d7 Merge pull request #4021 from vector-im/t3chguy/electron_context_menus
add moar context menus [Electron]
2017-05-25 13:49:23 +01:00
David Baker
dd1c9a4477 Merge pull request #4022 from vector-im/t3chguy/patch-2
Add `Chat` to Linux app categories
2017-05-25 13:35:50 +01:00
Michael Telatynski
9cd04509bf Add Chat to Linux app categories
most dists inc Arch have Chat and IRCClient,
though the latter isn't exactly correct so missing it
2017-05-25 13:22:01 +01:00
Michael Telatynski
727e267853 we don't really need a webContents like that, so pass if needed
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-25 12:47:36 +01:00
Michael Telatynski
c4c78c9b3e split webContents context handling into own file, as main was growing
add handlers for editable fields, with Cut Copy Paste Undo Redo etc
add Copy Image feature to all images, working on not only the download
buttons now

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-25 12:42:53 +01:00
David Baker
7636212bed Remove refs to counterpart
and remove extCounterpart which is unnecessary now we just use a
single counterpart instance
2017-05-25 12:08:47 +01:00
David Baker
b95da4a40c No longer need counterpart
We now use stock counterpart, but indirectly via react-sdk so no
need to depend on it directly.
2017-05-25 11:40:31 +01:00
David Baker
ee85eb961a Bulk change counterpart imports
to use react-sdk wrapper function, rather than using counterpart
directly.
2017-05-25 11:39:56 +01:00
Michael Telatynski
52a8039eb3 add more generic class for links/highlights within UserSettings
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-25 01:30:11 +01:00
Michael Telatynski
a98792b05e auto-launch support, ux =checkbox in UserSettings[Electron]
settings are sorta generic, probably reusable for proxy settings

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-24 15:52:08 +01:00
David Baker
aaf948017a Make language dropdown a more sensible width 2017-05-24 14:37:12 +01:00
David Baker
d4aa428321 Move translation status image to i18n section 2017-05-24 14:23:34 +01:00
David Baker
d5425b62a1 Don't inject languages into the config
If we're defaulting this it should really be by the component
itself or with the other defaukts in SdkConfig, but we've decided
to leave out support for reading languages from the config file as
it's only useful for a Riot admin to restrict the choice of
languages available to users which is of debateable use.
2017-05-24 11:27:06 +01:00
Michael Telatynski
c63e429c76 Merge branch 'develop' of github.com:vector-im/riot-web into t3chguy/electron_call_sleep 2017-05-24 10:56:36 +01:00
David Baker
ff1567ed2a Remove spurious import 2017-05-23 17:09:09 +01:00
David Baker
af6cc7bf9c I don't really see why this is necessary 2017-05-23 17:06:49 +01:00
David Baker
caca5cc00b Remove c+ped UserSettingsStore functions
as they don't seem to be necessary
2017-05-23 17:06:02 +01:00
David Baker
241d95293e Code style fixes
Use async/await consistently rather than flipping between that and
callbacks, s/var/let/, indenting
2017-05-23 16:44:54 +01:00
David Baker
a6b11968a4 s/tabs/spaces/ 2017-05-23 16:15:52 +01:00
David Baker
3f3f230a77 Remove accidentally comitted yarn stuff 2017-05-23 14:20:51 +01:00
David Baker
6b6fa59f3e Squash merge https://github.com/vector-im/riot-web/pull/3636 2017-05-23 14:12:53 +01:00
Michael Telatynski
8994c2bad1 missed a concat :)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 19:28:01 +01:00
Michael Telatynski
e0fb2fd074 /me forgets we don't have babel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 19:25:56 +01:00
Michael Telatynski
4bb054c955 electron stuff isn't actually using flow, so don't enable it
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 19:25:18 +01:00
Michael Telatynski
911c3bcf6e tidy electron files, they were starting to annoy me
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 19:21:52 +01:00
Michael Telatynski
4944bfdaa2 onAction support in Electron process, disable powersave when in call
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 18:32:39 +01:00
Michael Telatynski
f57d8e4cb9 make ESLint a touch happier
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 18:31:30 +01:00
Michael Telatynski
755c66b9f1 pass dispatcher through to electron, on a whitelist basis
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-22 18:30:45 +01:00
David Baker
7d59742a22 Merge pull request #3975 from vector-im/t3chguy/riot-desktopt-linux-cat
add menu category for linux build of app
2017-05-22 16:59:27 +01:00
Michael Telatynski
6e8516e537 fiiine! 2017-05-22 16:53:46 +01:00
David Baker
73ec3e1f4d Merge branch 'master' into develop 2017-05-22 11:44:31 +01:00
Michael Telatynski
90ab4a02f2 add category so it doesn't get dropped into Default/Lost+Found
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-20 13:11:31 +01:00
Kieran Gould
cae62c8383 MessageTimestamp now has 12 hour prop 2017-05-19 22:36:02 +01:00
Kieran Gould
1ebe819aa2 Revert _EventTile.scss padding. 2017-05-19 22:29:20 +01:00
Maxwell Kepler
9e37fa46b1 Add 12 hour support 2017-05-19 22:29:20 +01:00
David Baker
dc990f47be Fix app breakage with a 'version' file
Re-add accidenally removed variable initialiser
2017-05-19 17:02:48 +01:00
David Baker
a9b5282ba3 Merge pull request #3909 from vector-im/t3chguy/favicon_improvements
Electron Tray Improvements
2017-05-19 16:22:11 +01:00
David Baker
d7f1e01cfa Don't fail if reskindex symlink exists 2017-05-19 14:47:44 +01:00
Richard van der Hoff
0a920df05d Merge pull request #3966 from vector-im/rav/more_deflakification
More riot-web test deflakification
2017-05-19 13:51:51 +01:00
Richard van der Hoff
ea67fa9c16 More riot-web test deflakification
Two changes:

1. wait longer for /sync to arrive in the loading tests, via an
   `expectAndAwaitSync` method.

2. https://github.com/matrix-org/matrix-react-sdk/pull/773 made it possible for
   MatrixChat to not show its syncing spinner despite `loading` being
   false. Update `awaitSyncingSpinner` accordingly, so that it doesn't fail
   when it happens to check MatrixChat at just taht moment.
2017-05-19 13:33:50 +01:00
David Baker
50b46af943 Merge pull request #3945 from vector-im/dbkr/fetch_deps_script
Script to fetch corresponding branches of dependent projects
2017-05-19 13:14:07 +01:00
David Baker
68a39b2783 Update process to not set deps to #develop
Update README instructions and add checks to release script to
prevent us forgetting to bump the versions of dependencies
(because the check in the main release script will only catch
references to #develop left in, which will no longer be the
failure mode).
2017-05-19 11:59:27 +01:00
Luke Barnard
448ac8dce1 Merge pull request #3964 from vector-im/luke/fix-logo-svgs-style-type
Add type="text/css" to SVG logos
2017-05-19 11:38:27 +01:00
Luke Barnard
76bf869d87 Add type="text/css" to SVG logos
Without this, SVG renderers may not pick up the CSS in the SVGs at all, as is the case with librsvg.
2017-05-19 11:19:30 +01:00
Michael Telatynski
09f987559b rename action, now forwarding any event is possible, limited by where
button is shown, i.e easy to modify

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-19 01:30:36 +01:00
Michael Telatynski
eaeac1230f Merge branch 'develop' of github.com:vector-im/riot-web into forward_message 2017-05-19 01:15:31 +01:00
Michael Telatynski
7777be89ee only for finalised events
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-18 23:53:37 +01:00
Richard van der Hoff
b886215fdd Merge pull request #3958 from vector-im/rav/roomdirectory_unmounting
Fix some setState-after-unmount in roomdirectory
2017-05-18 19:06:18 +01:00
Richard van der Hoff
4d60d444d4 Merge pull request #3956 from vector-im/rav/deflakify
Attempt to deflakify joining test
2017-05-18 19:06:01 +01:00
Richard van der Hoff
86055bc476 Fix some setState-after-unmount in roomdirectory
Give the RoomDirectory and unmounted guard, and use it to avoid some setState
warnings. Also, cancel the filterTimeout (no point in leaving it around).

There are still plenty of other opportunities to setState after unmount, but
the filterTimeout was causing noise in the test.
2017-05-18 13:41:54 +01:00
Richard van der Hoff
f16086bbea Attempt to deflakify joining test
give the client a bit longer to get started.
2017-05-18 13:39:33 +01:00
Richard van der Hoff
f60773ae1f mock-request: improve logging
attempt to make the logging a bit more comprehensible
2017-05-18 13:37:23 +01:00
Richard van der Hoff
a39a7c8334 Update to more recent mock-request
Just copy-and-paste the updated version from js-sdk in here.
2017-05-18 12:18:57 +01:00
David Baker
a9a4b1c44e Get branch from various CI env vars
So we hopefully get the right branch for PRs from the same repo
(but not forks).

From @t3chguy's comment (tweaked a bit)
2017-05-18 11:05:19 +01:00
David Baker
c929cb1337 Do I mean bash? Probably 2017-05-17 18:21:58 +01:00
David Baker
b3b44dd99e Use fetch dep script for travis 2017-05-17 18:20:25 +01:00
David Baker
18afbc5bec Make dep install script work 2017-05-17 18:14:28 +01:00
David Baker
60d33f50a7 Create node_modules if it doesn't exist 2017-05-17 16:19:19 +01:00
David Baker
94ac4bf490 Use fetch dep script in jenkins script 2017-05-17 16:17:08 +01:00
David Baker
fac8906102 Add script to fetch correct dep branches
Fetch branches of js-sdk and react-sdk that match the current
branch name, if they exist. This will mostly be used in the
automated tests.
2017-05-17 16:11:34 +01:00
Michael Telatynski
9352e5d78e Lets make it abundantly clear that we want attention. FLASH FLASH FLASH
also improve favicon updating to not change if we're same as previous
not sure how intensive the nativeImage stuff is but cheap efficiency

For FLASH FLASH I moved the setBadgeCount stuff RPC -> IPC
should be more reliable now, its in electron-main
Win only:
if mainWindow is set and is not in focus make it FLASH
clear flash if notification gets cleared elsewhere
debounce focus handler so we don't set a million of them
if the app is backgrounded a while

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-17 10:39:43 +01:00
Michael Telatynski
826a571b60 apply same image to the window/taskbar too; as per request
LETS MAKE IT CLEAR WE ARE NEEDY AND WANT ATTENTION

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-17 10:05:50 +01:00
Michael Telatynski
39b6c7c65d ignore electron_app subdirs properly, missed these too :L
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-17 09:53:33 +01:00
Michael Telatynski
58ada2c27d move mxEvent.status check to js-sdk
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-16 14:14:06 +01:00
Michael Telatynski
db78534b45 remove no longer required parseIntWithDefault
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-16 14:10:00 +01:00
Michael Telatynski
d55f4f9e6a use new RoomState method from matrix-org/matrix-js-sdk/pull/435
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-16 14:08:00 +01:00
Michael Telatynski
aff1e14efc first go at show redact only if we can redact
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-16 13:15:14 +01:00
Michael Telatynski
aa7728cad3 tidy up tray.js - it made my eyes hurt
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-13 12:41:13 +01:00
Michael Telatynski
808240eef9 shouldn't need this try-catch
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-13 12:40:17 +01:00
Michael Telatynski
6aae97b812 Update tray tooltip based on document.title
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-13 12:39:55 +01:00
Michael Telatynski
8927afca03 re-add electron node modules to gitignore
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-13 12:37:27 +01:00
Michael Telatynski
bbda658b7f make Electron tray icon mimic the Favico.js one
DRY: moved Favicon stuff into the base platform

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-05-13 12:37:13 +01:00
Michael Telatynski
7676fd960e Merge branch 'develop' into forward_message 2017-04-30 12:35:52 +01:00
Michael Telatynski
0a1ebc2487 Don't show for anything that doesn't have a msgtype and body
otherwise the server will just reject it anyway

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-04-24 22:43:02 +01:00
turt2live
9124c1475a Change redact -> remove to improve clarity
Addresses #2814

Non-technical users may not understand what 'redact' means and can more easily understand what 'Remove' does. See discussion on vector-im/riot-web#2814 for more information.

Signed-off-by: Travis Ralston <travpc@gmail.com>
2017-04-24 12:48:32 -06:00
Michael Telatynski
2eb715002f Merge branch 'develop' of https://github.com/vector-im/riot-web into forward_message
Conflicts:
	.gitignore
2017-04-24 18:38:52 +01:00
Michael Telatynski
92b52a61e7 don't show forward option for things we cannot decrypt
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-04-24 18:33:25 +01:00
Michael Telatynski
77ce58b59d add .idea to .gitignore so I don't accidentally push my IDE config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-04-21 13:46:49 +01:00
Michael Telatynski
20abb2c2df Add Forward Message button to m.room.message events
Conform this file to eslint

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2017-04-21 13:46:23 +01:00
98 changed files with 3682 additions and 694 deletions

4
.gitignore vendored
View File

@@ -5,7 +5,8 @@
/key.pem
/lib
/node_modules
/electron/node_modules
/electron_app/node_modules
/electron_app/dist
/packages/
/webapp
/.npmrc
@@ -13,5 +14,6 @@
npm-debug.log
electron/dist
electron/pub
/.idea
/config.json
/src/component-index.js

View File

@@ -1,7 +1,22 @@
language: node_js
node_js:
- 6 # node v6, to match jenkins
# make sure we work with a range of node versions.
# As of the time of writing:
# - 4.x is still in LTS (until April 2018), but some of our deps (notably
# extract-zip) don't work with it
# - 5.x has been EOLed for nearly a year.
# - 6.x is the current 'LTS' version
# - 7.x is the current 'current' version (until October 2017)
#
# see: https://github.com/nodejs/LTS/
#
# anything before 6.3 ships with npm 3.9 or earlier, which had problems
# with symlinks in node_modules (see
# https://github.com/npm/npm/releases/tag/v3.10.0 'FIXES AND REFACTORING').
- 6.3
- 6
- 7
install:
- npm install
- (cd node_modules/matrix-js-sdk && npm install)
- (cd node_modules/matrix-react-sdk && npm install)
# clone the deps with depth 1: we know we will only ever need that one
# commit.
- scripts/fetch-develop.deps.sh --depth 1 && npm install

View File

@@ -1,3 +1,138 @@
Changes in [0.10.2](https://github.com/vector-im/riot-web/releases/tag/v0.10.2) (2017-06-06)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.10.1...v0.10.2)
* Hotfix for bugs where navigating straight to a URL like /#/login and
and /#/forgot_password
Changes in [0.10.1](https://github.com/vector-im/riot-web/releases/tag/v0.10.1) (2017-06-02)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.10.0...v0.10.1)
* Update to matrix-react-sdk 0.9.1 to fix i18n error which broke start chat in some circumstances
Changes in [0.10.0](https://github.com/vector-im/riot-web/releases/tag/v0.10.0) (2017-06-02)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.10.0-rc.2...v0.10.0)
* Update from Weblate.
[\#4152](https://github.com/vector-im/riot-web/pull/4152)
Changes in [0.10.0-rc.2](https://github.com/vector-im/riot-web/releases/tag/v0.10.0-rc.2) (2017-06-02)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.10.0-rc.1...v0.10.0-rc.2)
* Update from Weblate.
[\#4150](https://github.com/vector-im/riot-web/pull/4150)
* styling for webrtc settings
[\#4019](https://github.com/vector-im/riot-web/pull/4019)
* Update from Weblate.
[\#4140](https://github.com/vector-im/riot-web/pull/4140)
* add styles for compact layout
[\#4132](https://github.com/vector-im/riot-web/pull/4132)
* Various tweaks to fetch-develop-deps
[\#4147](https://github.com/vector-im/riot-web/pull/4147)
* Don't try to build with node 6.0
[\#4145](https://github.com/vector-im/riot-web/pull/4145)
* Support 12hr time on DateSeparator
[\#4143](https://github.com/vector-im/riot-web/pull/4143)
* Update from Weblate.
[\#4137](https://github.com/vector-im/riot-web/pull/4137)
* Update from Weblate.
[\#4105](https://github.com/vector-im/riot-web/pull/4105)
* Update from Weblate.
[\#4094](https://github.com/vector-im/riot-web/pull/4094)
* Update from Weblate.
[\#4091](https://github.com/vector-im/riot-web/pull/4091)
* Update from Weblate.
[\#4089](https://github.com/vector-im/riot-web/pull/4089)
* Update from Weblate.
[\#4083](https://github.com/vector-im/riot-web/pull/4083)
Changes in [0.10.0-rc.1](https://github.com/vector-im/riot-web/releases/tag/v0.10.0-rc.1) (2017-06-01)
======================================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.10...v0.10.0-rc.1)
* basic electron profile support
[\#4030](https://github.com/vector-im/riot-web/pull/4030)
* Finish translations for vector-im/riot-web
[\#4122](https://github.com/vector-im/riot-web/pull/4122)
* Translate src/vector
[\#4119](https://github.com/vector-im/riot-web/pull/4119)
* electron flashFrame was way too annoying
[\#4128](https://github.com/vector-im/riot-web/pull/4128)
* auto-launch support [Electron]
[\#4012](https://github.com/vector-im/riot-web/pull/4012)
* Show 12hr time on hover too
[\#4092](https://github.com/vector-im/riot-web/pull/4092)
* Translate src/notifications
[\#4087](https://github.com/vector-im/riot-web/pull/4087)
* Translate src/components/structures
[\#4084](https://github.com/vector-im/riot-web/pull/4084)
* Smaller font size on timestamp to better fit in the available space
[\#4085](https://github.com/vector-im/riot-web/pull/4085)
* Make travis run the build with several versions of node
[\#4079](https://github.com/vector-im/riot-web/pull/4079)
* Piwik Analytics
[\#4056](https://github.com/vector-im/riot-web/pull/4056)
* Update from Weblate.
[\#4077](https://github.com/vector-im/riot-web/pull/4077)
* managed to eat the eventStatus check, can't redact a local-echo etc
[\#4078](https://github.com/vector-im/riot-web/pull/4078)
* show redact in context menu only if has PL to/sent message
[\#3925](https://github.com/vector-im/riot-web/pull/3925)
* Update from Weblate.
[\#4064](https://github.com/vector-im/riot-web/pull/4064)
* Change redact -> remove to improve clarity
[\#3722](https://github.com/vector-im/riot-web/pull/3722)
* Update from Weblate.
[\#4058](https://github.com/vector-im/riot-web/pull/4058)
* Message Forwarding
[\#3688](https://github.com/vector-im/riot-web/pull/3688)
* Update from Weblate.
[\#4057](https://github.com/vector-im/riot-web/pull/4057)
* Fixed an input field's background color in dark theme
[\#4053](https://github.com/vector-im/riot-web/pull/4053)
* Update from Weblate.
[\#4051](https://github.com/vector-im/riot-web/pull/4051)
* Update from Weblate.
[\#4049](https://github.com/vector-im/riot-web/pull/4049)
* Update from Weblate.
[\#4048](https://github.com/vector-im/riot-web/pull/4048)
* Update from Weblate.
[\#4040](https://github.com/vector-im/riot-web/pull/4040)
* Update translating.md: Minor suggestions
[\#4041](https://github.com/vector-im/riot-web/pull/4041)
* tidy electron files, they weren't pwetty
[\#3993](https://github.com/vector-im/riot-web/pull/3993)
* Prevent Power Save when in call (Electron)
[\#3992](https://github.com/vector-im/riot-web/pull/3992)
* Translations!
[\#4035](https://github.com/vector-im/riot-web/pull/4035)
* Kieran gould/12hourtimestamp
[\#3961](https://github.com/vector-im/riot-web/pull/3961)
* Don't include src in the test resolve root
[\#4033](https://github.com/vector-im/riot-web/pull/4033)
* add moar context menus [Electron]
[\#4021](https://github.com/vector-im/riot-web/pull/4021)
* Add `Chat` to Linux app categories
[\#4022](https://github.com/vector-im/riot-web/pull/4022)
* add menu category for linux build of app
[\#3975](https://github.com/vector-im/riot-web/pull/3975)
* Electron Tray Improvements
[\#3909](https://github.com/vector-im/riot-web/pull/3909)
* More riot-web test deflakification
[\#3966](https://github.com/vector-im/riot-web/pull/3966)
* Script to fetch corresponding branches of dependent projects
[\#3945](https://github.com/vector-im/riot-web/pull/3945)
* Add type="text/css" to SVG logos
[\#3964](https://github.com/vector-im/riot-web/pull/3964)
* Fix some setState-after-unmount in roomdirectory
[\#3958](https://github.com/vector-im/riot-web/pull/3958)
* Attempt to deflakify joining test
[\#3956](https://github.com/vector-im/riot-web/pull/3956)
Changes in [0.9.10](https://github.com/vector-im/riot-web/releases/tag/v0.9.10) (2017-05-22)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v0.9.10-rc.1...v0.9.10)

View File

@@ -55,32 +55,41 @@ Building From Source
Riot is a modular webapp built with modern ES6 and requires a npm build system
to build.
1. Install or update `node.js` so that your `npm` is at least at version `2.0.0`
1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`
1. Switch to the riot-web directory: `cd riot-web`
1. Install the prerequisites: `npm install`
1. If you are using the `develop` branch of vector-web, you will probably need
to rebuild some of the dependencies, due to
https://github.com/npm/npm/issues/3055:
1. Install or update `node.js` so that your `node` is at least v6.3.0 (and `npm`
is at least v3.10.x).
1. Clone the repo: `git clone https://github.com/vector-im/riot-web.git`.
1. Switch to the riot-web directory: `cd riot-web`.
1. If you're using the `develop` branch, install the develop versions of the
dependencies, as the released ones will be too old:
```
(cd node_modules/matrix-js-sdk && npm install)
(cd node_modules/matrix-react-sdk && npm install)
scripts/fetch-develop-deps.sh
```
Whenever you git pull on riot-web you will also probably need to force an update
to these dependencies - the easiest way is probably:
to these dependencies - the simplest way is to re-run the script, but you can also
manually update and rebuild them:
```
rm -rf node_modules/matrjx-{js,react}-sdk && npm i
(cd node_modules/matrix-js-sdk && npm install)
(cd node_modules/matrix-react-sdk && npm install)
cd matrix-js-sdk
git pull
npm install # re-run to pull in any new dependencies
# Depending on your version of npm, npm run build may happen as part of
# the npm install above (https://docs.npmjs.com/misc/scripts#prepublish-and-prepare)
# If in doubt, run it anyway:
npm run build
cd ../matrix-react-sdk
git pull
npm install
npm run build
```
However, we recommend setting up a proper development environment (see "Setting
up a development environment" below) if you want to run your own copy of the
`develop` branch, as it makes it much easier to keep these dependencies
up-to-date. Or just use https://riot.im/develop - the continuous integration
release of the develop branch.
(Note that we don't reference the develop versions in git directly due to
https://github.com/npm/npm/issues/3055.)
1. Install the prerequisites: `npm install`.
1. Configure the app by copying `config.sample.json` to `config.json` and
modifying it (see below for details)
modifying it (see below for details).
1. `npm run dist` to build a tarball to deploy. Untaring this file will give
a version-specific directory containing all the files that need to go on your
web server.
@@ -273,6 +282,19 @@ If any of these steps error with, `file table overflow`, you are probably on a m
which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again.
You'll need to do this in each new terminal you open before building Riot.
How to add a new translation?
=============================
[<img src="https://translate.nordgedanken.de/widgets/riot-web/-/multi-auto.svg" alt="translationsstatus" width="340">](https://translate.nordgedanken.de/engage/riot-web/?utm_source=widget)
Head to the [translating doc](docs/translating.md)
Adding Strings to the translations (Developer Guide)
====================================================
Head to the [translating dev doc](docs/translating-dev.md)
Triaging issues
===============
@@ -292,7 +314,7 @@ bug or feature:
* feature
bug severity:
* cosmetic - feature works functionally but UI/UX is broken
* critical - whole app doesn't work
* major - entire feature doesn't work

View File

@@ -10,5 +10,9 @@
"servers": [
"matrix.org"
]
},
"piwik": {
"url": "https://piwik.riot.im/",
"siteId": 1
}
}

26
docs/translating-dev.md Normal file
View File

@@ -0,0 +1,26 @@
# How to translate riot-web (Dev Guide)
## Requirements
- A working [Development Setup](../../#setting-up-a-dev-environment)
- Be able to understand English
- Be able to understand the language you want to translate riot-web into
## Adding new strings
1. Check if the import ``import _t from 'counterpart-riot'`` is present. If not add it to the other import statements.
2. Add ``_t()`` to your string. (Don't forget curly braces when you assign an expression to JSX attributes in the render method)
3. Add the String to the ``en_EN.json`` file in ``src/i18n`` or if you are working in matrix-react-sdk you can find the json file in ``src/i18n/strings``
## Adding variables inside a string.
1. Extend your ``_t()`` call. Instead of ``_t(STRING)`` use ``_t(STRING, {})``
2. Decide how to name it. Please think about if the person who has to translate it can understand what it does.
3. Add it to the array in ``_t`` for example ``_t(STRING, {variable: this.variable})``
4. Add the variable inside the string. The syntax for variables is ``%(variable)s``. Please note the s at the end. The name of the variable has to match the previous used name.
## Things to know/Style Guides
- Do not use it inside ``getDefaultProps`` at the point where ``getDefaultProps`` is initialized the translations aren't loaded yet and it causes missing translations.
- If using translated strings as constants, translated strings can't be in constants loaded at class-load time since the translations won't be loaded.
- If a string is presented in the UI with punctuation like a full stop, include this in the translation strings, since punctuation varies between languages too.

64
docs/translating.md Normal file
View File

@@ -0,0 +1,64 @@
# How to translate riot-web
## Requirements
- Web Browser
- Be able to understand English
- Be able to understand the language you want to translate riot-web into
## Step 0: Join #riotweb-translations:matrix.org
1. Come and join https://riot.im/develop/#/room/#riotweb-translations:matrix.org
2. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :)
## Step 1: Preparing your Weblate Profile
1. Head to https://translate.nordgedanken.de and register either via Github or email
2. After registering check if you got an email to verify your account and click the link (if there is none head to step 1.4)
3. Log into weblate
4. Head to https://translate.nordgedanken.de/accounts/profile/ and select the languages you know and maybe another language you know too.
6. Head to https://translate.nordgedanken.de/accounts/profile/#subscriptions and select Riot Web as Project
## How to check if your language already is being translated
Go to https://translate.nordgedanken.de/projects/riot-web/ and visit the 2 sub-projects.
If your language is listed go to Step 2a and if not go to Step 2b
## Step 2a: Helping on existing languages.
1. Head to one of the projects listed https://translate.nordgedanken.de/projects/riot-web/
2. Click on the ``translate`` button on the right side of your language
3. Fill in the translations in the writeable field. You will see the original English string and the string of your second language above.
Head to the explanations under Steb 2b
## Step 2b: Adding a new language
1. Go to one of the projects listed https://translate.nordgedanken.de/projects/riot-web/
2. Click the ``Start new language`` button at the bottom
3. Select a language
4. Start translating like in 2a.3
5. Repeat these steps for the other projects which are listed at the link of step 2b.1
### What means the green button under the text field?
The green button let you save our translations directly. Please only use it if you are 100% sure about that translation. If you do not know a translation please DO NOT click that button. Use the arrows above the translations field and click to the right.
### What means the yellow button under the text field?
The yellow button has to be used if you are unsure about the translation but you have a rough idea. It adds a new suggestion to the string which can than be reviewed by others.
### What are "%(something)s"?
These things are variables that are expanded when displayed by Riot. They can be room names, usernames or similar. If you find one, you can move to the right place for your language, but not delete it as the variable will be missing if you do.
A special case is `%(urlStart)s` and `%(urlEnd)s` which are used to mark the beginning of a hyperlink (i.e. `<a href="/somewhere">` and `</a>`. You must keep these markers surrounding the equivalent string in your language that needs to be hyperlinked.
### "I want to come back to this string. How?"
You can use inside the translation field "Review needed" checkbox. It will be shown as Strings that need to be reviewed.
### Further reading
The official Weblate doc provides some more in-deepth explanation on how to do translations and talks about do and don'ts. You can find it at: https://docs.weblate.org/en/latest/user/translating.html

View File

@@ -2,10 +2,12 @@
"name": "riot-web",
"productName": "Riot",
"main": "src/electron-main.js",
"version": "0.9.10",
"version": "0.10.2",
"description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.",
"dependencies": {
"electron-window-state": "^4.1.0"
"electron-window-state": "^4.1.0",
"auto-launch": "^5.0.1",
"minimist": "^1.2.0"
}
}

View File

@@ -12,5 +12,9 @@
"servers": [
"matrix.org"
]
},
"piwik": {
"url": "https://piwik.riot.im/",
"siteId": 1
}
}

View File

@@ -1,5 +1,3 @@
// @flow
/*
Copyright 2016 Aviral Dasgupta
Copyright 2016 OpenMarket Ltd
@@ -20,18 +18,23 @@ limitations under the License.
// Squirrel on windows starts the app with various flags
// as hooks to tell us when we've been installed/uninstalled
// etc.
const check_squirrel_hooks = require('./squirrelhooks');
if (check_squirrel_hooks()) return;
const checkSquirrelHooks = require('./squirrelhooks');
if (checkSquirrelHooks()) return;
const argv = require('minimist')(process.argv);
const electron = require('electron');
const url = require('url');
const AutoLaunch = require('auto-launch');
const tray = require('./tray');
const VectorMenu = require('./vectormenu');
const vectorMenu = require('./vectormenu');
const webContentsHandler = require('./webcontents-handler');
const windowStateKeeper = require('electron-window-state');
if (argv.profile) {
electron.app.setPath('userData', `${electron.app.getPath('userData')}-${argv.profile}`);
}
let vectorConfig = {};
try {
vectorConfig = require('../../webapp/config.json');
@@ -42,60 +45,12 @@ try {
// Continue with the defaults (ie. an empty config)
}
const PERMITTED_URL_SCHEMES = [
'http:',
'https:',
'mailto:',
];
const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
let mainWindow = null;
let appQuitting = false;
function safeOpenURL(target) {
// openExternal passes the target to open/start/xdg-open,
// so put fairly stringent limits on what can be opened
// (for instance, open /bin/sh does indeed open a terminal
// with a shell, albeit with no arguments)
const parsed_url = url.parse(target);
if (PERMITTED_URL_SCHEMES.indexOf(parsed_url.protocol) > -1) {
// explicitly use the URL re-assembled by the url library,
// so we know the url parser has understood all the parts
// of the input string
const new_target = url.format(parsed_url);
electron.shell.openExternal(new_target);
}
}
function onWindowOrNavigate(ev, target) {
// always prevent the default: if something goes wrong,
// we don't want to end up opening it in the electron
// app, as we could end up opening any sort of random
// url in a window that has node scripting access.
ev.preventDefault();
safeOpenURL(target);
}
function onLinkContextMenu(ev, params) {
const popup_menu = new electron.Menu();
popup_menu.append(new electron.MenuItem({
label: params.linkURL,
click() {
safeOpenURL(params.linkURL);
},
}));
popup_menu.append(new electron.MenuItem({
label: 'Copy Link Address',
click() {
electron.clipboard.writeText(params.linkURL);
},
}));
popup_menu.popup();
ev.preventDefault();
}
function installUpdate() {
// for some reason, quitAndInstall does not fire the
// before-quit event, so we need to set the flag here.
@@ -107,13 +62,13 @@ function pollForUpdates() {
try {
electron.autoUpdater.checkForUpdates();
} catch (e) {
console.log("Couldn't check for update", e);
console.log('Couldn\'t check for update', e);
}
}
function startAutoUpdate(update_base_url) {
if (update_base_url.slice(-1) !== '/') {
update_base_url = update_base_url + '/';
function startAutoUpdate(updateBaseUrl) {
if (updateBaseUrl.slice(-1) !== '/') {
updateBaseUrl = updateBaseUrl + '/';
}
try {
// For reasons best known to Squirrel, the way it checks for updates
@@ -121,7 +76,7 @@ function startAutoUpdate(update_base_url) {
// hits a URL that either gives it a 200 with some json or
// 204 No Content. On windows it takes a base path and looks for
// files under that path.
if (process.platform == 'darwin') {
if (process.platform === 'darwin') {
// include the current version in the URL we hit. Electron doesn't add
// it anywhere (apart from the User-Agent) so it's up to us. We could
// (and previously did) just use the User-Agent, but this doesn't
@@ -129,16 +84,15 @@ function startAutoUpdate(update_base_url) {
// and also acts as a convenient cache-buster to ensure that when the
// app updates it always gets a fresh value to avoid update-looping.
electron.autoUpdater.setFeedURL(
update_base_url +
'macos/?localVersion=' + encodeURIComponent(electron.app.getVersion())
);
} else if (process.platform == 'win32') {
electron.autoUpdater.setFeedURL(update_base_url + 'win32/' + process.arch + '/');
`${updateBaseUrl}macos/?localVersion=${encodeURIComponent(electron.app.getVersion())}`);
} else if (process.platform === 'win32') {
electron.autoUpdater.setFeedURL(`${updateBaseUrl}win32/${process.arch}/`);
} else {
// Squirrel / electron only supports auto-update on these two platforms.
// I'm not even going to try to guess which feed style they'd use if they
// implemented it on Linux, or if it would be different again.
console.log("Auto update not supported on this platform");
console.log('Auto update not supported on this platform');
}
// We check for updates ourselves rather than using 'updater' because we need to
// do it in the main process (and we don't really need to check every 10 minutes:
@@ -151,7 +105,7 @@ function startAutoUpdate(update_base_url) {
setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
} catch (err) {
// will fail if running in debug mode
console.log("Couldn't enable update checking", err);
console.log('Couldn\'t enable update checking', err);
}
}
@@ -161,12 +115,49 @@ function startAutoUpdate(update_base_url) {
// no other way to catch this error).
// Assuming we generally run from the console when developing,
// this is far preferable.
process.on('uncaughtException', function (error) {
console.log("Unhandled exception", error);
process.on('uncaughtException', function(error) {
console.log('Unhandled exception', error);
});
electron.ipcMain.on('install_update', installUpdate);
let focusHandlerAttached = false;
electron.ipcMain.on('setBadgeCount', function(ev, count) {
electron.app.setBadgeCount(count);
if (count === 0) {
mainWindow.flashFrame(false);
}
});
electron.ipcMain.on('loudNotification', function() {
if (process.platform === 'win32' && mainWindow && !mainWindow.isFocused() && !focusHandlerAttached) {
mainWindow.flashFrame(true);
mainWindow.once('focus', () => {
mainWindow.flashFrame(false);
focusHandlerAttached = false;
});
focusHandlerAttached = true;
}
});
let powerSaveBlockerId;
electron.ipcMain.on('app_onAction', function(ev, payload) {
switch (payload.action) {
case 'call_state':
if (powerSaveBlockerId && powerSaveBlockerId.isStarted(powerSaveBlockerId)) {
if (payload.state === 'ended') {
electron.powerSaveBlocker.stop(powerSaveBlockerId);
}
} else {
if (payload.state === 'connected') {
powerSaveBlockerId = electron.powerSaveBlocker.start('prevent-display-sleep');
}
}
break;
}
});
electron.app.commandLine.appendSwitch('--enable-usermedia-screen-capturing');
const shouldQuit = electron.app.makeSingleInstance((commandLine, workingDirectory) => {
@@ -179,30 +170,69 @@ const shouldQuit = electron.app.makeSingleInstance((commandLine, workingDirector
});
if (shouldQuit) {
console.log("Other instance detected: exiting");
electron.app.quit()
console.log('Other instance detected: exiting');
electron.app.exit();
}
const launcher = new AutoLaunch({
name: vectorConfig.brand || 'Riot',
isHidden: true,
mac: {
useLaunchAgent: true,
},
});
const settings = {
'auto-launch': {
get: launcher.isEnabled,
set: function(bool) {
if (bool) {
return launcher.enable();
} else {
return launcher.disable();
}
},
},
};
electron.ipcMain.on('settings_get', async function(ev) {
const data = {};
try {
await Promise.all(Object.keys(settings).map(async function (setting) {
data[setting] = await settings[setting].get();
}));
ev.sender.send('settings', data);
} catch(e) { console.error(e); }
});
electron.ipcMain.on('settings_set', function(ev, key, value) {
console.log(key, value);
if (settings[key] && settings[key].set) {
settings[key].set(value);
}
});
electron.app.on('ready', () => {
if (vectorConfig.update_base_url) {
console.log("Starting auto update with base URL: " + vectorConfig.update_base_url);
console.log(`Starting auto update with base URL: ${vectorConfig.update_base_url}`);
startAutoUpdate(vectorConfig.update_base_url);
} else {
console.log("No update_base_url is defined: auto update is disabled");
console.log('No update_base_url is defined: auto update is disabled');
}
const icon_path = `${__dirname}/../img/riot.` + (
process.platform == 'win32' ? 'ico' : 'png'
);
const iconPath = `${__dirname}/../img/riot.${process.platform === 'win32' ? 'ico' : 'png'}`;
// Load the previous window state with fallback to defaults
let mainWindowState = windowStateKeeper({
const mainWindowState = windowStateKeeper({
defaultWidth: 1024,
defaultHeight: 768,
});
mainWindow = new electron.BrowserWindow({
icon: icon_path,
icon: iconPath,
show: false,
autoHideMenuBar: true,
@@ -212,15 +242,19 @@ electron.app.on('ready', () => {
height: mainWindowState.height,
});
mainWindow.loadURL(`file://${__dirname}/../../webapp/index.html`);
electron.Menu.setApplicationMenu(VectorMenu);
electron.Menu.setApplicationMenu(vectorMenu);
// explicitly hide because setApplicationMenu on Linux otherwise shows...
// https://github.com/electron/electron/issues/9621
mainWindow.hide();
// Create trayIcon icon
tray.create(mainWindow, {
icon_path: icon_path,
brand: vectorConfig.brand || 'Riot'
icon_path: iconPath,
brand: vectorConfig.brand || 'Riot',
});
if (!process.argv.includes('--hidden')) {
if (!argv.hidden) {
mainWindow.once('ready-to-show', () => {
mainWindow.show();
});
@@ -230,7 +264,7 @@ electron.app.on('ready', () => {
mainWindow = null;
});
mainWindow.on('close', (e) => {
if (!appQuitting && (tray.hasTray() || process.platform == 'darwin')) {
if (!appQuitting && (tray.hasTray() || process.platform === 'darwin')) {
// On Mac, closing the window just hides it
// (this is generally how single-window Mac apps
// behave, eg. Mail.app)
@@ -240,15 +274,7 @@ electron.app.on('ready', () => {
}
});
mainWindow.webContents.on('new-window', onWindowOrNavigate);
mainWindow.webContents.on('will-navigate', onWindowOrNavigate);
mainWindow.webContents.on('context-menu', function(ev, params) {
if (params.linkURL) {
onLinkContextMenu(ev, params);
}
});
webContentsHandler(mainWindow.webContents);
mainWindowState.manage(mainWindow);
});

View File

@@ -16,30 +16,30 @@ limitations under the License.
const path = require('path');
const spawn = require('child_process').spawn;
const app = require('electron').app;
const {app} = require('electron');
function run_update_exe(args, done) {
function runUpdateExe(args, done) {
// Invokes Squirrel's Update.exe which will do things for us like create shortcuts
// Note that there's an Update.exe in the app-x.x.x directory and one in the parent
// directory: we need to run the one in the parent directory, because it discovers
// information about the app by inspecting the directory it's run from.
const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe');
console.log('Spawning `%s` with args `%s`', updateExe, args);
console.log(`Spawning '${updateExe}' with args '${args}'`);
spawn(updateExe, args, {
detached: true
detached: true,
}).on('close', done);
};
}
function check_squirrel_hooks() {
if (process.platform != 'win32') return false;
function checkSquirrelHooks() {
if (process.platform !== 'win32') return false;
const cmd = process.argv[1];
const target = path.basename(process.execPath);
if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') {
run_update_exe(['--createShortcut=' + target + ''], app.quit);
runUpdateExe(['--createShortcut=' + target + ''], app.quit);
return true;
} else if (cmd === '--squirrel-uninstall') {
run_update_exe(['--removeShortcut=' + target + ''], app.quit);
runUpdateExe(['--removeShortcut=' + target + ''], app.quit);
return true;
} else if (cmd === '--squirrel-obsolete') {
app.quit();
@@ -48,4 +48,4 @@ function check_squirrel_hooks() {
return false;
}
module.exports = check_squirrel_hooks;
module.exports = checkSquirrelHooks;

View File

@@ -15,26 +15,19 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const path = require('path');
const electron = require('electron');
const app = electron.app;
const Tray = electron.Tray;
const MenuItem = electron.MenuItem;
const {app, Tray, Menu, nativeImage} = require('electron');
let trayIcon = null;
exports.hasTray = function hasTray() {
return (trayIcon !== null);
}
};
exports.create = function (win, config) {
exports.create = function(win, config) {
// no trays on darwin
if (process.platform === 'darwin' || trayIcon) {
return;
}
if (process.platform === 'darwin' || trayIcon) return;
const toggleWin = function () {
const toggleWin = function() {
if (win.isVisible() && !win.isMinimized()) {
win.hide();
} else {
@@ -44,24 +37,46 @@ exports.create = function (win, config) {
}
};
const contextMenu = electron.Menu.buildFromTemplate([
const contextMenu = Menu.buildFromTemplate([
{
label: 'Show/Hide ' + config.brand,
click: toggleWin
},
{
type: 'separator'
label: `Show/Hide ${config.brand}`,
click: toggleWin,
},
{ type: 'separator' },
{
label: 'Quit',
click: function () {
click: function() {
app.quit();
}
}
},
},
]);
trayIcon = new Tray(config.icon_path);
trayIcon.setToolTip(config.brand);
trayIcon.setContextMenu(contextMenu);
trayIcon.on('click', toggleWin);
let lastFavicon = null;
win.webContents.on('page-favicon-updated', function(ev, favicons) {
let newFavicon = config.icon_path;
if (favicons && favicons.length > 0 && favicons[0].startsWith('data:')) {
newFavicon = favicons[0];
}
// No need to change, shortcut
if (newFavicon === lastFavicon) return;
lastFavicon = newFavicon;
// if its not default we have to construct into nativeImage
if (newFavicon !== config.icon_path) {
newFavicon = nativeImage.createFromDataURL(favicons[0]);
}
trayIcon.setImage(newFavicon);
win.setIcon(newFavicon);
});
win.webContents.on('page-title-updated', function(ev, title) {
trayIcon.setToolTip(title);
});
};

View File

@@ -14,170 +14,112 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
const electron = require('electron');
const {app, shell, Menu} = require('electron');
// Menu template from http://electron.atom.io/docs/api/menu/, edited
const template = [
{
label: 'Edit',
submenu: [
{
role: 'undo'
},
{
role: 'redo'
},
{
type: 'separator'
},
{
role: 'cut'
},
{
role: 'copy'
},
{
role: 'paste'
},
{
role: 'pasteandmatchstyle'
},
{
role: 'delete'
},
{
role: 'selectall'
}
]
{ role: 'undo' },
{ role: 'redo' },
{ type: 'separator' },
{ role: 'cut' },
{ role: 'copy' },
{ role: 'paste' },
{ role: 'pasteandmatchstyle' },
{ role: 'delete' },
{ role: 'selectall' },
],
},
{
label: 'View',
submenu: [
{
type: 'separator'
},
{
role: 'resetzoom'
},
{
role: 'zoomin'
},
{
role: 'zoomout'
},
{
type: 'separator'
},
{
role: 'togglefullscreen'
},
{
role: 'toggledevtools'
}
]
{ type: 'separator' },
{ role: 'resetzoom' },
{ role: 'zoomin' },
{ role: 'zoomout' },
{ type: 'separator' },
{ role: 'togglefullscreen' },
{ role: 'toggledevtools' },
],
},
{
role: 'window',
submenu: [
{
role: 'minimize'
},
{
role: 'close'
}
]
{ role: 'minimize' },
{ role: 'close' },
],
},
{
role: 'help',
submenu: [
{
label: 'riot.im',
click () { electron.shell.openExternal('https://riot.im/') }
}
]
}
click() { shell.openExternal('https://riot.im/'); },
},
],
},
];
// macOS has specific menu conventions...
if (process.platform === 'darwin') {
// first macOS menu is the name of the app
const name = electron.app.getName()
const name = app.getName();
template.unshift({
label: name,
submenu: [
{
role: 'about'
},
{
type: 'separator'
},
{ role: 'about' },
{ type: 'separator' },
{
role: 'services',
submenu: []
submenu: [],
},
{
type: 'separator'
},
{
role: 'hide'
},
{
role: 'hideothers'
},
{
role: 'unhide'
},
{
type: 'separator'
},
{
role: 'quit'
}
]
})
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideothers' },
{ role: 'unhide' },
{ type: 'separator' },
{ role: 'quit' },
],
});
// Edit menu.
// This has a 'speech' section on macOS
template[1].submenu.push(
{
type: 'separator'
},
{ type: 'separator' },
{
label: 'Speech',
submenu: [
{
role: 'startspeaking'
},
{
role: 'stopspeaking'
}
]
}
)
{ role: 'startspeaking' },
{ role: 'stopspeaking' },
],
});
// Window menu.
// This also has specific functionality on macOS
template[3].submenu = [
{
label: 'Close',
accelerator: 'CmdOrCtrl+W',
role: 'close'
role: 'close',
},
{
label: 'Minimize',
accelerator: 'CmdOrCtrl+M',
role: 'minimize'
role: 'minimize',
},
{
label: 'Zoom',
role: 'zoom'
role: 'zoom',
},
{
type: 'separator'
type: 'separator',
},
{
label: 'Bring All to Front',
role: 'front'
}
]
role: 'front',
},
];
} else {
template.unshift({
label: 'File',
@@ -186,12 +128,10 @@ if (process.platform === 'darwin') {
/*{
role: 'about'
},*/
{
role: 'quit'
}
]
{ role: 'quit' },
],
});
}
module.exports = electron.Menu.buildFromTemplate(template)
module.exports = Menu.buildFromTemplate(template);

View File

@@ -0,0 +1,122 @@
const {clipboard, nativeImage, Menu, MenuItem, shell} = require('electron');
const url = require('url');
const PERMITTED_URL_SCHEMES = [
'http:',
'https:',
'mailto:',
];
function safeOpenURL(target) {
// openExternal passes the target to open/start/xdg-open,
// so put fairly stringent limits on what can be opened
// (for instance, open /bin/sh does indeed open a terminal
// with a shell, albeit with no arguments)
const parsedUrl = url.parse(target);
if (PERMITTED_URL_SCHEMES.indexOf(parsedUrl.protocol) > -1) {
// explicitly use the URL re-assembled by the url library,
// so we know the url parser has understood all the parts
// of the input string
const newTarget = url.format(parsedUrl);
shell.openExternal(newTarget);
}
}
function onWindowOrNavigate(ev, target) {
// always prevent the default: if something goes wrong,
// we don't want to end up opening it in the electron
// app, as we could end up opening any sort of random
// url in a window that has node scripting access.
ev.preventDefault();
safeOpenURL(target);
}
function onLinkContextMenu(ev, params) {
const url = params.linkURL || params.srcURL;
const popupMenu = new Menu();
popupMenu.append(new MenuItem({
label: url,
click() {
safeOpenURL(url);
},
}));
if (params.mediaType && params.mediaType === 'image' && !url.startsWith('file://')) {
popupMenu.append(new MenuItem({
label: 'Copy Image',
click() {
if (url.startsWith('data:')) {
clipboard.writeImage(nativeImage.createFromDataURL(url));
} else {
ev.sender.copyImageAt(params.x, params.y);
}
},
}));
}
popupMenu.append(new MenuItem({
label: 'Copy Link Address',
click() {
clipboard.writeText(url);
},
}));
popupMenu.popup();
ev.preventDefault();
}
function _CutCopyPasteSelectContextMenus(params) {
return [{
role: 'cut',
enabled: params.editFlags.canCut,
}, {
role: 'copy',
enabled: params.editFlags.canCopy,
}, {
role: 'paste',
enabled: params.editFlags.canPaste,
}, {
role: 'pasteandmatchstyle',
enabled: params.editFlags.canPaste,
}, {
role: 'selectall',
enabled: params.editFlags.canSelectAll,
}];
}
function onSelectedContextMenu(ev, params) {
const items = _CutCopyPasteSelectContextMenus(params);
const popupMenu = Menu.buildFromTemplate(items);
popupMenu.popup();
ev.preventDefault();
}
function onEditableContextMenu(ev, params) {
const items = [
{ role: 'undo' },
{ role: 'redo', enabled: params.editFlags.canRedo },
{ type: 'separator' },
].concat(_CutCopyPasteSelectContextMenus(params));
const popupMenu = Menu.buildFromTemplate(items);
popupMenu.popup();
ev.preventDefault();
}
module.exports = (webContents) => {
webContents.on('new-window', onWindowOrNavigate);
webContents.on('will-navigate', onWindowOrNavigate);
webContents.on('context-menu', function(ev, params) {
if (params.linkURL || params.srcURL) {
onLinkContextMenu(ev, params);
} else if (params.selectionText) {
onSelectedContextMenu(ev, params);
} else if (params.isEditable) {
onEditableContextMenu(ev, params);
}
});
};

View File

@@ -47,7 +47,6 @@ webpack_config.module.noParse.push(/sinon\/pkg\/sinon\.js$/);
webpack_config.resolve.alias['sinon'] = 'sinon/pkg/sinon.js';
webpack_config.resolve.root = [
path.resolve('./src'),
path.resolve('./test'),
];

View File

@@ -2,7 +2,7 @@
"name": "riot-web",
"productName": "Riot",
"main": "electron_app/src/electron-main.js",
"version": "0.9.10",
"version": "0.10.2",
"description": "A feature-rich client for Matrix.org",
"author": "Vector Creations Ltd.",
"repository": {
@@ -33,7 +33,7 @@
"build:compile": "npm run reskindex && babel --source-maps -d lib src",
"build:bundle": "cross-env NODE_ENV=production webpack -p --progress",
"build:bundle:dev": "webpack --optimize-occurence-order --progress",
"build:electron": "npm run clean && npm run build && build -wml --ia32 --x64",
"build:electron": "npm run clean && npm run build && npm run install:electron && build -wml --ia32 --x64",
"build": "npm run reskindex && npm run build:res && npm run build:bundle",
"build:dev": "npm run reskindex && npm run build:res && npm run build:bundle:dev",
"dist": "scripts/package.sh",
@@ -65,8 +65,8 @@
"gfm.css": "^1.1.1",
"highlight.js": "^9.0.0",
"linkifyjs": "^2.1.3",
"matrix-js-sdk": "0.7.8",
"matrix-react-sdk": "0.8.9",
"matrix-js-sdk": "0.7.10",
"matrix-react-sdk": "0.9.2",
"modernizr": "^3.1.0",
"pako": "^1.0.5",
"q": "^1.4.1",
@@ -104,6 +104,7 @@
"emojione": "^2.2.7",
"eslint": "^3.14.0",
"eslint-config-google": "^0.7.1",
"eslint-plugin-babel": "^4.1.1",
"eslint-plugin-flowtype": "^2.30.0",
"eslint-plugin-react": "^6.9.0",
"expect": "^1.16.0",
@@ -158,6 +159,7 @@
],
"linux": {
"target": "deb",
"category": "Network;InstantMessaging;Chat",
"maintainer": "support@riot.im",
"desktop": {
"StartupWMClass": "riot-web"

View File

@@ -9,6 +9,22 @@ set -e
cd `dirname $0`
for i in matrix-js-sdk matrix-react-sdk
do
depver=`cat package.json | jq -r .dependencies.\"$i\"`
latestver=`npm show $i version`
if [ "$depver" != "$latestver" ]
then
echo "The latest version of $i is $latestver but package.json depends on $depver"
echo -n "Type 'Yes' to continue anyway: "
read resp
if [ "$resp" != "Yes" ]
then
echo "OK, never mind."
exit 1
fi
fi
done
# bump Electron's package.json first
release="${1#v}"

View File

@@ -3,6 +3,25 @@
// copies the resources into the webapp directory.
//
// Languages are listed manually so we can choose when to include
// a translation in the app (because having a translation with only
// 3 strings translated is just frustrating)
// This could readily be automated, but it's nice to explicitly
// control when we languages are available.
const INCLUDE_LANGS = [
{'value': 'en_EN', 'label': 'English'},
{'value': 'da', 'label': 'Dansk'},
{'value': 'nl', 'label': 'Nederlands'},
{'value': 'de_DE', 'label': 'Deutsch'},
{'value': 'fr', 'label': 'Français'},
{'value': 'pt', 'label': 'Português'},
{'value': 'pt_BR', 'label': 'Português do Brasil'},
{'value': 'ru', 'label': 'Русский'},
{'value': 'sv', 'label': 'Svenska'},
{'value': 'es', 'label': 'Español'},
{'value': 'zh_Hans', 'label': '中文'}
];
// cpx includes globbed parts of the filename in the destination, but excludes
// common parents. Hence, "res/{a,b}/**": the output will be "dest/a/..." and
// "dest/b/...".
@@ -13,12 +32,20 @@ const COPY_LIST = [
["src/skins/vector/{fonts,img}/**", "webapp"],
["node_modules/emojione/assets/svg/*", "webapp/emojione/svg/"],
["node_modules/emojione/assets/png/*", "webapp/emojione/png/"],
["./config.json", "webapp", {directwatch: 1}],
["./config.json", "webapp", { directwatch: 1 }],
];
INCLUDE_LANGS.forEach(function(l) {
COPY_LIST.push([
l.value, "webapp/i18n/", { lang: 1 },
]);
});
const parseArgs = require('minimist');
const Cpx = require('cpx');
const chokidar = require('chokidar');
const fs = require('fs');
const rimraf = require('rimraf');
const argv = parseArgs(
process.argv.slice(2), {}
@@ -34,6 +61,15 @@ function errCheck(err) {
}
}
// Check if webapp exists
if (!fs.existsSync('webapp')) {
fs.mkdirSync('webapp');
}
// Check if i18n exists
if (!fs.existsSync('webapp/i18n/')) {
fs.mkdirSync('webapp/i18n/');
}
function next(i, err) {
errCheck(err);
@@ -45,10 +81,13 @@ function next(i, err) {
const source = ent[0];
const dest = ent[1];
const opts = ent[2] || {};
let cpx = undefined;
const cpx = new Cpx.Cpx(source, dest);
if (!opts.lang) {
cpx = new Cpx.Cpx(source, dest);
}
if (verbose) {
if (verbose && cpx) {
cpx.on("copy", (event) => {
console.log(`Copied: ${event.srcPath} --> ${event.dstPath}`);
});
@@ -57,7 +96,7 @@ function next(i, err) {
});
}
const cb = (err) => {next(i+1, err)};
const cb = (err) => { next(i + 1, err) };
if (watch) {
if (opts.directwatch) {
@@ -65,20 +104,74 @@ function next(i, err) {
// which in the case of config.json is '.', which inevitably takes
// ages to crawl. So we create our own watcher on the files
// instead.
const copy = () => {cpx.copy(errCheck)};
const copy = () => { cpx.copy(errCheck) };
chokidar.watch(source)
.on('add', copy)
.on('change', copy)
.on('ready', cb)
.on('error', errCheck);
} else if (opts.lang) {
const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + source + '.json';
const riotWebFile = 'src/i18n/strings/' + source + '.json';
const translations = {};
const makeLang = () => { genLangFile(source, dest) };
[reactSdkFile, riotWebFile].forEach(function(f) {
chokidar.watch(f)
.on('add', makeLang)
.on('change', makeLang)
//.on('ready', cb) We'd have to do this when both files are ready
.on('error', errCheck);
});
next(i + 1, err);
} else {
cpx.on('watch-ready', cb);
cpx.on("watch-error", cb);
cpx.watch();
}
} else if (opts.lang) {
genLangFile(source, dest);
next(i + 1, err);
} else {
cpx.copy(cb);
}
}
function genLangFile(lang, dest) {
const reactSdkFile = 'node_modules/matrix-react-sdk/src/i18n/strings/' + lang + '.json';
const riotWebFile = 'src/i18n/strings/' + lang + '.json';
const translations = {};
[reactSdkFile, riotWebFile].forEach(function(f) {
if (fs.existsSync(f)) {
Object.assign(
translations,
JSON.parse(fs.readFileSync(f).toString())
);
}
});
fs.writeFileSync(dest + lang + '.json', JSON.stringify(translations, null, 4));
if (verbose) {
console.log("Generated language file: " + lang);
}
}
function genLangList() {
const languages = {};
INCLUDE_LANGS.forEach(function(lang) {
const normalizedLanguage = lang.value.toLowerCase().replace("_", "-");
const languageParts = normalizedLanguage.split('-');
if (languageParts.length == 2 && languageParts[0] == languageParts[1]) {
languages[languageParts[0]] = {'fileName': lang.value + '.json', 'label': lang.label};
} else {
languages[normalizedLanguage] = {'fileName': lang.value + '.json', 'label': lang.label};
}
});
fs.writeFile('webapp/i18n/languages.json', JSON.stringify(languages, null, 4));
if (verbose) {
console.log("Generated language list");
}
}
genLangList();
next(0);

88
scripts/fetch-develop.deps.sh Executable file
View File

@@ -0,0 +1,88 @@
#!/bin/bash
# Fetches the js-sdk and matrix-react-sdk dependencies for development
# or testing purposes
# If there exists a branch of that dependency with the same name as
# the branch the current checkout is on, use that branch. Otherwise,
# use develop.
set -e
GIT_CLONE_ARGS=("$@")
# Look in the many different CI env vars for which branch we're
# building
if [[ "$TRAVIS" == true ]]; then
curbranch="${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}"
else
# ghprbSourceBranch for jenkins github pull request builder
# GIT_BRANCH for other jenkins builds
curbranch="${ghprbSourceBranch:-$GIT_BRANCH}"
# Otherwise look at the actual branch we're on
if [ -z "$curbranch" ]
then
curbranch=`git rev-parse --abbrev-ref HEAD`
fi
fi
echo "Determined branch to be $curbranch"
# clone a specific branch of a github repo
function clone() {
org=$1
repo=$2
branch=$3
git clone https://github.com/$org/$repo.git $repo --branch $branch \
"${GIT_CLONE_ARGS[@]}"
}
function dodep() {
org=$1
repo=$2
rm -rf $repo
clone $org $repo $curbranch || {
[ "$curbranch" != 'develop' ] && clone $org $repo develop
} || return $?
(
cd $repo
echo "$repo set to branch "`git rev-parse --abbrev-ref HEAD`
)
mkdir -p node_modules
rm -r "node_modules/$repo" 2>/dev/null || true
ln -sv "../$repo" node_modules/
}
echo -en 'travis_fold:start:matrix-js-sdk\r'
echo 'Setting up matrix-js-sdk'
dodep matrix-org matrix-js-sdk
(
cd node_modules/matrix-js-sdk
npm install
)
echo -en 'travis_fold:end:matrix-js-sdk\r'
echo -en 'travis_fold:start:matrix-react-sdk\r'
echo 'Setting up matrix-react-sdk'
dodep matrix-org matrix-react-sdk
mkdir -p node_modules/matrix-react-sdk/node_modules
ln -s ../../matrix-js-sdk node_modules/matrix-react-sdk/node_modules/
(
cd node_modules/matrix-react-sdk
npm install
)
echo -en 'travis_fold:end:matrix-react-sdk\r'
# Link the reskindex binary in place: if we used npm link,
# npm would do this for us, but we don't because we'd have
# to define the npm prefix somewhere so it could put the
# intermediate symlinks there. Instead, we do it ourselves.
mkdir -p node_modules/.bin
ln -sfv ../matrix-react-sdk/scripts/reskindex.js node_modules/.bin/reskindex

View File

@@ -8,10 +8,13 @@ nvm use 6
set -x
# check out corresponding branches of dependencies
`dirname $0`/fetch-develop.deps.sh
npm install
# apparently npm 3.10.3 on node 6.4.0 doesn't upgrade #develop target with npm install unless explicitly asked.
npm install matrix-react-sdk matrix-js-sdk olm
npm install olm
# install olm. A naive 'npm i ./olm/olm-*.tgz' fails because it uses the url
# from our package.json (or even matrix-js-sdk's) in preference.
@@ -23,11 +26,6 @@ npm install matrix-react-sdk matrix-js-sdk olm
#rm -r node_modules/olm
#cp -r olm/package node_modules/olm
# we may be using dev branches of js-sdk and react-sdk, in which case we need to build them
(cd node_modules/matrix-js-sdk && npm install)
(cd node_modules/matrix-react-sdk && npm install)
# run the mocha tests
npm run test
@@ -36,11 +34,9 @@ npm run lintall -- -f checkstyle -o eslint.xml || true
rm dist/riot-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist
# node_modules deps from 'npm install' don't have a .git dir so can't
# rev-parse; but they do set the commit in package.json under 'gitHead' which
# we're grabbing here.
REACT_SHA=$(grep 'gitHead' node_modules/matrix-react-sdk/package.json | cut -d \" -f 4 | head -c 12)
JSSDK_SHA=$(grep 'gitHead' node_modules/matrix-js-sdk/package.json | cut -d \" -f 4 | head -c 12)
# Since the deps are fetched from git, we can rev-parse
REACT_SHA=$(cd node_modules/matrix-react-sdk; git rev-parse --short=12 HEAD)
JSSDK_SHA=$(cd node_modules/matrix-js-sdk; git rev-parse --short=12 HEAD)
VECTOR_SHA=$(git rev-parse --short=12 HEAD) # use the ACTUAL SHA rather than assume develop

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 'matrix-react-sdk/lib/languageHandler';
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

@@ -17,6 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler';
module.exports = React.createClass({
displayName: 'CompatibilityPage',
@@ -39,23 +40,37 @@ module.exports = React.createClass({
return (
<div className="mx_CompatibilityPage">
<div className="mx_CompatibilityPage_box">
<p>Sorry, your browser is <b>not</b> able to run Riot.</p>
<p>{ _tJsx("Sorry, your browser is <b>not</b> able to run Riot.", /<b>(.*?)<\/b>/, (sub) => <b>{sub}</b>) } </p>
<p>
Riot uses many advanced browser features, some of which are not
available or experimental in your current browser.
{ _t("Riot uses many advanced browser features, some of which are not available or experimental in your current browser.") }
</p>
<p>
Please install <a href="https://www.google.com/chrome">Chrome</a> or <a href="https://getfirefox.com">Firefox</a> for
the best experience. <a href="http://apple.com/safari">Safari</a> and <a href="http://opera.com">Opera</a> work too.
{ _tJsx('Please install <a href="https://www.google.com/chrome">Chrome</a> or <a href="https://getfirefox.com">Firefox</a> for the best experience.',
[
/<a href="https:\/\/www.google.com\/chrome">(.*?)<\/a>/,
/<a href="https:\/\/getfirefox.com">(.*?)<\/a>/,
],
[
(sub) => <a href="https://www.google.com/chrome">{sub}</a>,
(sub) => <a href="https://getfirefox.com">{sub}</a>,
]
)}
{ _tJsx('<a href="http://apple.com/safari">Safari</a> and <a href="http://opera.com">Opera</a> work too.',
[
/<a href="http:\/\/apple\.com\/safari">(.*?)<\/a>/,
/<a href="http:\/\/opera\.com">(.*?)<\/a>/,
],
[
(sub) => <a href="http://apple.com/safari">{sub}</a>,
(sub) => <a href="http://opera.com">{sub}</a>,
]
)}
</p>
<p>
With your current browser, the look and feel of the application may
be completely incorrect, and some or all features may not function.
If you want to try it anyway you can continue, but you are on your own
in terms of any issues you may encounter!
{ _t("With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!") }
</p>
<button onClick={this.onAccept}>
I understand the risks and wish to continue
{ _t("I understand the risks and wish to continue") }
</button>
</div>
</div>

View File

@@ -16,14 +16,16 @@ 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 'matrix-react-sdk/lib/languageHandler';
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 Analytics from 'matrix-react-sdk/lib/Analytics';
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 +36,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',
@@ -60,24 +62,26 @@ module.exports = React.createClass({
return {
phase: this.Phase.MemberInfo,
member: member,
}
}
else {
};
} else {
return {
phase: this.Phase.MemberList
}
};
}
},
onMemberListButtonClick: function() {
Analytics.trackEvent('Right Panel', 'Member List Button', 'click');
this.setState({ phase: this.Phase.MemberList });
},
onFileListButtonClick: function() {
Analytics.trackEvent('Right Panel', 'File List Button', 'click');
this.setState({ phase: this.Phase.FilePanel });
},
onNotificationListButtonClick: function() {
Analytics.trackEvent('Right Panel', 'Notification List Button', 'click');
this.setState({ phase: this.Phase.NotificationPanel });
},
@@ -91,8 +95,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 +192,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>;
}
@@ -198,29 +202,29 @@ module.exports = React.createClass({
buttonGroup =
<div className="mx_RightPanel_headerButtonGroup">
<AccessibleButton className="mx_RightPanel_headerButton"
title="Members" onClick={ this.onMemberListButtonClick }>
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="Files" onClick={ this.onFileListButtonClick }>
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="Notifications" onClick={ this.onNotificationListButtonClick }>
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 }>
<div className="mx_RightPanel_headerButton mx_RightPanel_collapsebutton" title={ _t("Hide panel") } onClick={ this.onCollapseClick }>
<TintableSvg src="img/minimise.svg" width="10" height="16"/>
</div>
</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 'matrix-react-sdk/lib/languageHandler';
import {instanceForInstanceId, protocolNameForInstanceId} from '../../utils/DirectoryUtils';
linkifyMatrix(linkify);
@@ -60,6 +62,7 @@ module.exports = React.createClass({
},
componentWillMount: function() {
this._unmounted = false;
this.nextBatch = null;
this.filterTimeout = null;
this.scrollPanel = null;
@@ -79,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'),
});
});
@@ -97,6 +100,10 @@ module.exports = React.createClass({
// sideOpacity: 1.0,
// middleOpacity: 1.0,
// });
if (this.filterTimeout) {
clearTimeout(this.filterTimeout);
}
this._unmounted = true;
},
refreshRoomList: function() {
@@ -139,6 +146,11 @@ module.exports = React.createClass({
return;
}
if (this._unmounted) {
// if we've been unmounted, we don't care either.
return;
}
this.nextBatch = data.next_batch;
this.setState((s) => {
s.publicRooms.push(...data.chunk);
@@ -156,12 +168,18 @@ module.exports = React.createClass({
// requests either
return;
}
if (this._unmounted) {
// if we've been unmounted, we don't care either.
return;
}
this.setState({ loading: false });
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'))
});
});
},
@@ -175,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();
@@ -209,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'))
});
});
}
@@ -298,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;
}
@@ -309,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'),
});
});
}
@@ -337,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;
}
@@ -352,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
@@ -377,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>
);
}
@@ -477,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>
);
@@ -495,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>
@@ -529,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;
}
@@ -548,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 'matrix-react-sdk/lib/languageHandler';
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 'matrix-react-sdk/lib/languageHandler';
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
var rate_limited_func = require('matrix-react-sdk/lib/ratelimitedfunc');
@@ -99,13 +100,13 @@ module.exports = React.createClass({
if (this.props.collapsed) {
toggleCollapse =
<AccessibleButton className="mx_SearchBox_maximise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, true) }>
<TintableSvg src="img/maximise.svg" width="10" height="16" alt="Expand panel"/>
<TintableSvg src="img/maximise.svg" width="10" height="16" alt={ _t("Expand panel") }/>
</AccessibleButton>
}
else {
toggleCollapse =
<AccessibleButton className="mx_SearchBox_minimise" tabIndex={collapseTabIndex} onClick={ this.onToggleCollapse.bind(this, false) }>
<TintableSvg src="img/minimise.svg" width="10" height="16" alt="Collapse panel"/>
<TintableSvg src="img/minimise.svg" width="10" height="16" alt={ _t("Collapse panel") }/>
</AccessibleButton>
}
@@ -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

@@ -16,13 +16,14 @@ limitations under the License.
'use strict';
var React = require('react');
const 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');
var Modal = require('matrix-react-sdk/lib/Modal');
var Resend = require("matrix-react-sdk/lib/Resend");
const MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
const dis = require('matrix-react-sdk/lib/dispatcher');
const sdk = require('matrix-react-sdk');
import { _t } from 'matrix-react-sdk/lib/languageHandler';
const Modal = require('matrix-react-sdk/lib/Modal');
const Resend = require("matrix-react-sdk/lib/Resend");
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
module.exports = React.createClass({
@@ -39,13 +40,38 @@ module.exports = React.createClass({
onFinished: React.PropTypes.func,
},
getInitialState: function() {
return {
canRedact: false,
};
},
componentWillMount: function() {
MatrixClientPeg.get().on('RoomMember.powerLevel', this._checkCanRedact);
this._checkCanRedact();
},
componentWillUnmount: function() {
const cli = MatrixClientPeg.get();
if (cli) {
cli.removeListener('RoomMember.powerLevel', this._checkCanRedact);
}
},
_checkCanRedact: function() {
const cli = MatrixClientPeg.get();
const room = cli.getRoom(this.props.mxEvent.getRoomId());
const canRedact = room.currentState.maySendRedactionForEvent(this.props.mxEvent, cli.credentials.userId);
this.setState({canRedact});
},
onResendClick: function() {
Resend.resend(this.props.mxEvent);
if (this.props.onFinished) this.props.onFinished();
},
onViewSourceClick: function() {
var ViewSource = sdk.getComponent('structures.ViewSource');
const ViewSource = sdk.getComponent('structures.ViewSource');
Modal.createDialog(ViewSource, {
content: this.props.mxEvent.event,
}, 'mx_Dialog_viewsource');
@@ -70,12 +96,12 @@ module.exports = React.createClass({
MatrixClientPeg.get().redactEvent(
this.props.mxEvent.getRoomId(), this.props.mxEvent.getId()
).catch(function(e) {
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
// display error message stating you couldn't delete this.
var code = e.errcode || e.statusCode;
const 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();
},
@@ -88,6 +114,14 @@ module.exports = React.createClass({
if (this.props.onFinished) this.props.onFinished();
},
onForwardClick: function() {
dis.dispatch({
action: 'forward_event',
content: this.props.mxEvent,
});
this.closeMenu();
},
closeMenu: function() {
if (this.props.onFinished) this.props.onFinished();
},
@@ -99,7 +133,7 @@ module.exports = React.createClass({
if (this.props.onFinished) this.props.onFinished();
},
onQuoteClick: function () {
onQuoteClick: function() {
console.log(this.props.mxEvent);
dis.dispatch({
action: 'quote',
@@ -108,28 +142,29 @@ module.exports = React.createClass({
},
render: function() {
var eventStatus = this.props.mxEvent.status;
var resendButton;
var viewSourceButton;
var viewClearSourceButton;
var redactButton;
var cancelButton;
var permalinkButton;
var unhidePreviewButton;
var externalURLButton;
const eventStatus = this.props.mxEvent.status;
let resendButton;
let redactButton;
let cancelButton;
let forwardButton;
let viewSourceButton;
let viewClearSourceButton;
let unhidePreviewButton;
let permalinkButton;
let externalURLButton;
if (eventStatus === 'not_sent') {
resendButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onResendClick}>
Resend
{ _t('Resend') }
</div>
);
}
if (!eventStatus && !this.props.mxEvent.isRedacted()) { // sent and not redacted
if (!eventStatus && this.state.canRedact) {
redactButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onRedactClick}>
Redact
{ _t('Remove') }
</div>
);
}
@@ -137,21 +172,32 @@ 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>
);
}
if (!eventStatus && this.props.mxEvent.getType() === 'm.room.message') {
const content = this.props.mxEvent.getContent();
if (content.msgtype && content.msgtype !== 'm.bad.encrypted' && content.hasOwnProperty('body')) {
forwardButton = (
<div className="mx_MessageContextMenu_field" onClick={this.onForwardClick}>
{ _t('Forward Message') }
</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,9 +206,9 @@ 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 +216,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 +231,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>
);
}
@@ -196,6 +242,7 @@ module.exports = React.createClass({
{resendButton}
{redactButton}
{cancelButton}
{forwardButton}
{viewSourceButton}
{viewClearSourceButton}
{unhidePreviewButton}
@@ -204,5 +251,5 @@ module.exports = React.createClass({
{externalURLButton}
</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 'matrix-react-sdk/lib/languageHandler';
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

@@ -17,6 +17,7 @@ limitations under the License.
import React from 'react';
import sdk from 'matrix-react-sdk';
import SdkConfig from 'matrix-react-sdk/lib/SdkConfig';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
export default class BugReportDialog extends React.Component {
constructor(props, context) {
@@ -49,12 +50,12 @@ export default class BugReportDialog extends React.Component {
const userText = this.state.text;
if (!sendLogs && userText.trim().length === 0) {
this.setState({
err: "Please describe the bug and/or send logs.",
err: _t("Please describe the bug and/or send logs."),
});
return;
}
this.setState({ busy: true, progress: null, err: null });
this._sendProgressCallback("Loading bug report module");
this._sendProgressCallback(_t("Loading bug report module"));
require(['../../../vector/submit-rageshake'], (s) => {
s(SdkConfig.get().bug_report_endpoint_url, {
@@ -69,8 +70,9 @@ export default class BugReportDialog extends React.Component {
}, (err) => {
if (!this._unmounted) {
this.setState({
busy: false, progress: null,
err: `Failed to send report: ${err.message}`,
busy: false,
progress: null,
err: _t("Failed to send report: ") + `${err.message}`,
});
}
});
@@ -105,7 +107,7 @@ export default class BugReportDialog extends React.Component {
let cancelButton = null;
if (!this.state.busy) {
cancelButton = <button onClick={this._onCancel}>
Cancel
{ _t("Cancel") }
</button>;
}
@@ -122,25 +124,27 @@ export default class BugReportDialog extends React.Component {
return (
<div className="mx_BugReportDialog">
<div className="mx_Dialog_title">
Report a bug
{ _t("Report a bug") }
</div>
<div className="mx_Dialog_content">
<p>Please describe the bug. What did you do?
What did you expect to happen?
What actually happened?</p>
<p>
{ _t("Please describe the bug. What did you do? What did you expect to happen? What actually happened?") }
</p>
<textarea
className="mx_BugReportDialog_input"
rows={5}
onChange={this._onTextChange}
value={this.state.text}
placeholder="Describe your problem here."
placeholder={_t("Describe your problem here.")}
/>
<p>In order to diagnose problems, logs from this client will be sent with
this bug report.
If you would prefer to only send the text above, please untick:</p>
<p>
{ _t("In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:") }
</p>
<input type="checkbox" checked={this.state.sendLogs}
onChange={this._onSendLogsChange} id="mx_BugReportDialog_logs"/>
<label htmlFor="mx_BugReportDialog_logs">Send logs</label>
<label htmlFor="mx_BugReportDialog_logs">
{ _t("Send logs") }
</label>
{progress}
{error}
</div>
@@ -151,7 +155,7 @@ export default class BugReportDialog extends React.Component {
autoFocus={true}
disabled={this.state.busy}
>
Send
{ _t("Send") }
</button>
{cancelButton}

View File

@@ -17,6 +17,7 @@
import React from 'react';
import sdk from 'matrix-react-sdk';
import request from 'browser-request';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
const REPOS = ['vector-im/vector-web', 'matrix-org/matrix-react-sdk', 'matrix-org/matrix-js-sdk'];
@@ -70,16 +71,16 @@ export default class ChangelogDialog extends React.Component {
const content = (
<div className="mx_ChangelogDialog_content">
{this.props.version == null || this.props.newVersion == null ? <h2>Unavailable</h2> : logs}
{this.props.version == null || this.props.newVersion == null ? <h2>{_t("Unavailable")}</h2> : logs}
</div>
);
return (
<QuestionDialog
title="Changelog"
title={_t("Changelog")}
description={content}
button="Update"
button={_t("Update")}
onFinished={this.props.onFinished}
/>
)

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 'matrix-react-sdk/lib/languageHandler';
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

@@ -15,7 +15,8 @@ limitations under the License.
*/
var React = require('react');
var dis = require('matrix-react-sdk/lib/dispatcher')
var dis = require('matrix-react-sdk/lib/dispatcher');
import { _tJsx } from 'matrix-react-sdk/lib/languageHandler';
module.exports = React.createClass({
displayName: 'GuestWarningBar',
@@ -34,7 +35,17 @@ module.exports = React.createClass({
<div className="mx_GuestWarningBar">
<img className="mx_GuestWarningBar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div>
You are Rioting as a guest. <a onClick={this.onRegisterClicked}>Register</a> or <a onClick={this.onLoginClicked}>sign in</a> to access more rooms and features.
{ _tJsx(
"You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!",
[
/<a>(.*?)<\/a>/,
/<a>(.*?)<\/a>/
],
[
(sub) => <a onClick={this.onRegisterClicked}>{sub}</a>,
(sub) => <a onClick={this.onLoginClicked}>{sub}</a>
]
) }
</div>
</div>
);

View File

@@ -16,10 +16,10 @@ limitations under the License.
'use strict';
var React = require('react');
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');
import React from 'react';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import Notifier from 'matrix-react-sdk/lib/Notifier';
import AccessibleButton from 'matrix-react-sdk/lib/components/views/elements/AccessibleButton';
module.exports = React.createClass({
displayName: 'MatrixToolbar',
@@ -37,10 +37,10 @@ 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

@@ -20,6 +20,7 @@ import React from 'react';
import sdk from 'matrix-react-sdk';
import Modal from 'matrix-react-sdk/lib/Modal';
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
/**
* Check a version string is compatible with the Changelog
@@ -40,9 +41,9 @@ export default React.createClass({
displayReleaseNotes: function(releaseNotes) {
const QuestionDialog = sdk.getComponent('dialogs.QuestionDialog');
Modal.createDialog(QuestionDialog, {
title: "What's New",
title: _t("What's New"),
description: <pre className="changelog_text">{releaseNotes}</pre>,
button: "Update",
button: _t("Update"),
onFinished: (update) => {
if(update && PlatformPeg.get()) {
PlatformPeg.get().installUpdate();
@@ -75,17 +76,29 @@ export default React.createClass({
// automatically tells you what's changed (provided the versions
// are in the right format)
if (this.props.releaseNotes) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.displayReleaseNotes}>What's new?</button>;
action_button = (
<button className="mx_MatrixToolbar_action" onClick={this.displayReleaseNotes}>
{ _t("What's new?") }
</button>
);
} else if (checkVersion(this.props.version) && checkVersion(this.props.newVersion)) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.displayChangelog}>What's new?</button>;
action_button = (
<button className="mx_MatrixToolbar_action" onClick={this.displayChangelog}>
{ _t("What's new?") }
</button>
);
} else if (PlatformPeg.get()) {
action_button = <button className="mx_MatrixToolbar_action" onClick={this.onUpdateClicked}>Update</button>;
action_button = (
<button className="mx_MatrixToolbar_action" onClick={this.onUpdateClicked}>
{ _t("Update") }
</button>
);
}
return (
<div className="mx_MatrixToolbar">
<img className="mx_MatrixToolbar_warning" src="img/warning.svg" width="24" height="23" alt="/!\"/>
<div className="mx_MatrixToolbar_content">
A new version of Riot is available.
{_t("A new version of Riot is available.")}
</div>
{action_button}
</div>

View File

@@ -15,6 +15,8 @@ limitations under the License.
*/
var React = require("react");
var sanitizeHtml = require("sanitize-html");
import { _t } from 'matrix-react-sdk/lib/languageHandler';
module.exports = React.createClass({
displayName: 'VectorCustomServerDialog',
@@ -26,24 +28,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: sanitizeHtml(_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 'matrix-react-sdk/lib/languageHandler';
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,21 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
'use strict';
import React from 'react';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import DateUtils from 'matrix-react-sdk/lib/DateUtils';
var React = require('react');
var days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
];
function getdaysArray() {
return [
_t('Sunday'),
_t('Monday'),
_t('Tuesday'),
_t('Wednesday'),
_t('Thursday'),
_t('Friday'),
_t('Saturday'),
];
}
module.exports = React.createClass({
displayName: 'DateSeparator',
@@ -34,19 +36,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, this.props.showTwelveHour);
}
return (

View File

@@ -16,19 +16,22 @@ limitations under the License.
'use strict';
var React = require('react');
var DateUtils = require('matrix-react-sdk/lib/DateUtils');
const React = require('react');
const DateUtils = require('matrix-react-sdk/lib/DateUtils');
module.exports = React.createClass({
displayName: 'MessageTimestamp',
propTypes: {
showTwelveHour: React.PropTypes.bool,
},
render: function() {
var date = new Date(this.props.ts);
const date = new Date(this.props.ts);
return (
<span className="mx_MessageTimestamp" title={ DateUtils.formatFullDate(date) }>
{ DateUtils.formatTime(date) }
<span className="mx_MessageTimestamp" title={ DateUtils.formatFullDate(date, this.props.showTwelveHour) }>
{ DateUtils.formatTime(date, this.props.showTwelveHour) }
</span>
);
},
});

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 'matrix-react-sdk/lib/languageHandler';
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

@@ -21,6 +21,7 @@ var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
var sdk = require('matrix-react-sdk');
var classNames = require('classnames');
var AccessibleButton = require('matrix-react-sdk/lib/components/views/elements/AccessibleButton');
import { _t } from "matrix-react-sdk/lib/languageHandler";
module.exports = React.createClass({
displayName: 'SearchBar',
@@ -59,10 +60,10 @@ module.exports = React.createClass({
return (
<div className="mx_SearchBar">
<input ref="search_term" className="mx_SearchBar_input" type="text" autoFocus={true} placeholder="Search..." onKeyDown={this.onSearchChange}/>
<AccessibleButton className={ searchButtonClasses } onClick={this.onSearch}><img src="img/search-button.svg" width="37" height="37" alt="Search"/></AccessibleButton>
<AccessibleButton className={ thisRoomClasses } onClick={this.onThisRoomClick}>This Room</AccessibleButton>
<AccessibleButton className={ allRoomsClasses } onClick={this.onAllRoomsClick}>All Rooms</AccessibleButton>
<input ref="search_term" className="mx_SearchBar_input" type="text" autoFocus={true} placeholder={_t("Search…")} onKeyDown={this.onSearchChange}/>
<AccessibleButton className={ searchButtonClasses } onClick={this.onSearch}><img src="img/search-button.svg" width="37" height="37" alt={_t("Search")}/></AccessibleButton>
<AccessibleButton className={ thisRoomClasses } onClick={this.onThisRoomClick}>{_t("This Room")}</AccessibleButton>
<AccessibleButton className={ allRoomsClasses } onClick={this.onAllRoomsClick}>{_t("All Rooms")}</AccessibleButton>
<AccessibleButton className="mx_SearchBar_cancel" onClick={this.props.onCancelClick}><img src="img/cancel.svg" width="18" height="18" /></AccessibleButton>
</div>
);

View File

@@ -16,6 +16,7 @@ limitations under the License.
'use strict';
var React = require('react');
import { _t, _tJsx } from 'matrix-react-sdk/lib/languageHandler';
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,8 +176,9 @@ 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:'),
button: _t('OK'),
value: keywords,
onFinished: function onFinished(should_leave, newValue) {
@@ -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
});
}
@@ -533,7 +535,16 @@ module.exports = React.createClass({
// it corresponds to all content push rules (stored in self.state.vectorContentRule)
self.state.vectorPushRules.push({
"vectorRuleId": "_keywords",
"description" : (<span>Messages containing <span className="mx_UserNotifSettings_keywords" onClick={ self.onKeywordsClicked }>keywords</span></span>),
"description" : (
<span>
{ _tJsx('Messages containing <span>keywords</span>',
/<span>(.*?)<\/span>/,
(sub) => {
return <span className="mx_UserNotifSettings_keywords" onClick={ self.onKeywordsClicked }>{sub}</span>;
}
)}
</span>
),
"vectorState": self.state.vectorContentRules.vectorState
});
}
@@ -547,7 +558,7 @@ module.exports = React.createClass({
self.state.vectorPushRules.push({
"vectorRuleId": vectorRuleId,
"description" : ruleDefinition.description,
"description" : _t(ruleDefinition.description), // Text from VectorPushRulesDefinitions.js
"rule": rule,
"vectorState": vectorState,
});
@@ -562,8 +573,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) {
@@ -588,6 +599,7 @@ module.exports = React.createClass({
phase: self.phases.DISPLAY
});
}, function(error) {
console.error(error);
self.setState({
phase: self.phases.ERROR
});
@@ -622,7 +634,7 @@ module.exports = React.createClass({
return (
<tr key={ className }>
<th>
{title}
{ title }
</th>
<th>
@@ -698,7 +710,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 +725,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 +735,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 +749,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 +760,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 +786,7 @@ module.exports = React.createClass({
}
if (devicesSection) {
devicesSection = (<div>
<h3>Notification targets</h3>
<h3>{ _t('Notification targets') }</h3>
{ devicesSection }
</div>);
}
@@ -783,9 +795,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 notification 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 +824,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 +842,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 +854,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>

View File

@@ -0,0 +1 @@
{}

88
src/i18n/strings/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 %(toAction)s": "Перацягнуць сюды %(toAction)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 %(tagName)s from room": "Не ўдалося выдаліць %(tagName)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/strings/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"
}

172
src/i18n/strings/de_DE.json Normal file
View File

@@ -0,0 +1,172 @@
{
"Please Register": "Bitte registrieren",
"Guest users can't invite users. Please register to invite.": "Gäste können keine Nutzer einladen. Bitte registriere dich, um Nutzer einzuladen.",
"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": "betrieben mit Matrix",
"Custom Server Options": "Erweiterte Server-Optionen",
"Dismiss": "Ablehnen",
"Failed to get protocol list from Home Server": "Fehler beim Abrufen der Protokoll-Liste vom Home-Server",
"The Home Server may be too old to support third party networks": "Der Home-Server ist eventuell zu alt, 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": "Alle können mitlesen",
"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 oben eine E-Mail-Adresse hinzu, um die E-Mail-Benachrichtigungseinstellungen zu konfigurieren",
"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.": "Beim Speichern deiner E-Mail-Benachrichtigungseinstellungen ist ein Fehler aufgetreten.",
"and remove": "und entfernen",
"Can't update user notification settings": "Benachrichtigungs-Einstellungen des Nutzers konnten nicht aktualisiert werden",
"Couldn't find a matching Matrix room": "Konnte 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": "Audio-Benachrichtigungen im Web-Client aktivieren",
"Enable desktop notifications": "Desktop-Benachrichtigungen aktivieren",
"Enable email notifications": "E-Mail-Benachrichtigungen aktivieren",
"Enable notifications for this account": "Benachrichtigungen für dieses Konto aktivieren",
"Enter keywords separated by a comma:": "Schlagworte kommagetrennt eingeben:",
"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": "Einstellungen konnten nicht geändert werden",
"Failed to update keywords": "Schlüsselwörter konnten nicht aktualisiert werden",
"Failed to get public room list": "Die Liste der öffentlichen Räume konnte nicht geladen werden",
"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",
"Keywords": "Schlüsselwörter",
"Leave": "Verlassen",
"Low Priority": "Niedrige Priorität",
"Noisy": "Laut",
"Notification targets": "Benachrichtigungsziele",
"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": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren",
"Operation failed": "Aktion fehlgeschlagen",
"Reject": "ablehnen",
"Remove": "Entfernen",
"remove": "Entferner",
"Remove from Directory": "Aus dem 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": "Liste der Benachrichtigungsempfänger konnte nicht abgerufen werden",
"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 können in Riot nicht verändert werden, gelten aber trotzdem",
" to room": " an Raum",
"Drop here %(toAction)s": "Hierher ziehen: %(toAction)s",
"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 Raum-Alias %(alias)s gelöscht und der %(name)s aus dem Verzeichnis entfernt werden?",
"Download this file": "Diese 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 %(tagName)s from room": "Das Entfernen des Tags %(tagName)s für den Raum ist fehlgeschlagen",
"Failed to set direct chat tag": "Fehler beim Setzen der \"Direkter Chat\"-Kennzeichnung",
"Mentions only": "Nur, wenn du erwähnt wirst",
"Mute": "Stummschalten",
"Permalink": "Permanenter Link",
"Quote": "Zitat",
"Redact": "Redaktionell entfernen",
"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)": "Diese 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",
"Advanced notification settings": "Erweiterte Benachrichtigungs-Einstellungen",
"Call invitation": "Anruf-Einladung",
"Messages containing my display name": "Nachrichten, die meinen Anzeigenamen enthalten",
"Messages containing my user name": "Nachrichten, die meinen Nutzernamen enthalten",
"Messages in group chats": "Nachrichten in Gruppen-Chats",
"Messages in one-to-one chats": "Nachrichten in Eins-zu-Eins-Chats",
"Messages sent by bot": "Nachrichten von Bots",
"more": "mehr",
"When I'm invited to a room": "Wenn ich in einen Raum eingeladen werde",
"customServer_text": "Du kannst die erweiterten Server-Optionen nutzen, um dich auf anderen Matrix-Servern anzumelden, indem du eine andere Heimserver-URL eingibst. <br/>Dies ermöglicht es dir, Riot mit einem bereits existierenden Matrix-Konto auf einem anderen Heimserver zu nutzen.<br/><br/>Du kannst auch einen benutzerdefinierten Identitäts-Server eingeben, allerdings wirst du dann nicht in der Lage sein, andere Benutzer per E-Mail-Adresse einzuladen oder selbst Einladungen per E-Mail-Adresse zu erhalten.",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> und <a href=\"http://opera.com\">Opera</a> funktionieren ebenfalls.",
"I understand the risks and wish to continue": "Ich verstehe das Risiko und möchte fortfahren",
"Messages containing <span>keywords</span>": "Nachrichten, die definierte <span>Schlagworte</span> enthalten",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Bitte installiere <a href=\"https://www.google.com/chrome\">Chrome</a> oder <a href=\"https://getfirefox.com\">Firefox</a> für die beste Erfahrung.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot nutzt manche erweiterten Browser-Funktionen - manche sind deinem aktuellen Browser nicht verfügbar oder im experimentellen Status.",
"Sorry, your browser is <b>not</b> able to run Riot.": "Es tut uns leid, aber dein Browser kann Riot <b>nicht</b> ausführen.",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "In deinem aktuellen Browser kann das Aussehen und Gefühl der Anwendung komplett inkorrekt sein und einige oder alle Funktionen funktionieren evtl. nicht. Du kannst es trotzdem versuchen und fortfahren, aber du bist alleine mit allen Problemen auf die du stößt!",
"Expand panel": "Panel ausklappen",
"Collapse panel": "Panel einklappen",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s auf %(osName)s",
"A new version of Riot is available.": "Eine neue Version von Riot ist verfügbar.",
"All Rooms": "Alle Räume",
"Cancel": "Abbrechen",
"Changelog": "Änderungshistorie",
"Collecting app version information": "App-Versionsinformationen werden abgerufen",
"Collecting logs": "Protokolle werden abgerufen",
"Describe your problem here.": "Beschreibe dein Problem hier.",
"Failed to send report: ": "Senden des Reports fehlgeschlagen: ",
"Forward Message": "Leite Nachricht weiter",
"Hide panel": "Verberge Feld",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Um Probleme zu diagnostizieren werden mit diesem Fehlerbericht Protokolle von diesem Client gesendet. Wenn du nur obigen text senden willst, deselektiere folgendes:",
"Loading bug report module": "Lade Fehlerbericht-Modul",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Bitte beschreibe (vorzugsweise auf Englisch) den Fehler. Was tatst du? Was wolltest du, dass es passiert? Was ist passiert?",
"Please describe the bug and/or send logs.": "Bitte beschreibe den Fehler und/oder sende Protokolle.",
"Report a bug": "Einen Fehler melden",
"Riot Desktop on %(platformName)s": "Riot Desktop auf %(platformName)s",
"Riot is not supported on mobile web. Install the app?": "Riot wird im mobilen Web nicht unterstützt. App installieren?",
"Search": "Suche",
"Search…": "Suche…",
"Send": "Sende",
"Send logs": "Sende Protokolle",
"This Room": "Dieser Raum",
"Unavailable": "Nicht verfügbar",
"Unknown device": "Unbekanntes Gerät",
"Update": "Aktualisiere",
"Uploading report": "Lade Bericht hoch",
"What's New": "Was ist neu",
"What's new?": "Was ist neu?",
"Waiting for response from server": "Warte auf eine Antwort vom Server",
"You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!": "Du verwendest Riot als Gast. <a>Registriere</a> oder <a>melde dich an</a> um Zugang zu mehr Räumen und Funktionen zu bekommen!",
"You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen um einen Anruf mit Bildschirmfreigabe durchzuführen.",
"OK": "OK"
}

164
src/i18n/strings/en_EN.json Normal file
View File

@@ -0,0 +1,164 @@
{
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s on %(osName)s",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.",
"A new version of Riot is available.": "A new version of Riot is available.",
"Add an email address above to configure email notifications": "Add an email address above to configure email notifications",
"Advanced notification settings": "Advanced notification settings",
"All messages": "All messages",
"All messages (loud)": "All messages (loud)",
"All Rooms": "All Rooms",
"All notifications are currently disabled for all targets.": "All notifications are currently disabled for all targets.",
"An error occurred whilst saving your email notification preferences.": "An error occurred whilst saving your email notification preferences.",
"Call invitation": "Call invitation",
"Cancel": "Cancel",
"Cancel Sending": "Cancel Sending",
"Can't update user notification settings": "Can't update user notification settings",
"Changelog": "Changelog",
"Close": "Close",
"Collapse panel": "Collapse panel",
"Collecting app version information": "Collecting app version information",
"Collecting logs": "Collecting logs",
"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",
"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.",
"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?",
"Describe your problem here.": "Describe your problem here.",
"Direct Chat": "Direct Chat",
"Directory": "Directory",
"Dismiss": "Dismiss",
"Download this file": "Download this file",
"Drop here %(toAction)s": "Drop here %(toAction)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",
"Expand panel": "Expand panel",
"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 %(tagName)s from room": "Failed to remove tag %(tagName)s from room",
"Failed to send report: ": "Failed to send report: ",
"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",
"Forward Message": "Forward Message",
" 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.",
"Hide panel": "Hide panel",
"I understand the risks and wish to continue": "I understand the risks and wish to continue",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:",
"Invite to this room": "Invite to this room",
"Keywords": "Keywords",
"Leave": "Leave",
"Loading bug report module": "Loading bug report module",
"Low Priority": "Low Priority",
"Members": "Members",
"Mentions only": "Mentions only",
"Messages containing my display name": "Messages containing my display name",
"Messages containing <span>keywords</span>": "Messages containing <span>keywords</span>",
"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 describe the bug. What did you do? What did you expect to happen? What actually happened?": "Please describe the bug. What did you do? What did you expect to happen? What actually happened?",
"Please describe the bug and/or send logs.": "Please describe the bug and/or send logs.",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.",
"Please 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",
"Report a bug": "Report a bug",
"Resend": "Resend",
"Riot Desktop on %(platformName)s": "Riot Desktop on %(platformName)s",
"Riot does not know how to join a room on this network": "Riot does not know how to join a room on this network",
"Riot is not supported on mobile web. Install the app?": "Riot is not supported on mobile web. Install the app?",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot uses many advanced browser features, some of which are not available or experimental in your current browser.",
"Room directory": "Room directory",
"Room not found": "Room not found",
"Search": "Search",
"Search…": "Search…",
"Search for a room": "Search for a room",
"Send": "Send",
"Send logs": "Send logs",
"Settings": "Settings",
"Source URL": "Source URL",
"Sorry, your browser is <b>not</b> able to run Riot.": "Sorry, your browser is <b>not</b> able to run Riot.",
"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": "This Room",
"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",
"Unavailable": "Unavailable",
"Unhide Preview": "Unhide Preview",
"Unknown device": "Unknown device",
"unknown error code": "unknown error code",
"Unnamed room": "Unnamed room",
"Update": "Update",
"Uploaded on %(date)s by %(user)s": "Uploaded on %(date)s by %(user)s",
"Uploading report": "Uploading report",
"View Decrypted Source": "View Decrypted Source",
"View Source": "View Source",
"What's New": "What's New",
"What's new?": "What's new?",
"Waiting for response from server": "Waiting for response from server",
"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 are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!": "You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "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",
"OK": "OK",
"You need to be using HTTPS to place a screen-sharing call.": "You need to be using HTTPS to place a screen-sharing call.",
"Welcome page": "Welcome page",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!"
}

116
src/i18n/strings/es.json Normal file
View File

@@ -0,0 +1,116 @@
{
"Add an email address above to configure email notifications": "Añade una dirección de email arriba para configurar las notificaciones por email",
"Advanced notification settings": "Configuración de notificaciones avanzada",
"All messages": "Todos los mensajes",
"An error occurred whilst saving your email notification preferences.": "Se ha producido un error al guardar las preferencias de notificación por email.",
"Call invitation": "Invitación a la llamada",
"Cancel Sending": "Cancelar envío",
"Can't update user notification settings": "No se puede actualizar la configuración de notificación de usuario",
"Close": "Cerrar",
"Create new room": "Crear nueva sala",
"Couldn't find a matching Matrix room": "No se encontró una sala Matrix que coincidiera",
"Custom Server Options": "Opciones de Servidor Personalizado",
"customServer_text": "Puedes utilizar las opciones de servidor personalizadas para iniciar sesión en otros servidores Matrix especificando una URL de Home server distinta.<br/>Esto te permite usar Riot con una cuenta Matrix existente en un Home server distinto.<br/><br/>También puedes configurar un servidor de identidad personalizado, pero no podrás invitar usuarios por dirección de email, ni ser invitado por email por ti mismo.",
"delete the alias.": "borrar el alias.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "¿Borrar la sala alias %(alias)s y retirar %(name)s del directorio?",
"Direct Chat": "Conversación directa",
"Directory": "Directorio",
"Download this file": "Descargar este archivo",
"Drop here %(toAction)s": "Suelta aquí para %(toAction)s",
"Enable audible notifications in web client": "Habilitar notificaciones audibles en el cliente web",
"Enable desktop notifications": "Habilitar notificaciones de escritorio",
"Enable email notifications": "Habilitar notificaciones por email",
"Enable notifications for this account": "Habilitar notificaciones para esta cuenta",
"Enable them now": "Habilitarlos ahora",
"Enter keywords separated by a comma:": "Introduzca palabras clave separadas por una coma:",
"Error": "Error",
"Error saving email notification preferences": "Error al guardar las preferencias de notificación por email",
"#example": "#ejemplo",
"Failed to add tag %(tagName)s to room": "Error al añadir la etiqueta %(tagName)s a la sala",
"Failed to change settings": "Error al cambiar la configuración",
"Failed to forget room %(errCode)s": "Falló al olvidar la sala %(errCode)s",
"Failed to update keywords": "Error al actualizar las palabras clave",
"Failed to get protocol list from Home Server": "Error al obtener la lista de protocolos de Home Server",
"Failed to get public room list": "No se pudo obtener la lista de salas públicas",
"Failed to join the room": "Falló al unirse a la sala",
"Failed to remove tag %(tagName)s from room": "Error al eliminar la etiqueta %(tagName)s de la sala",
"Failed to set direct chat tag": "Error al establecer la etiqueta de chat directo",
"Failed to set Direct Message status of room": "No se pudo establecer el estado de Mensaje Directo de la sala",
"Favourite": "Favorito",
"Fetching third party location failed": "Falló la obtención de la ubicación de un tercero",
"Files": "Archivos",
"Filter room names": "Filtrar los nombres de las salas",
"Forget": "Olvidar",
" from room": " de la sala",
"Guests can join": "Los invitados se pueden unir",
"Guest users can't invite users. Please register to invite.": "Los usuarios invitados no pueden invitar usuarios. Por favor, regístrate para poder invitar.",
"Invite to this room": "Invitar a esta sala",
"Keywords": "Palabras clave",
"Leave": "Salir",
"Low Priority": "Baja Prioridad",
"Members": "Miembros",
"Mentions only": "Sólo menciones",
"Messages containing my display name": "Mensajes que contienen mi nombre para mostrar",
"Messages containing my user name": "Mensajes que contienen mi nombre de usuario",
"Messages in group chats": "Mensajes en chats de grupo",
"Messages in one-to-one chats": "Mensajes en chats uno a uno",
"Messages sent by bot": "Mensajes enviados por bot",
"more": "más",
"Mute": "Mute",
"No rooms to show": "Sin salas para mostrar",
"Noisy": "Ruidoso",
"Notification targets": "Objetivos de notificación",
"Notifications": "Notificaciones",
"Notifications on the following keywords follow rules which cant be displayed here:": "Las notificaciones de las siguientes palabras clave siguen reglas que no se pueden mostrar aquí:",
"Notify me for anything else": "Notificarme para cualquier otra cosa",
"Off": "Apagado",
"On": "Encendido",
"Operation failed": "Operación fallida",
"Permalink": "Enlace permanente",
"Please Register": "Por favor regístrate",
"Quote": "Citar",
"Redact": "Redactar",
"Reject": "Rechazar",
"Remove %(name)s from the directory?": "¿Retirar %(name)s del directorio?",
"Remove": "Eliminar",
"remove %(name)s from the directory.": "retirar %(name)s del directorio.",
"Remove from Directory": "Retirar del Directorio",
"Resend": "Reenviar",
"Riot does not know how to join a room on this network": "Riot no sabe cómo unirse a una sala en esta red",
"Room directory": "Directorio de salas",
"Room not found": "Sala no encontrada",
"Search for a room": "Buscar sala",
"Settings": "Ajustes",
"Source URL": "URL de origen",
"Start chat": "Comenzar chat",
"The Home Server may be too old to support third party networks": "El Home Server puede ser demasiado antiguo para soportar redes de terceros",
"There are advanced notifications which are not shown here": "Hay notificaciones avanzadas que no se muestran aquí",
"The server may be unavailable or overloaded": "El servidor puede estar no disponible o sobrecargado",
"This room is inaccessible to guests. You may be able to join if you register.": "Esta sala es inaccesible para los invitados. Puedes unirse si te registras.",
" to room": " a la sala",
"Unable to fetch notification target list": "No se puede obtener la lista de objetivos de notificación",
"Unable to join network": "No se puede unir a la red",
"Unable to look up room ID from server": "No se puede buscar el ID de la sala desde el servidor",
"Unhide Preview": "Mostrar Vista Previa",
"unknown error code": "Código de error desconocido",
"Unnamed room": "Sala sin nombre",
"Uploaded on %(date)s by %(user)s": "Subido el %(date)s por %(user)s",
"View Decrypted Source": "Ver Fuente Descifrada",
"View Source": "Ver Fuente",
"When I'm invited to a room": "Cuando estoy invitado a una sala",
"World readable": "Legible por todo el mundo",
"You cannot delete this image. (%(code)s)": "No puedes eliminar esta imagen. (%(code)s)",
"You cannot delete this message. (%(code)s)": "No puedes eliminar este mensaje. (%(code)s)",
"You are not receiving desktop notifications": "No estás recibiendo notificaciones de escritorio",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Es posible que los hayas configurado en un cliente que no sea Riot. No puedes ajustarlos en Riot, pero todavía se aplican",
"Sunday": "Domingo",
"Monday": "Lunes",
"Tuesday": "Martes",
"Wednesday": "Miércoles",
"Thursday": "Jueves",
"Friday": "Viernes",
"Saturday": "Sábado",
"Today": "Hoy",
"Yesterday": "Ayer",
"Welcome page": "Página de bienvenida"
}

3
src/i18n/strings/fi.json Normal file
View File

@@ -0,0 +1,3 @@
{
"Sunday": "Sunnuntai"
}

165
src/i18n/strings/fr.json Normal file
View File

@@ -0,0 +1,165 @@
{
"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 notifications sont désactivées pour tous les appareils.",
"An error occurred whilst saving your email notification preferences.": "Une erreur est survenue lors de la sauvegarde de vos préférences de notifications par e-mail.",
"Cancel Sending": "Annuler l'envoi",
"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ées",
"delete the alias.": "Supprimer l'alias.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Supprimer l'alias %(alias)s du salon et supprimer %(name)s du répertoire ?",
"Direct Chat": "Conversation Directe",
"Directory": "Répertoire",
"Dismiss": "Ignorer",
"Download this file": "Télécharger ce fichier",
"Drop here %(toAction)s": "Déposer ici %(toAction)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": "Échec pour",
"Failed to add tag %(tagName)s to room": "Échec lors de l'ajout de létiquette %(tagName)s au salon",
"Failed to change settings": "Échec de la mise à jour des paramètres",
"Failed to forget room %(errCode)s": "Échec lors de l'oubli 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": "Échec lors de la récupération de la liste sur le serveur",
"Failed to get public room list": "Échec lors de la récupération de la liste des salons publics",
"Failed to join the room": "Échec de l'adhésion au salon",
"Failed to remove tag %(tagName)s from room": "Échec dans la suppression de létiquette %(tagName)s du salon",
"Failed to set direct chat tag": "Échec dans l'attribution d'une étiquette dans le chat direct",
"Favourite": "Favoris",
"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 une 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 d'accueil",
"Call invitation": "Appel entrant",
"Failed to set Direct Message status of room": "Échec de la configuration de l'état de Message Direct du salon",
"Fetching third party location failed": "Échec de la récupération de la localisation tierce",
"Files": "Fichiers",
"Filter room names": "Filtrer les salons par nom",
"Forget": "Oublier",
" from room": " du salon",
"Guest users can't invite users. Please register to invite.": "Les visiteurs ne peuvent démarrer une discussion. Merci de vous enregistrer pour pouvoir démarrer une discussion.",
"Invite to this room": "Inviter dans ce salon",
"Keywords": "Mots-clés",
"Leave": "Quitter",
"Low Priority": "Priorité Basse",
"Members": "Membres",
"Mentions only": "Seulement les mentions",
"Messages containing my display name": "Messages contenant mon nom",
"Messages containing my user name": "Message contenant mon nom d'utilisateur",
"Messages in group chats": "Messages dans les conversations de groupe",
"Messages in one-to-one chats": "Messages dans les conversations directes",
"Messages sent by bot": "Messages envoyés par des robots",
"more": "plus",
"Mute": "Couper le son",
"No rooms to show": "Aucun salon à afficher",
"Noisy": "Sonore",
"Notification targets": "Appareils recevant les notifications",
"Notifications": "Notifications",
"Notifications on the following keywords follow rules which cant be displayed here": "Les mots-clés suivants suivent des règles de notification qui ne peuvent être affichées ici",
"Notify for all other messages/rooms": "Me notifier pour tous les autres messages/salons",
"Notify me for anything else": "Me notifier pour tout le reste",
"Off": "Désactivé",
"On": "Activé",
"Permalink": "Permalien",
"remove %(name)s from the directory.": "supprimer %(name)s du répertoire.",
"Remove from Directory": "Supprimer du répertoire",
"Riot does not know how to join a room on this network": "Riot ne peut pas joindre un salon sur ce réseau",
"Room directory": "Répertoire des salons",
"Room not found": "Salon non trouvé",
"Search for a room": "Chercher un salon",
"Source URL": "URL source",
"The Home Server may be too old to support third party networks": "Le Home Server semble trop ancien pour supporter des réseaux tiers",
"There are advanced notifications which are not shown here": "Il existe une configuration avancée des notifications qui ne peut être affichée ici",
"The server may be unavailable or overloaded": "Le serveur est indisponible ou surchargé",
"This room is inaccessible to guests. You may be able to join if you register.": "Ce salon n'est pas ouvert aux visiteurs. Vous pourrez peut-être le rejoindre si vous vous enregistrez.",
"Unable to fetch notification target list": "Impossible de récupérer la liste des appareils recevant les notifications",
"Unable to join network": "Impossible de rejoindre le réseau",
"Unable to look up room ID from server": "Impossible de récupérer l'ID du salon sur le serveur",
"Unhide Preview": "Dévoiler l'aperçu",
"Unnamed room": "Salon anonyme",
"Uploaded on %(date)s by %(user)s": "Téléchargé le %(date)s par %(user)s",
"View Decrypted Source": "Voir la source décryptée",
"When I'm invited to a room": "Quand je suis invité dans un salon",
"World readable": "Visible par tout le monde",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Vous les avez probablement configurées dans un autre client que Riot. Vous ne pouvez pas les configurer dans Riot mais elles s'appliquent quand même",
"Guests can join": "Ouvert aux visiteurs",
" to room": " au salon",
"Advanced notification settings": "Paramètres de notification avancés",
"customServer_text": "Vous pouvez utiliser l'option de serveur personnalisé pour vous connectez à d'autres serveurs Matrix, en spécifiant une adresse de homerserver différente.<br/>Cela permet d'utiliser Riot avec un compte existant sur un homeserverdifférent.<br/><br/>Vous pouvez aussi indiquer un serveur d'identité personnel mais vous ne pourrez plus inviter des utilisateurs par email, ou être invité par email.",
"Notifications on the following keywords follow rules which cant be displayed here:": "Les notifications pour les mots-clés suivant répondent à des critères qui ne peuvent pas être affichés ici :",
"Collapse panel": "Cacher le panneau",
"Expand panel": "Dévoiler le panneau",
"I understand the risks and wish to continue": "Je comprends les risques et souhaite continuer",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot utilise de nombreuses fonctionnalités avancées du navigateur, certaines ne sont pas disponibles ou expérimentales dans votre navigateur actuel.",
"Sorry, your browser is <b>not</b> able to run Riot.": "Désolé, Riot n'est <b>pas</b> supporté par votre navigateur.",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Depuis votre navigateur actuel, le visuel et le ressenti de l'application pourraient être complètement incorrects, et certaines fonctionnalités pourraient ne pas être supportées. Vous pouvez continuer malgré tout, mais vous n'aurez pas de support si vous rencontrez des problèmes !",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Veuillez installer <a href=\"https://www.google.com/chrome\">Chrome</a> ou <a href=\"https://getfirefox.com\">Firefox</a> pour une expérience optimale.",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> et <a href=\"http://opera.com\">Opera</a> fonctionnent aussi.",
"Messages containing <span>keywords</span>": "Messages contenant des <span>mots-clés</span>",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s dans %(browserName)s sous %(osName)s",
"A new version of Riot is available.": "Une nouvelle version de Riot est disponible.",
"All Rooms": "Tous les salons",
"Cancel": "Annuler",
"Changelog": "Journal des modif.",
"Collecting app version information": "Récupération des info de version de lapplication",
"Collecting logs": "Récupération des traces",
"Describe your problem here.": "Décrivez votre problème ici.",
"Failed to send report: ": "Échec de lenvoi du rapport : ",
"Forward Message": "Transférer le message",
"Hide panel": "Cacher le panneau",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Afin de diagnostiquer le problème, les traces de ce client vont être envoyées avec ce rapport derreur. Si vous préférez seulement envoyer le texte ci-dessus, décochez la case :",
"Loading bug report module": "Chargement du module de rapport derreur",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Veuillez décrire le problème. Quavez-vous fait ? Quel comportement vous attendiez vous à voir ? Que sest-il effectivement passé ?",
"Please describe the bug and/or send logs.": "Veuillez décrire le problème et/ou envoyer les traces.",
"Report a bug": "Reporter un problème",
"Riot Desktop on %(platformName)s": "Version bureau de Riot sur %(platformName)s",
"Riot is not supported on mobile web. Install the app?": "Riot Web nest pas supporté sur mobile. Installer lapplication ?",
"Search": "Rechercher",
"Search…": "Rechercher…",
"Send": "Envoyer",
"Send logs": "Envoyer les traces",
"This Room": "Ce salon",
"Unavailable": "Indisponible",
"Unknown device": "Appareil inconnu",
"Update": "Mettre à jour",
"Uploading report": "Téléchargement du rapport",
"What's New": "Nouveautés",
"What's new?": "Nouveautés ?",
"Waiting for response from server": "En attente dune réponse du serveur",
"You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!": "Vous utilisez Riot en tant que visiteur. <a>Enregistrez vous</a> ou <a>identifiez vous</a> pour accéder à plus de salons et de fonctionnalités !",
"You need to be using HTTPS to place a screen-sharing call.": "Vous devez utiliser HTTPS pour effectuer un appel en partage décran.",
"OK": "OK"
}

131
src/i18n/strings/hu.json Normal file
View File

@@ -0,0 +1,131 @@
{
"Add an email address above to configure email notifications": "E-mail értesítés beállításához írd be az e-mail címed",
"Advanced notification settings": "Haladó értesítési beállítások",
"All messages": "Minden üzenet",
"All messages (loud)": "Minden üzenet (hangos)",
"All notifications are currently disabled for all targets.": "Minden céleszközön minden értesítés tiltva van.",
"An error occurred whilst saving your email notification preferences.": "Hiba történt az e-mail értesítés beállításánál.",
"Call invitation": "Hívás meghívó",
"Cancel Sending": "Küldés megszakítása",
"Can't update user notification settings": "Nem sikerül frissíteni az értesítési beállításokat",
"Close": "Bezár",
"Create new room": "Új szoba készítés",
"Couldn't find a matching Matrix room": "Nem található a keresett Matrix szoba",
"Custom Server Options": "Egyedi szerver beállítások",
"delete the alias.": "becenév törlése.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Törlöd a(z) %(alias)s szobát és kiveszed a könyvtárból ezt: %(name)s?",
"Direct Chat": "Közvetlen csevegés",
"Directory": "Könyvtár",
"Dismiss": "Eltűntet",
"Download this file": "Fájl letöltése",
"Drop here %(toAction)s": "%(toAction)s -t húzd ide",
"Enable audible notifications in web client": "Hallható értesítések engedélyezése a webes kliensben",
"Enable desktop notifications": "Asztali értesítések engedélyezése",
"Enable email notifications": "E-mail értesítések engedélyezése",
"Enable notifications for this account": "Értesítések engedélyezése a fiókhoz",
"Enable them now": "Engedélyezés most",
"Enter keywords separated by a comma:": "Kulcsszavak vesszővel elválasztva:",
"Error": "Hiba",
"Error saving email notification preferences": "Hiba email értesítés beállításának mentésénél",
"#example": "#példa",
"Failed to": "Nem lehet",
"Failed to add tag %(tagName)s to room": "Nem lehet a címkét hozzáadni a szobához: %(tagName)s",
"Failed to change settings": "Nem lehet a beállítást megváltoztatni",
"Failed to forget room %(errCode)s": "Nem lehet eltávolítani a szobát: %(errCode)s",
"Failed to update keywords": "Nem lehet a kulcsszavakat frissíteni",
"Failed to get protocol list from Home Server": "Nem lehet a protokoll listát lekérni a Saját szerverről",
"Failed to get public room list": "Nem lehet lekérdezni a nyílt szobák listáját",
"Failed to join the room": "Nem lehet csatlakozni a szobához",
"Failed to remove tag %(tagName)s from room": "Nem lehet törölni a(z) %(tagName)s címkét a szobáról",
"Failed to set direct chat tag": "Nem lehet a címkét beállítani a közvetlen beszélgetéshez",
"Failed to set Direct Message status of room": "Nem lehet beállítani a Közvetlen beszélgetés státuszt a szobához",
"Favourite": "Kedvenc",
"Fetching third party location failed": "Nem sikerült lekérdezni a harmadik felet",
"Files": "Fájlok",
"Filter room names": "Szoba nevek szűrése",
"Forget": "Elfelejt",
" from room": " szobából",
"Guests can join": "Vendégek csatlakozhatnak",
"Guest users can't invite users. Please register to invite.": "Vendég felhasználó nem küldhet meghívót. Kérlek regisztrálj meghívó küldéshez.",
"Invite to this room": "Meghívás a szobába",
"Keywords": "Kulcsszavak",
"Leave": "Elhagy",
"Low Priority": "Alacsony priorítás",
"Members": "Résztvevők",
"Mentions only": "Csak ha megemlítenek",
"Messages containing my display name": "Az üzenet tartalmazza a nevem",
"Messages containing my user name": "Az üzenet tartalmazza a felhasználói nevem",
"Messages in group chats": "Üzenetek a csoportszobában",
"Messages in one-to-one chats": "Üzenetek közvetlen beszélgetésekben",
"Messages sent by bot": "Botok által küldött üzenetek",
"more": "további",
"Mute": "Elnémít",
"No rooms to show": "Nincs megjeleníthető szoba",
"Noisy": "Hangos",
"Notification targets": "Értesítések célpontja",
"Notifications": "Értesítések",
"Notify for all other messages/rooms": "Értesítés minden más üzenethez/szobához",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a>val és <a href=\"http://opera.com\">Opera</a>val is működik.",
"Collapse panel": "Panel bezárása",
"customServer_text": "Egyedi Matrix szervert használhatsz a Saját szerver URL beállításával.<br/> Ezzel meglévő Matrix fiókot használhatsz Riot klienssel és egyedi szerverrel.<br/><br/>Beállíthatsz egyedi \"identity\" szervert de akkor nem tudsz e-maillel meghívni felhasználót és téged sem tudnak meghívni e-maillel.",
"Expand panel": "Panel kinyitása",
"I understand the risks and wish to continue": "Megértettem a kockázatot és folytatom",
"Notifications on the following keywords follow rules which cant be displayed here:": "A kulcsszavakhoz tartozó értesítések olyan szabályokat követnek amiket nem lehet itt megjeleníteni:",
"Notify me for anything else": "Értesíts minden egyéb esetben",
"Off": "Ki",
"On": "Be",
"Operation failed": "Művelet sikertelen",
"Permalink": "Állandó hivatkozás",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "A legjobb élmény érdekében telepíts <a href=\"https://www.google.com/chrome\">Chrome</a>ot vagy <a href=\"https://getfirefox.com\">Firefox</a>ot.",
"Please Register": "Regisztrálj",
"powered by Matrix": "Matrixon alapul",
"Quote": "Idézet",
"Redact": "Szerkeszt",
"Reject": "Elutasít",
"Remove %(name)s from the directory?": "Törlöd a %(name)s szobát a listából?",
"Remove": "Töröl",
"remove %(name)s from the directory.": "%(name)s szoba törlése a listából.",
"Remove from Directory": "Törlés a szobák listájából",
"Resend": "Újraküld",
"Riot does not know how to join a room on this network": "Riot nem tudja, hogy csatlakozzon ehhez a szobához ezen a hálózaton",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot sok haladó képességét használja a böngészőnek amik közül lehet, hogy nem mind érhető el a most használt böngészőben vagy még csak kísérleti jellegű.",
"Room directory": "Szobák listája",
"Room not found": "A szoba nem található",
"Search for a room": "Szoba keresése",
"Settings": "Beállítások",
"Source URL": "Forrás URL",
"Sorry, your browser is <b>not</b> able to run Riot.": "Elnézést, a böngésződ <b>nem</b> képes futtatni a Riotot.",
"Start chat": "Csevegés indítása",
"The Home Server may be too old to support third party networks": "A Saját szerver lehet, hogy túl régi ahhoz, hogy más hálózatokhoz tudjon kapcsolódni",
"There are advanced notifications which are not shown here": "Vannak haladó értesítések amik itt nincsenek megjelenítve",
"The server may be unavailable or overloaded": "A szerver nem érhető el vagy túl van terhelve",
"This room is inaccessible to guests. You may be able to join if you register.": "A szoba vendégek számára elérhetetlen. Csak regisztráció után tudsz csatlakozni.",
" to room": " szobába",
"Unable to fetch notification target list": "Nem sikerült letölteni az értesítési célok listáját",
"Unable to join network": "Nem sikerült kapcsolódni a hálózathoz",
"Unable to look up room ID from server": "Nem lehet lekérdezni a szoba ID-ját a szervertől",
"Unhide Preview": "Előkép felfedése",
"unknown error code": "ismeretlen hiba kód",
"Unnamed room": "Név nélküli szoba",
"Uploaded on %(date)s by %(user)s": "Feltöltés: %(date)s, %(user)s",
"View Decrypted Source": "Visszafejtett forrás megjelenítése",
"View Source": "Forrás megjelenítése",
"When I'm invited to a room": "Amikor meghívtak a szobába",
"World readable": "Mindenki olvashatja",
"You cannot delete this image. (%(code)s)": "Nem törölheted ezt a képet. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Nem törölheted ezt az üzenetet. (%(code)s)",
"You are not receiving desktop notifications": "Nem fogadsz asztali értesítéseket",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Valószínűleg Riottól eltérő klienssel állítottad be. Riotból nem állítható de érvényben van",
"Sunday": "Vasárnap",
"Monday": "Hétfő",
"Tuesday": "Kedd",
"Wednesday": "Szerda",
"Thursday": "Csütörtök",
"Friday": "Péntek",
"Saturday": "Szombat",
"Today": "Ma",
"Yesterday": "Tegnap",
"Welcome page": "Üdvözlő oldal",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "A jelenlegi bőngésződdel teljesen hibás lehet az alkalmazás kinézete és bizonyos funkciók, ha nem az összes, nem fog működni. Ha mindenképpen ki akarod próbálni, folytathatod de egyedül vagy minden felbukkanó problémával!",
"Messages containing <span>keywords</span>": "Az üzenet <span>kulcsszavakat</span> tartalmaz"
}

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

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

125
src/i18n/strings/nb_NO.json Normal file
View File

@@ -0,0 +1,125 @@
{
"Add an email address above to configure email notifications": "Legg til en epost adresse for å sette opp epost varsling",
"Advanced notification settings": "Avanserte varslingsinnstillinger",
"All messages": "Alle meldinger",
"All messages (loud)": "Alle meldinger (høy)",
"All notifications are currently disabled for all targets.": "Alle varsler er deaktivert for alle mottakere.",
"An error occurred whilst saving your email notification preferences.": "En feil oppsto i forbindelse med lagring av epost varsel innstillinger.",
"Cancel Sending": "Avbryt sending",
"Can't update user notification settings": "Kan ikke oppdatere brukervarsel innstillinger",
"Close": "Lukk",
"Create new room": "Opprett nytt rom",
"Couldn't find a matching Matrix room": "Kunne ikke finne et samsvarende Matrix rom",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> og <a href=\"http://opera.com\">Opera</a> fungerer også.",
"Call invitation": "Anropsinvitasjon",
"Collapse panel": "Skjul panel",
"Custom Server Options": "Tilpassede serveralternativer",
"customServer_text": "Du kan benytte de egendefinerte serveralternativene til å logge deg på andre Matrix-servere ved å spesifisere en annen Hjemmeserver-URL.<br/>Dette lar deg benytte Riot med en eksisterende Matrix konto på en annen hjemmeserver.<br/><br/>Du kan også angi en egendefinert identitetsserver, men du vil ikke kunne invitere brukere via e-post, eller bli invitert via e-post selv.",
"delete the alias.": "Slett aliaset.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Slett rom alias %(alias)s og fjern %(name)s fra katalogen?",
"Direct Chat": "Direkte Chat",
"Directory": "Katalog",
"Download this file": "Last ned filen",
"Drop here %(toAction)s": "Dra hit %(toAction)s",
"Enable audible notifications in web client": "Aktiver lyd-varsel i webklient",
"Enable desktop notifications": "Aktiver skrivebordsvarsler",
"Enable email notifications": "Aktiver e-postvarsler",
"Enable notifications for this account": "Aktiver varsler for denne konto",
"Enable them now": "Aktiver dem nå",
"Enter keywords separated by a comma:": "Angi nøkkelord adskilt med komma:",
"Error": "Feil",
"Error saving email notification preferences": "Feil ved lagring av e-postvarselinnstillinger",
"#example": "#eksempel",
"Expand panel": "Utvid panel",
"Failed to": "Feilet å",
"Failed to add tag %(tagName)s to room": "Kunne ikke legge til tagg %(tagName)s til rom",
"Failed to change settings": "Kunne ikke endre innstillingene",
"Failed to forget room %(errCode)s": "Kunne ikke glemme rommet %(errCode)s",
"Failed to update keywords": "Kunne ikke oppdatere nøkkelord",
"Failed to get protocol list from Home Server": "Kunne ikke hente protokolliste fra Hjemme-Server",
"Failed to get public room list": "Kunne ikke hente offentlig romliste",
"Failed to join the room": "Kunne ikke bli med på rommet",
"Failed to remove tag %(tagName)s from room": "Kunne ikke fjerne tagg %(tagName)s fra rommet",
"Failed to set direct chat tag": "Kunne ikke angi direkte chat-tagg",
"Failed to set Direct Message status of room": "Kunne ikke angi status for direkte melding i rommet",
"Favourite": "Favoritt",
"Fetching third party location failed": "Kunne ikke hente tredjeparts lokalisering",
"Files": "Filer",
"Filter room names": "Filtrer romnavn",
"Forget": "Glem",
" from room": " fra rommet",
"Guests can join": "Gjester kan bli med",
"Guest users can't invite users. Please register to invite.": "Gjester kan ikke invitere brukere. Vennligst registrer deg for å invitere.",
"I understand the risks and wish to continue": "Jeg forstår risikoen og ønsker å fortsette",
"Invite to this room": "Inviter til dette rommet",
"Keywords": "Nøkkelord",
"Leave": "Forlat",
"Low Priority": "Lav Prioritet",
"Members": "Medlemmer",
"Messages containing my display name": "Meldinger som inneholder mitt visningsnavn",
"Messages containing my user name": "Meldinger som inneholder mitt brukernavn",
"Messages in group chats": "Meldinger i gruppesamtaler",
"Messages in one-to-one chats": "Meldinger i en-til-en samtaler",
"Messages sent by bot": "Meldinger sendt av bot",
"more": "mer",
"No rooms to show": "Ingen rom å vise",
"Noisy": "Bråkete",
"Notification targets": "Mål for varsel",
"Notifications": "Varsler",
"Notifications on the following keywords follow rules which cant be displayed here:": "Varsler på de følgende nøkkelordene følger regler som ikke kan vises her:",
"Notify for all other messages/rooms": "Varsler om alle andre meldinger/rom",
"Notify me for anything else": "Varsle meg om alt annet",
"Off": "Av",
"On": "På",
"Permalink": "Permanent lenke",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Vennligst installer <a href=\"https://www.google.com/chrome\">Chrome</a> eller <a href=\"https://getfirefox.com\">Firefox</a> for den beste opplevelsen.",
"Please Register": "Vennligst registrer deg",
"powered by Matrix": "benytter seg av Matrix",
"Quote": "Sitat",
"Redact": "Maskere",
"Reject": "Avvis",
"Remove %(name)s from the directory?": "Fjern %(name)s fra katalogen?",
"Remove": "Fjern",
"remove %(name)s from the directory.": "fjern %(name)s fra katalogen.",
"Remove from Directory": "Fjern fra katalogen",
"Resend": "Send på nytt",
"Riot does not know how to join a room on this network": "Riot vet ikke hvordan man kan komme inn på et rom på dette nettverket",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot benytter mange avanserte nettleserfunksjoner, og noen av disse er ikke tilgjengelige eller er eksperimentelle på din nåværende nettleser.",
"Room directory": "Rom katalog",
"Room not found": "Rommet ble ikke funnet",
"Search for a room": "Søk etter et rom",
"Settings": "Innstillinger",
"Source URL": "Kilde URL",
"Sorry, your browser is <b>not</b> able to run Riot.": "Beklager, din nettleser er <b>ikke</b> i stand til å kjøre Riot.",
"Start chat": "Start chat",
"The Home Server may be too old to support third party networks": "Hjemme-serveren kan være for gammel til å støtte tredjeparts-nettverk",
"There are advanced notifications which are not shown here": "Det er avanserte varsler som ikke vises her",
"The server may be unavailable or overloaded": "Serveren kan være utilgjengelig eller overbelastet",
"This room is inaccessible to guests. You may be able to join if you register.": "Dette rommet er ikke tilgjengelig for gjester. Du kan kanskje komme inn om du registrerer deg.",
" to room": " til rom",
"Unable to fetch notification target list": "Kunne ikke hente varsel-mål liste",
"Unable to join network": "Kunne ikke bli med i nettverket",
"Unable to look up room ID from server": "Kunne ikke slå opp rom-ID fra serveren",
"Unhide Preview": "Vis forhåndsvisning",
"unknown error code": "ukjent feilkode",
"Unnamed room": "Rom uten navn",
"Uploaded on %(date)s by %(user)s": "Lastet opp den %(date)s av %(user)s",
"View Decrypted Source": "Vis dekryptert kilde",
"View Source": "Vis kilde",
"When I'm invited to a room": "Når jeg blir invitert til et rom",
"World readable": "Verden lesbar",
"You cannot delete this image. (%(code)s)": "Du kan ikke slette dette bildet. (%(code)s)",
"You cannot delete this message. (%(code)s)": "Du kan ikke slette denne meldingen. (%(code)s)",
"You are not receiving desktop notifications": "Du mottar ikke skrivebords varsler",
"Messages containing <span>keywords</span>": "Meldinger som inneholder <span>nøkkelord</span>",
"Sunday": "Søndag",
"Monday": "Mandag",
"Tuesday": "Tirsdag",
"Wednesday": "Onsdag",
"Thursday": "Torsdag",
"Friday": "Fredag",
"Saturday": "Lørdag",
"Today": "I dag",
"Yesterday": "I går",
"Welcome page": "Velkomst side"
}

122
src/i18n/strings/nl.json Normal file
View File

@@ -0,0 +1,122 @@
{
"Add an email address above to configure email notifications": "Voeg een email adres toe om email notificaties te ontvangen",
"Advanced notification settings": "Geavanceerde notificatie instellingen",
"All messages": "Alle berichten",
"All messages (loud)": "Alle berichten (luid)",
"All notifications are currently disabled for all targets.": "Alle notificaties zijn op het moment uitgeschakeld voor alle doelen.",
"An error occurred whilst saving your email notification preferences.": "Er is een fout ontstaan tijdens het opslaan van jouw email notificatie voorkeuren.",
"Call invitation": "Audio gesprek uitnodiging",
"Cancel Sending": "Annuleren verzending",
"Can't update user notification settings": "Het is niet gelukt om de gebruiker notificatie instellingen bij te werken",
"Close": "Sluiten",
"Create new room": "Maak een nieuwe kamer",
"Couldn't find a matching Matrix room": "Het is niet gelukt om een bijbehorende Matrix kamer te vinden",
"Custom Server Options": "Aangepaste server instellingen",
"customServer_text": "Je kunt de aangepaste server instellingen gebruiken om in te loggen bij andere Matrix servers door een andere home server URL in te voeren.<br/>Dit maakt het mogelijk om Riot te gebruiken met een bestaand Matrix account op een andere home server.<br/><br/>Je kunt ook een aangepaste identiteit server instellen, maar het is dan niet mogelijk om gebruikers uit te nodigen met behulp van een email adres of zelf uitgenodigt te worden met een email adres.",
"delete the alias.": "verwijder de alias.",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "Verwijder de alias %(alias)s en verwijder %(name)s uit de map?",
"Direct Chat": "Privé gesprek",
"Directory": "Kamer lijst",
"Dismiss": "Afwijzen",
"Download this file": "Download dit bestand",
"Enable audible notifications in web client": "Zet notificaties aan in de web client",
"Enable desktop notifications": "Zet desktop notificaties aan",
"Enable email notifications": "Zet email notificaties aan",
"Enable notifications for this account": "Zet notificaties aan voor dit account",
"Enable them now": "Zet ze nu aan",
"Enter keywords separated by a comma:": "Voeg trefwoorden toe, gesplitst door een komma:",
"Error": "Fout",
"Error saving email notification preferences": "Fout bij het opslaan van de email notificatie voorkeuren",
"#example": "#voorbeeld",
"Failed to": "Mislukt om",
"Failed to add tag %(tagName)s to room": "Mislukt om de label %(tagName)s aan de kamer toe te voegen",
"Failed to change settings": "Het is mislukt om de instellingen te wijzigen",
"Failed to forget room %(errCode)s": "Het is mislukt om de kamer te vergeten %(errCode)s",
"Failed to update keywords": "Het is mislukt om de trefwoorden bij te werken",
"Failed to get protocol list from Home Server": "Het is mislukt om de protocol lijst op te halen van de home server",
"Failed to get public room list": "Het is mislukt om de lijst van publieke kamers op te halen",
"Failed to join the room": "Het is mislukt om de kamer toe te treden",
"Failed to remove tag %(tagName)s from room": "Het is mislukt om de label %(tagName)s van de kamer te verwijderen",
"Failed to set direct chat tag": "Het is mislukt om de privé chat label weg te halen",
"Favourite": "Favoriet",
"Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt",
"Files": "Bestanden",
"Filter room names": "Filter kamer namen",
"Forget": "Vergeten",
" from room": " van kamer",
"Guests can join": "Gasten kunnen toe treden",
"Guest users can't invite users. Please register to invite.": "Gasten kunnen geen gebruikers uitnodigen. Om anderen uit te nodigen zult u moeten registreren.",
"Invite to this room": "Uitnodigen voor deze kamer",
"Keywords": "Trefwoorden",
"Leave": "Verlaten",
"Low Priority": "Lage prioriteit",
"Members": "Leden",
"Mentions only": "Alleen vermeldingen",
"Messages containing my display name": "Berichten die mijn weergavenaam bevatten",
"Messages containing my user name": "Berichten die mijn gebruikersnaam bevatten",
"Messages in group chats": "Berichten in groep gesprekken",
"Messages in one-to-one chats": "Berichten in één-op-één gesprekken",
"Messages sent by bot": "Berichten verzonden bij een bot",
"more": "meer",
"Mute": "Dempen",
"No rooms to show": "Geen kamers om te laten zien",
"Noisy": "Luidruchtig",
"Notification targets": "Notificatie doelen",
"Notifications": "Notificaties",
"Notifications on the following keywords follow rules which cant be displayed here:": "Notificaties op de volgende trefwoorden volgen regels die hier niet kunnen worden laten zien:",
"Notify for all other messages/rooms": "Informeer mij voor alle andere berichten/kamers",
"Notify me for anything else": "Informeer mij voor al het andere",
"Off": "Uit",
"On": "Aan",
"Operation failed": "Actie mislukt",
"Permalink": "Permalink",
"Please Register": "Registreer alsjeblieft",
"powered by Matrix": "aangedreven door Matrix",
"Quote": "Quote",
"Reject": "Afwijzen",
"Remove %(name)s from the directory?": "Verwijder %(name)s uit de kamer lijst?",
"Remove": "Verwijder",
"remove %(name)s from the directory.": "verwijder %(name)s uit de kamer lijst.",
"Remove from Directory": "Verwijder uit de kamer lijst",
"Resend": "Opnieuw verzenden",
"Riot does not know how to join a room on this network": "Riot weet niet hoe het moet toetreden tot een kamer op dit netwerk",
"Room directory": "Kamer lijst",
"Room not found": "De kamer is niet gevonden",
"Search for a room": "Zoek naar een kamer",
"Settings": "Instellingen",
"Source URL": "Bron URL",
"Start chat": "Start gesprek",
"The Home Server may be too old to support third party networks": "De home server is misschien te oud om netwerken van derde partijen te ondersteunen",
"There are advanced notifications which are not shown here": "Er zijn geavanceerde notificaties die hier niet worden laten zien",
"The server may be unavailable or overloaded": "De server is misschien niet beschikbaar of overbeladen",
"This room is inaccessible to guests. You may be able to join if you register.": "Deze kamer is niet toegankelijk voor gasten. Je zou misschien toe kunnen treden als je geregistreerd bent.",
" to room": " naar kamer",
"Unable to fetch notification target list": "Het is mislukt om de lijst van notificatie doelen op te halen",
"Unable to join network": "Het is mislukt om toe te treden tot dit netwerk",
"Unable to look up room ID from server": "Het is mislukt om de kamer ID op te halen van de server",
"Unhide Preview": "Zichtbaar maken preview",
"unknown error code": "niet bekende foutcode",
"Unnamed room": "Kamer zonder naam",
"Uploaded on %(date)s by %(user)s": "Geüpload op %(date)s door %(user)s",
"View Decrypted Source": "Bekijk gedecodeerde bron",
"View Source": "Bekijk bron",
"When I'm invited to a room": "Wanneer ik uitgenodigt wordt naar een kamer",
"World readable": "Door iedereen leesbaar",
"You cannot delete this image. (%(code)s)": "Je kunt deze afbeelding niet verwijderen. (%code)s)",
"You cannot delete this message. (%(code)s)": "Je kunt dit bericht niet verwijderen. (%(code)s)",
"You are not receiving desktop notifications": "Je ontvangt momenteel geen desktop notificaties",
"You might have configured them in a client other than Riot. You cannot tune them in Riot but they still apply": "Je hebt ze mogelijk ingesteld in een andere client dan Riot. Je kunt ze niet aanpassen in Riot maar ze zijn wel actief",
"Sunday": "Zondag",
"Monday": "Maandag",
"Tuesday": "Dinsdag",
"Wednesday": "Woensdag",
"Thursday": "Donderdag",
"Friday": "Vrijdag",
"Saturday": "Zaterdag",
"Today": "Vandaag",
"Yesterday": "Gisteren",
"Welcome page": "Welkom pagina",
"Drop here %(toAction)s": "%(toAction)s hier naar toe verplaatsen",
"Failed to set Direct Message status of room": "Het is mislukt om de directe berichten status van de kamer in te stellen",
"Redact": "Redigeren"
}

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

@@ -0,0 +1 @@
{}

166
src/i18n/strings/pt.json Normal file
View File

@@ -0,0 +1,166 @@
{
"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)",
"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 para Servidor Personalizado",
"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 %(name)s da lista pública?",
"Direct Chat": "Conversa pessoal",
"Directory": "Diretório",
"Dismiss": "Descartar",
"Download this file": "Baixar este arquivo",
"Drop here %(toAction)s": "Arraste aqui para %(toAction)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",
"Forward Message": "Encaminhar",
" 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": "rodando a partir do 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",
"#example": "#exemplo",
"Failed to remove tag %(tagName)s from room": "Não foi possível remover a marcação %(tagName)s desta sala",
"Welcome page": "Página de boas vindas",
"Advanced notification settings": "Configurações avançadas de notificação",
"customServer_text": "Você pode usar as opções de servidor personalizado para entrar em outros servidores Matrix, especificando uma URL de outro Servidor de Base.<br/> Isso permite que você use Riot com uma conta Matrix que exista em outro Servidor de Base.<br/> <br/> Você também pode configurar um servidor de Identidade personalizado, mas neste caso não poderá convidar usuárias(os) pelo endereço de e-mail, ou ser convidado(a) pelo seu endereço de e-mail.",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> e <a href=\"http://opera.com\">Opera</a> funcionam também.",
"All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os casos.",
"Collapse panel": "Colapsar o painel",
"Expand panel": "Expandir o painel",
"I understand the risks and wish to continue": "Entendo os riscos e desejo continuar",
"Messages containing <span>keywords</span>": "Mensagens contendo <span>palavras-chave</span>",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Chrome</a> ou <a href=\"https://getfirefox.com\">Firefox</a> para ter a melhor experiência de uso.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.",
"Sorry, your browser is <b>not</b> able to run Riot.": "Perdão. O seu navegador <b>não</b> é capaz de rodar o Riot.",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s em %(osName)s",
"A new version of Riot is available.": "Uma nova versão do Riot está disponível.",
"All Rooms": "Todas as salas",
"Cancel": "Cancelar",
"Changelog": "Histórico de alterações",
"Collecting app version information": "Coletando informação sobre a versão do app",
"Collecting logs": "Coletando logs",
"Describe your problem here.": "Descreva o seu problema aqui.",
"Failed to send report: ": "Falha ao enviar o relatório: ",
"Hide panel": "Ocultar o painel",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Para diagnosticar problemas, relatórios deste cliente serão enviados junto a esta notificação de falha. Se você prefere apenas enviar o seu texto acima, por favor des-selecione:",
"Loading bug report module": "Carregando o módulo de relatórios de erros",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Por favor, descreva a falha encontrada. O que você estava fazendo? O que você esperava que devia ocorrer? E o que aconteceu efetivamente?",
"Please describe the bug and/or send logs.": "Por favor, descreva as falhas e/ou envie os logs de erro.",
"Report a bug": "Reportar uma falha",
"Riot Desktop on %(platformName)s": "Riot para computadores desktop em %(platformName)s",
"Riot is not supported on mobile web. Install the app?": "Riot versão web não é suportado a partir de celular. Quer instalar o app para celular?",
"Search": "Buscar",
"Search…": "Buscar…",
"Send": "Enviar",
"Send logs": "Enviar relatórios de erro",
"This Room": "Esta sala",
"Unavailable": "Indisponível",
"Unknown device": "Dispositivo desconhecido",
"Update": "Atualizar",
"Uploading report": "Enviando o relatório",
"What's New": "Novidades",
"What's new?": "O que há de novidades?",
"Waiting for response from server": "Esperando por resposta do servidor",
"You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!": "Você está usando o Riot como visitante. <a>Registre-se</a> ou <a>faça login</a> para acessar mais salas e funcionalidades!",
"OK": "Ok",
"You need to be using HTTPS to place a screen-sharing call.": "Você precisa estar usando HTTPS para poder iniciar uma chamada com compartilhamento de tela."
}

166
src/i18n/strings/pt_BR.json Normal file
View File

@@ -0,0 +1,166 @@
{
"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)",
"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 para Servidor Personalizado",
"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 %(name)s da lista pública?",
"Direct Chat": "Conversa pessoal",
"Directory": "Diretório",
"Dismiss": "Descartar",
"Download this file": "Baixar este arquivo",
"Drop here %(toAction)s": "Arraste aqui para %(toAction)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",
"Forward Message": "Encaminhar",
" 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": "rodando a partir do 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",
"#example": "#exemplo",
"Failed to remove tag %(tagName)s from room": "Não foi possível remover a marcação %(tagName)s desta sala",
"Welcome page": "Página de boas vindas",
"Advanced notification settings": "Configurações avançadas de notificação",
"customServer_text": "Você pode usar as opções de servidor personalizado para entrar em outros servidores Matrix, especificando uma URL de outro Servidor de Base.<br/> Isso permite que você use Riot com uma conta Matrix que exista em outro Servidor de Base.<br/> <br/> Você também pode configurar um servidor de Identidade personalizado, mas neste caso não poderá convidar usuárias(os) pelo endereço de e-mail, ou ser convidado(a) pelo seu endereço de e-mail.",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> e <a href=\"http://opera.com\">Opera</a> funcionam também.",
"All notifications are currently disabled for all targets.": "Todas as notificações estão atualmente desabilitadas para todos os casos.",
"Collapse panel": "Colapsar o painel",
"Expand panel": "Expandir o painel",
"I understand the risks and wish to continue": "Entendo os riscos e desejo continuar",
"Messages containing <span>keywords</span>": "Mensagens contendo <span>palavras-chave</span>",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Por favor instale <a href=\"https://www.google.com/chrome\">Chrome</a> ou <a href=\"https://getfirefox.com\">Firefox</a> para ter a melhor experiência de uso.",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "O Riot usa muitas funcionalidades avançadas do navegador, algumas das quais não estão disponíveis ou ainda são experimentais no seu navegador atual.",
"Sorry, your browser is <b>not</b> able to run Riot.": "Perdão. O seu navegador <b>não</b> é capaz de rodar o Riot.",
"With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Com o seu navegador atual, a aparência e sensação de uso da aplicação podem estar completamente incorretas, e algumas das funcionalidades poderão não funcionar. Se você quiser tentar de qualquer maneira, pode continuar, mas aí vai ter que se virar sozinho(a) com os problemas que porventura encontrar!",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s em %(osName)s",
"A new version of Riot is available.": "Uma nova versão do Riot está disponível.",
"All Rooms": "Todas as salas",
"Cancel": "Cancelar",
"Changelog": "Histórico de alterações",
"Collecting app version information": "Coletando informação sobre a versão do app",
"Collecting logs": "Coletando logs",
"Describe your problem here.": "Descreva o seu problema aqui.",
"Failed to send report: ": "Falha ao enviar o relatório: ",
"Hide panel": "Ocultar o painel",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "Para diagnosticar problemas, relatórios deste cliente serão enviados junto a esta notificação de falha. Se você prefere apenas enviar o seu texto acima, por favor des-selecione:",
"Loading bug report module": "Carregando o módulo de relatórios de erros",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Por favor, descreva a falha encontrada. O que você estava fazendo? O que você esperava que devia ocorrer? E o que aconteceu efetivamente?",
"Please describe the bug and/or send logs.": "Por favor, descreva as falhas e/ou envie os logs de erro.",
"Report a bug": "Reportar uma falha",
"Riot Desktop on %(platformName)s": "Riot para computadores desktop em %(platformName)s",
"Riot is not supported on mobile web. Install the app?": "Riot versão web não é suportado a partir de celular. Quer instalar o app para celular?",
"Search": "Buscar",
"Search…": "Buscar…",
"Send": "Enviar",
"Send logs": "Enviar relatórios de erro",
"This Room": "Esta sala",
"Unavailable": "Indisponível",
"Unknown device": "Dispositivo desconhecido",
"Update": "Atualizar",
"Uploading report": "Enviando o relatório",
"What's New": "Novidades",
"What's new?": "O que há de novidades?",
"Waiting for response from server": "Esperando por resposta do servidor",
"You are Rioting as a guest. <a>Register</a> or <a>sign in</a> to access more rooms and features!": "Você está usando o Riot como visitante. <a>Registre-se</a> ou <a>faça login</a> para acessar mais salas e funcionalidades!",
"OK": "Ok",
"You need to be using HTTPS to place a screen-sharing call.": "Você precisa estar usando HTTPS para poder iniciar uma chamada com compartilhamento de tela."
}

129
src/i18n/strings/ru.json Normal file
View File

@@ -0,0 +1,129 @@
{
"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.": "Возникла ошибка при сохранении настроек оповещения по электронной почте.",
"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": "Включить оповещения по электронной почте",
"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 ": "Не удалось добавить тег ",
"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": "Здесь расширенные уведомления, которые здесь не показаны",
"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 %(toAction)s": "Вставить сюда для %(toAction)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 %(tagName)s from room": "Не удалось убрать пометку %(tagName)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": "Домашняя страница",
"Advanced notification settings": "Настройки уведомлений",
"Call invitation": "Звонок",
"customServer_text": "Вы можете войти с помощью вашего сервера.<br/>Это позволяет вам использовать Riot с уже существующей учетной записью на другом сервере.<br/><br/>Вы также можете задать свой сервер идентификации, но тогда вы не можете приглашать пользователей с помощью email-адреса и не можете быть приглашены по нему.",
"Messages containing my display name": "Сообщения, содержащие мое отображаемое имя",
"Messages containing my user name": "Сообщение, содержащие мое имя пользователя",
"Messages in group chats": "Сообщения в групповых чатах",
"Messages in one-to-one chats": "Сообщения в приватных чатах",
"Messages sent by bot": "Сообщения, отправленные ботом",
"more": "больше",
"When I'm invited to a room": "Когда я приглашен в комнату"
}

119
src/i18n/strings/sv.json Normal file
View File

@@ -0,0 +1,119 @@
{
"Add an email address above to configure email notifications": "Lägg till en epostadress här för att konfigurera epostaviseringar",
"Advanced notification settings": "Avancerade aviseringsinställingar",
"All messages": "Alla meddelanden",
"All messages (loud)": "Alla meddelanden (högljudd)",
"All notifications are currently disabled for all targets.": "Alla aviseringar är för tillfället avstängda för alla mål.",
"An error occurred whilst saving your email notification preferences.": "Ett fel uppstod då epostaviseringsinställningarna sparades.",
"Call invitation": "Inbjudan till samtal",
"Cancel Sending": "Avbryt sändning",
"Can't update user notification settings": "Kan inte uppdatera aviseringsinställningarna",
"Close": "Stäng",
"Create new room": "Nytt rum",
"Couldn't find a matching Matrix room": "Kunde inte hitta ett matchande Matrix-rum",
"Custom Server Options": "Egna serverinställningar",
"customServer_text": "Du kan använda serverinställningarna för att logga in i en annan Matrix-server genom att specifiera en URL till en annan hemserver.<br/>Så här kan du använda Riot med ett existerande Matrix-konto på en annan hemserver.<br/><br/>Du kan också specifiera en egen identitetsserver, men du kommer inte att kunna bjuda in andra via epostadress, eller bli inbjuden via epostadress.",
"delete the alias.": "radera adressen.",
"Direct Chat": "Direkt chatt",
"Directory": "Katalog",
"Dismiss": "Avvisa",
"Download this file": "Ladda ner filen",
"Drop here %(toAction)s": "Dra hit för att %(toAction)s",
"Enable audible notifications in web client": "Sätt på högljudda aviseringar i webbklienten",
"Enable desktop notifications": "Sätt på skrivbordsaviseringar",
"Enable email notifications": "Sätt på epostaviseringar",
"Enable notifications for this account": "Sätt på aviseringar för det här kontot",
"Enable them now": "Sätt på nu",
"Enter keywords separated by a comma:": "Skriv in nyckelord, separerade med kommatecken:",
"Error": "Fel",
"Error saving email notification preferences": "Ett fel uppstod då epostaviseringsinställningarna sparades",
"Failed to": "Det gick inte att",
"Failed to add tag %(tagName)s to room": "Det gick inte att lägga till \"%(tagName)s\" till rummet",
"Failed to change settings": "Det gick inte att spara inställningarna",
"Failed to forget room %(errCode)s": "Det gick inte att glömma bort rummet: %(errCode)s",
"Failed to update keywords": "Det gick inte att uppdatera nyckelorden",
"Failed to get protocol list from Home Server": "Det gick inte att hämta protokollistan från hemservern",
"Failed to get public room list": "Det gick inte att hämta listan över offentliga rum",
"Failed to join the room": "Det gick inte att ansluta till rummet",
"Failed to remove tag %(tagName)s from room": "Det gick inte att radera taggen %(tagName)s från rummet",
"Failed to set direct chat tag": "Det gick inte att markera rummet som direkt chatt",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s via %(browserName)s på %(osName)s",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> och <a href=\"http://opera.com\">Opera</a> fungerar också.",
"A new version of Riot is available.": "En ny version av Riot är tillgänglig.",
"All Rooms": "Alla rum",
"Cancel": "Avbryt",
"Changelog": "Ändringslogg",
"Collapse panel": "Kollapsa panel",
"Describe your problem here.": "Beskriv problemet här.",
"Expand panel": "Öppna panel",
"Failed to send report: ": "Det gick inte att sända rapporten: ",
"Failed to set Direct Message status of room": "Det gick inte att sätta Direkt meddelande-status på rummet",
"Favourite": "Favorit",
"Files": "Filer",
"Filter room names": "Filtrera rumsnamn",
"Forget": "Glöm bort",
"Forward Message": "Vidarebefordra meddelande",
" from room": " från rum",
"Guests can join": "Gäster kan bli medlem i rummet",
"Guest users can't invite users. Please register to invite.": "Gäster kan inte skicka inbjudningar. Registrera dig för att bjuda in andra.",
"Hide panel": "Göm panel",
"I understand the risks and wish to continue": "Jag förstår riskerna och vill fortsätta",
"In order to diagnose problems, logs from this client will be sent with this bug report. If you would prefer to only send the text above, please untick:": "För att diagnostisera problem kommer loggar från den här klienten att sändas med rapporten. Om du bara vill sända texten ovan, kryssa av rutan:",
"Invite to this room": "Bjud in i rummet",
"Keywords": "Nyckelord",
"Leave": "Lämna",
"Loading bug report module": "Laddar buggrapportsmodul",
"Low Priority": "Låg prioritet",
"Members": "Medlemmar",
"Mentions only": "Endast omnämnande",
"Messages containing my display name": "Meddelanden som innehåller mitt namn",
"Messages containing <span>keywords</span>": "Meddelanden som innehåller <span>nyckelord</span>",
"Messages containing my user name": "Meddelanden som innehåller mitt användarnamn",
"Messages in group chats": "Meddelanden i gruppchattar",
"Messages in one-to-one chats": "Meddelanden i privata chattar",
"Messages sent by bot": "Meddelanden från bottar",
"more": "mera",
"Mute": "Dämpa",
"No rooms to show": "Inga fler rum att visa",
"Noisy": "Högljudd",
"Notification targets": "Aviseringsmål",
"Notifications": "Aviseringar",
"Notify for all other messages/rooms": "Avisera för alla andra meddelanden/rum",
"Notify me for anything else": "Avisera för allt annat",
"Off": "Av",
"On": "På",
"Permalink": "Permalink",
"Please describe the bug. What did you do? What did you expect to happen? What actually happened?": "Beskriv buggen. Vad gjorde du? Vad förväntade du dig att ska hända? Vad hände?",
"Please describe the bug and/or send logs.": "Beskriv buggen och/eller sänd loggar.",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "Installera <a href=\"https://www.google.com/chrome\">Chrome</a> eller <a href=\"https://getfirefox.com\">Firefox</a> för den bästa upplevelsen.",
"Please Register": "Registrera dig",
"powered by Matrix": "drivs av Matrix",
"Quote": "Citera",
"Redact": "Dra tillbaka",
"Reject": "Avvisa",
"Remove %(name)s from the directory?": "Ta bort %(name)s från katalogen?",
"Remove": "Ta bort",
"remove %(name)s from the directory.": "ta bort %(name)s från katalogen.",
"Remove from Directory": "Ta bort från katalogen",
"Report a bug": "Rapportera en bugg",
"Resend": "Sänd igen",
"Riot Desktop on %(platformName)s": "Riot Desktop på %(platformName)s",
"Riot does not know how to join a room on this network": "Riot kan inte gå med i ett rum på det här nätverket",
"Riot is not supported on mobile web. Install the app?": "Riot stöds inte på mobil-webb. Installera appen?",
"Riot uses many advanced browser features, some of which are not available or experimental in your current browser.": "Riot använder flera avancerade webbläsaregenskaper, av vilka alla inte stöds eller är experimentella i din nuvarande webbläsare.",
"Room directory": "Rumskatalog",
"Room not found": "Rummet hittades inte",
"Search": "Sök",
"Search…": "Sök…",
"Search for a room": "Sök efter rum",
"Send": "Sänd",
"Send logs": "Sänd loggar",
"Settings": "Inställningar",
"Source URL": "Käll-URL",
"Sorry, your browser is <b>not</b> able to run Riot.": "Beklagar, din webbläsare kan <b>inte</b> köra Riot.",
"Start chat": "Starta chatt",
"The Home Server may be too old to support third party networks": "Hemservern kan vara för gammal för stöda tredje parters nätverk",
"There are advanced notifications which are not shown here": "Det finns avancerade aviseringar som inte visas här",
"The server may be unavailable or overloaded": "Servern kan vara överbelastad eller inte tillgänglig",
"This Room": "Det här rummet"
}

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

@@ -0,0 +1 @@
{}

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

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1,149 @@
{
"Direct Chat": "私聊",
"Drop here %(toAction)s": "拖拽到這里 %(toAction)s",
"Error": "錯誤",
"Failed to forget room %(errCode)s": "無法忘記聊天室 %(errCode)s",
"Failed to join the room": "無法加入此聊天室",
"Favourite": "收藏",
"Search": "搜索",
"Settings": "設置",
"%(appName)s via %(browserName)s on %(osName)s": "%(appName)s 透過 %(browserName)s 在 %(osName)s",
"<a href=\"http://apple.com/safari\">Safari</a> and <a href=\"http://opera.com\">Opera</a> work too.": "<a href=\"http://apple.com/safari\">Safari</a> 與 <a href=\"http://opera.com\">Opera</a> 也能使用。",
"Advanced notification settings": "進階通知設定",
"All messages": "所有訊息",
"All messages (loud)": "所有訊息 (loud)",
"All Rooms": "所有的聊天室",
"Call invitation": "通話邀請",
"Cancel": "取消",
"Cancel Sending": "取消傳送",
"Can't update user notification settings": "無法更新用戶的通知設定",
"Changelog": "變更記錄",
"Close": "關閉",
"Collapse panel": "閤上面版",
"Collecting logs": "收集記錄",
"Create new room": "開設新聊天室",
"Couldn't find a matching Matrix room": "不能找到符合 Matrix 的聊天室",
"Custom Server Options": "自定伺服器選項",
"delete the alias.": "刪除別名",
"Describe your problem here.": "在此描述你的問題",
"Directory": "目錄",
"Dismiss": "無視",
"Download this file": "下載這個檔案",
"Enable desktop notifications": "啟用桌面通知",
"Enable email notifications": "啟用電郵通知",
"Enable notifications for this account": "本帳號啟用通知",
"Enable them now": "現在啟用它們",
"#example": "#例子",
"Expand panel": "擴充面版",
"Failed to": "失敗於",
"Failed to change settings": "變更設定失敗",
"Failed to update keywords": "無法更新關鍵字",
"Members": "成員",
"Mentions only": "只有提到",
"Messages containing my display name": "訊息中有包含我的顯示名稱",
"Messages containing <span>keywords</span>": "訊息包含 <span>關鍵字</span>",
"Messages containing my user name": "訊息中有我的用戶名",
"Messages in group chats": "在群組聊天中的訊息",
"Messages in one-to-one chats": "在一對一聊天中的訊息",
"Messages sent by bot": "由機器人送出的訊息",
"more": "更多",
"Mute": "靜音",
"No rooms to show": "無聊天室可顯示",
"Noisy": "吵鬧",
"Notifications": "通知",
"Off": "關閉",
"On": "開啟",
"Operation failed": "操作失敗",
"powered by Matrix": "由Matrix架設",
"Quote": "引述",
"Remove": "移除",
"Resend": "重新送出",
"Room directory": "聊天室目錄",
"Room not found": "未找到聊天室",
"Search…": "搜尋...",
"Search for a room": "搜尋聊天室",
"Send": "送出",
"Send logs": "送出記錄",
"Source URL": "來源網址",
"Start chat": "開始聊天",
"This Room": "這個聊天室",
"This room is inaccessible to guests. You may be able to join if you register.": "這個聊天室不對訪客開放,要加入須先註冊。",
" to room": "到聊天室",
"Unable to join network": "無法加入網路",
"Unable to look up room ID from server": "無法從伺服器找到聊天室 ID",
"Unavailable": "無法取得",
"Unhide Preview": "不隱藏預覽",
"Unknown device": "不知名的設備",
"unknown error code": "未知的錯誤代碼",
"Unnamed room": "無名的聊天室",
"Update": "更新",
"Uploaded on %(date)s by %(user)s": "由 %(user)s 在 %(date)s 更新",
"Uploading report": "上傳報告",
"View Decrypted Source": "檢示解密的來源",
"View Source": "檢示來源",
"What's New": "新鮮事",
"What's new?": "有什麼新聞?",
"Waiting for response from server": "等候來自伺服器的回應",
"When I'm invited to a room": "當我被邀請加入聊天室",
"You cannot delete this message. (%(code)s)": "你不能刪除這個訊息 (%(code)s)",
"Sunday": "星期日",
"Monday": "星期一",
"Tuesday": "星期二",
"Wednesday": "星期三",
"Thursday": "星期四",
"Friday": "星期五",
"Saturday": "星期六",
"Today": "今天",
"Yesterday": "昨天",
"OK": "OK",
"You need to be using HTTPS to place a screen-sharing call.": "你需要使用 HTTPS 來置放畫面分享的通話。",
"Welcome page": "歡迎頁",
"A new version of Riot is available.": " Riot 發佈了新版本",
"Add an email address above to configure email notifications": "在上面新增電子郵件以設定電郵通知",
"All notifications are currently disabled for all targets.": "目前所有的通知功能已取消",
"An error occurred whilst saving your email notification preferences.": "在儲存你的電郵通知偏好時發生錯誤",
"Collecting app version information": "收集應用程式版本資訊",
"Delete the room alias %(alias)s and remove %(name)s from the directory?": "刪除聊天室別名 %(alias)s並從目錄移除 %(name)s",
"Enable audible notifications in web client": "在網頁客戶端設定聲音通知",
"Enter keywords separated by a comma:": "輸入關鍵字以逼號,區隔",
"Error saving email notification preferences": "儲存電郵通知偏好時出錯",
"Failed to add tag %(tagName)s to room": "無法為聊天室新增標籤 %(tagName)s",
"Failed to get protocol list from Home Server": "無法從主機伺服器取得協議清單",
"Failed to get public room list": "無法取得公開的聊天室清單",
"Failed to remove tag %(tagName)s from room": "移除聊天室的標籤 %(tagName)s 失敗",
"Failed to send report: ": "無法傳送報告:",
"Failed to set direct chat tag": "無法設定直接聊天標籤",
"Failed to set Direct Message status of room": "無法設定聊天室的私訊狀態",
"Fetching third party location failed": "抓取第三方位置失敗",
"Files": "檔案",
"Filter room names": "過濾聊天室名稱",
"Forget": "忘記",
"Forward Message": "轉寄訊息",
" from room": "來自聊天室",
"Guests can join": "訪客可以加入",
"Guest users can't invite users. Please register to invite.": "訪客不能邀請用戶,請先註冊再行邀請。",
"Hide panel": "隱藏面板",
"I understand the risks and wish to continue": "我了解這些風險並願意繼續",
"Invite to this room": "邀請加入這個聊天室",
"Keywords": "關鍵字",
"Leave": "離開",
"Loading bug report module": "載入程式臭蟲報告模組",
"Low Priority": "低度優先",
"Notify for all other messages/rooms": "通知所有其它的訊息/聊天室",
"Notify me for anything else": "所有消息都通知我",
"Permalink": "永久鏈接",
"Please install <a href=\"https://www.google.com/chrome\">Chrome</a> or <a href=\"https://getfirefox.com\">Firefox</a> for the best experience.": "諘安裝 <a href=\"https://www.google.com/chrome\">Chrome</a> 或 <a href=\"https://getfirefox.com\">Firefox</a> 來取得最佳體驗。",
"Please Register": "請註冊",
"Redact": "纂輯\t",
"Reject": "拒絕",
"Remove %(name)s from the directory?": "自目錄中移除 %(name)s",
"remove %(name)s from the directory.": "自目錄中移除 %(name)s",
"Remove from Directory": "自目錄中移除",
"Report a bug": "回報程式臭蟲",
"Riot Desktop on %(platformName)s": "Riot 在 %(platformName)s 桌面",
"Riot does not know how to join a room on this network": "Riot 不知道如何在此網路中加入聊天室",
"Sorry, your browser is <b>not</b> able to run Riot.": "可惜你的瀏覽器 <b>無法</b> 執行 Riot.",
"The Home Server may be too old to support third party networks": "主機伺服器可能太老舊無法支援第三方網路",
"The server may be unavailable or overloaded": "伺服器可能過載或無法連取",
"Unable to fetch notification target list": "無法抓取通知的目標清單"
}

View File

@@ -65,7 +65,7 @@ module.exports = {
// Messages containing user's display name
".m.rule.contains_display_name": new VectorPushRuleDefinition({
kind: "override",
description: "Messages containing my display name",
description: "Messages containing my display name", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
@@ -76,7 +76,7 @@ module.exports = {
// Messages containing user's username (localpart/MXID)
".m.rule.contains_user_name": new VectorPushRuleDefinition({
kind: "override",
description: "Messages containing my user name",
description: "Messages containing my user name", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: { // The actions for each vector state, or null to disable the rule.
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_HIGHLIGHT_DEFAULT_SOUND,
@@ -87,7 +87,7 @@ module.exports = {
// Messages just sent to the user in a 1:1 room
".m.rule.room_one_to_one": new VectorPushRuleDefinition({
kind: "underride",
description: "Messages in one-to-one chats",
description: "Messages in one-to-one chats", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
@@ -100,7 +100,7 @@ module.exports = {
// By opposition, all other room messages are from group chat rooms.
".m.rule.message": new VectorPushRuleDefinition({
kind: "underride",
description: "Messages in group chats",
description: "Messages in group chats", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
@@ -111,7 +111,7 @@ module.exports = {
// Invitation for the user
".m.rule.invite_for_me": new VectorPushRuleDefinition({
kind: "underride",
description: "When I'm invited to a room",
description: "When I'm invited to a room", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_NOTIFY_DEFAULT_SOUND,
@@ -122,7 +122,7 @@ module.exports = {
// Incoming call
".m.rule.call": new VectorPushRuleDefinition({
kind: "underride",
description: "Call invitation",
description: "Call invitation", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
on: StandardActions.ACTION_NOTIFY,
loud: StandardActions.ACTION_NOTIFY_RING_SOUND,
@@ -133,7 +133,7 @@ module.exports = {
// Notifications from bots
".m.rule.suppress_notices": new VectorPushRuleDefinition({
kind: "override",
description: "Messages sent by bot",
description: "Messages sent by bot", // passed through _t() translation in src/components/views/settings/Notifications.js
vectorStateToActions: {
// .m.rule.suppress_notices is a "negative" rule, we have to invert its enabled value for vector UI
on: StandardActions.ACTION_DISABLED,

View File

@@ -33,6 +33,7 @@
@import "./matrix-react-sdk/views/messages/_MImageBody.scss";
@import "./matrix-react-sdk/views/messages/_MNoticeBody.scss";
@import "./matrix-react-sdk/views/messages/_MTextBody.scss";
@import "./matrix-react-sdk/views/messages/_RoomAvatarEvent.scss";
@import "./matrix-react-sdk/views/messages/_TextualEvent.scss";
@import "./matrix-react-sdk/views/messages/_UnknownBody.scss";
@import "./matrix-react-sdk/views/rooms/_Autocomplete.scss";

View File

@@ -112,4 +112,3 @@ limitations under the License.
.mx_FilePanel .mx_EventTile_selected .mx_EventTile_line {
padding-left: 0px;
}

View File

@@ -175,3 +175,22 @@ limitations under the License.
margin-top: -2px;
}
.mx_MatrixChat_useCompactLayout {
.mx_RoomStatusBar {
min-height: 40px;
}
.mx_RoomStatusBar_indicator {
margin-top: 10px;
}
.mx_RoomStatusBar_callBar {
height: 40px;
line-height: 40px;
}
.mx_RoomStatusBar_typingBar {
height: 40px;
line-height: 40px;
}
}

View File

@@ -260,4 +260,14 @@ hr.mx_RoomView_myReadMarker {
.mx_RoomView_ongoingConfCallNotification a {
color: $accent-fg-color ! important;
}
}
.mx_MatrixChat_useCompactLayout {
.mx_RoomView_MessageList {
margin-bottom: 4px;
}
.mx_RoomView_statusAreaBox {
min-height: 42px;
}
}

View File

@@ -131,6 +131,10 @@ limitations under the License.
position: absolute;
}
.mx_UserSettings_language {
width: 200px;
}
.mx_UserSettings_profileTable
{
display: table;
@@ -227,7 +231,8 @@ input.mx_UserSettings_phoneNumberField {
display: none;
}
.mx_UserSettings_advanced_spoiler {
.mx_UserSettings_advanced_spoiler,
.mx_UserSettings_link {
cursor: pointer;
color: $accent-color;
word-break: break-all;

View File

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

View File

@@ -37,6 +37,7 @@ limitations under the License.
font-family: 'Open Sans', Arial, Helvetica, Sans-Serif;
font-size: 14px;
color: $primary-fg-color;
background-color: $primary-bg-color;
border-radius: 3px;
border: solid 1px $input-border-color;

View File

@@ -19,3 +19,6 @@ limitations under the License.
filter: brightness($focus-brightness);
}
.mx_AccessibleButton {
cursor: pointer;
}

View File

@@ -48,3 +48,13 @@ limitations under the License.
margin-left: 63px;
line-height: 30px;
}
.mx_MatrixChat_useCompactLayout {
.mx_MemberEventListSummary_line {
line-height: 22px;
}
.mx_MemberEventListSummary_toggle {
margin-top: 2px;
}
}

View File

@@ -28,4 +28,9 @@ limitations under the License.
font-size: 13px;
font-weight: 300;
color: $primary-fg-color;
}
.mx_ServerConfig_selector {
text-align: center;
width: 302px; // for fr i18n
}

View File

@@ -0,0 +1,26 @@
/*
Copyright 2017 Vector Creations Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
.mx_RoomAvatarEvent {
opacity: 0.5;
overflow-y: hidden;
}
.mx_RoomAvatarEvent_avatar {
display: inline;
position: relative;
top: 5px;
}

View File

@@ -62,7 +62,7 @@ limitations under the License.
visibility: hidden;
white-space: nowrap;
color: $event-timestamp-color;
font-size: 11px;
font-size: 10px;
left: 8px;
position: absolute;
}
@@ -183,6 +183,10 @@ limitations under the License.
visibility: visible;
}
.mx_MessagePanel_alwaysShowTimestamps .mx_MessageTimestamp {
visibility: visible;
}
.mx_EventTile_selected .mx_MessageTimestamp {
left: 3px;
}
@@ -263,6 +267,14 @@ limitations under the License.
cursor: pointer;
}
.mx_EventTile_12hr .mx_EventTile_e2eIcon {
padding-left: 5px;
}
.mx_EventTile_12hr .mx_MessageTimestamp {
text-align: center;
}
.mx_EventTile:hover.mx_EventTile_verified .mx_EventTile_line,
.mx_EventTile:hover.mx_EventTile_unverified .mx_EventTile_line {
padding-left: 60px;
@@ -348,3 +360,67 @@ limitations under the License.
}
/* end of overrides */
.mx_MatrixChat_useCompactLayout {
.mx_EventTile {
padding-top: 4px;
}
.mx_EventTile.mx_EventTile_info {
padding-top: 0px;
}
.mx_EventTile .mx_SenderProfile {
font-size: 13px;
}
.mx_EventTile.mx_EventTile_emote {
padding-top: 8px;
.mx_EventTile_avatar {
top: 2px;
}
.mx_EventTile_line {
padding-top: 0px;
padding-bottom: 1px;
}
}
.mx_EventTile.mx_EventTile_emote.mx_EventTile_continuation {
padding-top: 0;
.mx_EventTile_line {
padding-top: 0px;
padding-bottom: 0px;
}
}
.mx_EventTile_line {
padding-top: 0px;
padding-bottom: 0px;
}
.mx_EventTile_avatar {
top: 2px;
}
.mx_EventTile.mx_EventTile_info .mx_EventTile_avatar {
top: 5px;
}
.mx_EventTile_e2eIcon {
top: 7px;
}
.mx_EventTile_readAvatars {
top: 27px;
}
.mx_EventTile_continuation .mx_EventTile_readAvatars,
.mx_EventTile_info .mx_EventTile_readAvatars,
.mx_EventTile_emote .mx_EventTile_readAvatars {
top: 5px;
}
.mx_RoomView_MessageList h2 {
margin-top: 6px;
}
}

View File

@@ -60,3 +60,10 @@ limitations under the License.
.mx_LinkPreviewWidget:hover .mx_LinkPreviewWidget_cancel {
visibility: visible;
}
.mx_MatrixChat_useCompactLayout {
.mx_LinkPreviewWidget {
margin-top: 6px;
margin-bottom: 6px;
}
}

View File

@@ -200,3 +200,13 @@ limitations under the License.
padding: 4px 4px 4px 0;
opacity: 0.8;
}
.mx_MatrixChat_useCompactLayout {
.mx_MessageComposer_input {
min-height: 50px;
}
.mx_MessageComposer_noperm_error {
height: 50px;
}
}

View File

@@ -44,3 +44,10 @@ limitations under the License.
padding-top: 3px;
cursor: pointer;
}
.mx_MatrixChat_useCompactLayout {
.mx_TopUnreadMessagesBar {
padding-top: 4px;
padding-bottom: 4px;
}
}

View File

@@ -104,3 +104,17 @@ limitations under the License.
top: -25px;
left: 6px;
}
.mx_MatrixChat_useCompactLayout {
.mx_LeftPanel .mx_BottomLeftMenu {
flex: 0 0 50px;
}
.mx_LeftPanel.collapsed .mx_BottomLeftMenu {
flex: 0 0 160px;
}
.mx_LeftPanel .mx_BottomLeftMenu_options {
margin-top: 12px;
}
}

View File

@@ -118,3 +118,14 @@ limitations under the License.
vertical-align: top;
padding-left: 10px
}
.mx_MatrixChat_useCompactLayout {
.mx_RightPanel_footer {
flex: 0 0 50px;
}
.mx_RightPanel_footer .mx_RightPanel_invite {
line-height: 25px;
padding-top: 8px;
}
}

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style>.cls-1{fill:#764d80;}.cls-2{fill:#7dc8a2;}.cls-3{fill:#afdbc5;}</style></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-3" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path class="cls-2" d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-3" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path class="cls-2" d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-3" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path class="cls-2" d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-3" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path class="cls-2" d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-3" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle class="cls-1" cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path class="cls-1" d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#7dc8a2;}.cls-3{fill:#afdbc5;}</style></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-3" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path class="cls-2" d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-3" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path class="cls-2" d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-3" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path class="cls-2" d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-3" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path class="cls-2" d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-3" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle class="cls-1" cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path class="cls-1" d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.36 143.93"><defs><style>.cls-1{fill:#764d80;}.cls-2{fill:#f69e98;}</style></defs><title>Asset 2</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M20.56,139.54A16.19,16.19,0,0,1,4.39,123.37V20.57a16.21,16.21,0,0,1,16-16.17H61.67a47,47,0,0,1,0,94H36.73v25A16.19,16.19,0,0,1,20.56,139.54ZM20.39,5.9A14.7,14.7,0,0,0,5.89,20.57v102.8a14.67,14.67,0,0,0,29.34,0V96.9H61.67a45.49,45.49,0,0,0,0-91H20.39Z"/><path class="cls-2" d="M20.56,134.4a11,11,0,0,1-11-11V20.57a11.09,11.09,0,0,1,10.79-11H61.67a41.85,41.85,0,0,1,0,83.7H31.59v30.11A11,11,0,0,1,20.56,134.4ZM20.3,11A9.57,9.57,0,0,0,11,20.57v102.8a9.53,9.53,0,1,0,19.05,0V91.75H61.67a40.35,40.35,0,0,0,0-80.7H20.3Z"/><path class="cls-2" d="M20.56,129.25a5.89,5.89,0,0,1-5.88-5.88V20.57a5.94,5.94,0,0,1,5.61-5.88H61.67a36.71,36.71,0,0,1,0,73.42H26.44v35.25A5.89,5.89,0,0,1,20.56,129.25ZM20.31,16.19a4.42,4.42,0,0,0-4.13,4.38v102.8a4.38,4.38,0,0,0,8.77,0V86.61H61.67a35.21,35.21,0,0,0,0-70.42Z"/><path class="cls-2" d="M61.67,83H19.81V19.83H61.67a31.57,31.57,0,0,1,0,63.14Zm-40.36-1.5H61.67a30.07,30.07,0,0,0,0-60.14H21.32Z"/><path class="cls-2" d="M61.67,77.83H25V25H61.67a26.43,26.43,0,0,1,0,52.85Zm-35.22-1.5H61.67a24.93,24.93,0,0,0,0-49.85H26.46Z"/><path class="cls-2" d="M61.67,72.69H30.1V30.12H61.67a21.29,21.29,0,0,1,0,42.57ZM31.6,71.19H61.67a19.79,19.79,0,0,0,0-39.57H31.6Z"/><path class="cls-2" d="M61.67,67.55H35.24V35.26H61.67a16.14,16.14,0,0,1,0,32.29ZM36.74,66H61.67a14.64,14.64,0,0,0,0-29.29H36.74Z"/><path class="cls-2" d="M61.67,62.41H40.38v-22H61.67a11,11,0,0,1,0,22Zm-19.79-1.5H61.67a9.5,9.5,0,0,0,0-19H41.88Z"/><path class="cls-2" d="M61.67,57.26H45.52V45.54H61.67a5.86,5.86,0,0,1,0,11.72ZM47,55.76H61.67a4.36,4.36,0,0,0,0-8.72H47Z"/><path class="cls-2" d="M61.18,52.16H51.89a.75.75,0,1,1,0-1.5h9.29a.75.75,0,0,1,0,1.5Z"/><path class="cls-2" d="M20.56,124.12a.75.75,0,0,1-.75-.75v-36a.75.75,0,0,1,1.5,0v36A.75.75,0,0,1,20.56,124.12Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M145.91,51.12h25.61a2.57,2.57,0,0,0,0-5.14H145.91a2.57,2.57,0,1,0,0,5.14Z"/><path class="cls-2" d="M145.91,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,171.51,0H145.91a2.57,2.57,0,1,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M171.51,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,171.51,118.28Z"/><path class="cls-2" d="M158.71,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,158.71,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,158.71,98.79Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.36 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#f69e98;}</style></defs><title>Asset 2</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M20.56,139.54A16.19,16.19,0,0,1,4.39,123.37V20.57a16.21,16.21,0,0,1,16-16.17H61.67a47,47,0,0,1,0,94H36.73v25A16.19,16.19,0,0,1,20.56,139.54ZM20.39,5.9A14.7,14.7,0,0,0,5.89,20.57v102.8a14.67,14.67,0,0,0,29.34,0V96.9H61.67a45.49,45.49,0,0,0,0-91H20.39Z"/><path class="cls-2" d="M20.56,134.4a11,11,0,0,1-11-11V20.57a11.09,11.09,0,0,1,10.79-11H61.67a41.85,41.85,0,0,1,0,83.7H31.59v30.11A11,11,0,0,1,20.56,134.4ZM20.3,11A9.57,9.57,0,0,0,11,20.57v102.8a9.53,9.53,0,1,0,19.05,0V91.75H61.67a40.35,40.35,0,0,0,0-80.7H20.3Z"/><path class="cls-2" d="M20.56,129.25a5.89,5.89,0,0,1-5.88-5.88V20.57a5.94,5.94,0,0,1,5.61-5.88H61.67a36.71,36.71,0,0,1,0,73.42H26.44v35.25A5.89,5.89,0,0,1,20.56,129.25ZM20.31,16.19a4.42,4.42,0,0,0-4.13,4.38v102.8a4.38,4.38,0,0,0,8.77,0V86.61H61.67a35.21,35.21,0,0,0,0-70.42Z"/><path class="cls-2" d="M61.67,83H19.81V19.83H61.67a31.57,31.57,0,0,1,0,63.14Zm-40.36-1.5H61.67a30.07,30.07,0,0,0,0-60.14H21.32Z"/><path class="cls-2" d="M61.67,77.83H25V25H61.67a26.43,26.43,0,0,1,0,52.85Zm-35.22-1.5H61.67a24.93,24.93,0,0,0,0-49.85H26.46Z"/><path class="cls-2" d="M61.67,72.69H30.1V30.12H61.67a21.29,21.29,0,0,1,0,42.57ZM31.6,71.19H61.67a19.79,19.79,0,0,0,0-39.57H31.6Z"/><path class="cls-2" d="M61.67,67.55H35.24V35.26H61.67a16.14,16.14,0,0,1,0,32.29ZM36.74,66H61.67a14.64,14.64,0,0,0,0-29.29H36.74Z"/><path class="cls-2" d="M61.67,62.41H40.38v-22H61.67a11,11,0,0,1,0,22Zm-19.79-1.5H61.67a9.5,9.5,0,0,0,0-19H41.88Z"/><path class="cls-2" d="M61.67,57.26H45.52V45.54H61.67a5.86,5.86,0,0,1,0,11.72ZM47,55.76H61.67a4.36,4.36,0,0,0,0-8.72H47Z"/><path class="cls-2" d="M61.18,52.16H51.89a.75.75,0,1,1,0-1.5h9.29a.75.75,0,0,1,0,1.5Z"/><path class="cls-2" d="M20.56,124.12a.75.75,0,0,1-.75-.75v-36a.75.75,0,0,1,1.5,0v36A.75.75,0,0,1,20.56,124.12Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M145.91,51.12h25.61a2.57,2.57,0,0,0,0-5.14H145.91a2.57,2.57,0,1,0,0,5.14Z"/><path class="cls-2" d="M145.91,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,171.51,0H145.91a2.57,2.57,0,1,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M171.51,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,171.51,118.28Z"/><path class="cls-2" d="M158.71,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,158.71,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,158.71,98.79Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style>.cls-1{fill:#fac79e;}.cls-2{fill:#e45e5d;}.cls-3{fill:#f8a05f;}</style></defs><title>Asset 5</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><polygon class="cls-3" points="47.03 0.01 40.32 0.01 0 48.06 0 56.05 47.03 0.01"/><polygon class="cls-3" points="60.45 0.01 53.74 0.01 0 64.05 0 72.04 60.45 0.01"/><path class="cls-3" d="M72.83,1.24a51,51,0,0,0-5.9-1L0,80v8Z"/><polygon class="cls-3" points="33.61 0.01 26.9 0.01 0 32.06 0 40.06 33.61 0.01"/><path class="cls-3" d="M83.27,4.78a51,51,0,0,0-5-2L0,96v8Z"/><path class="cls-3" d="M41.12,102.78h.18l64.78-77.2a51.55,51.55,0,0,0-2.94-4.49L5.55,137.38a20.62,20.62,0,0,0,3.95,3.29L41.12,103Z"/><path class="cls-3" d="M112.22,42.23l-50.8,60.54h.25a51.55,51.55,0,0,0,6.85-.47L113,49.3A51.32,51.32,0,0,0,112.22,42.23Z"/><path class="cls-3" d="M40.71,127.46l-12.59,15A20.58,20.58,0,0,0,40.71,127.46Z"/><path class="cls-3" d="M110,68.88a51,51,0,0,0,2.67-11.18L76.73,100.52a51.1,51.1,0,0,0,10.6-4.64Z"/><path class="cls-3" d="M92.22,10.1a51.58,51.58,0,0,0-4.3-2.87L0,112v8Z"/><path class="cls-3" d="M99.83,17q-1.73-1.92-3.64-3.66L.42,127.5a20.41,20.41,0,0,0,2,5.58Z"/><path class="cls-3" d="M41.12,119v-8l-26.82,32a20.53,20.53,0,0,0,5.9,1Z"/><path class="cls-3" d="M110.71,36a51,51,0,0,0-2.09-5.5L48,102.78h6.71Z"/><circle class="cls-1" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-1" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#fac79e;}.cls-2{fill:#e45e5d;}.cls-3{fill:#f8a05f;}</style></defs><title>Asset 5</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-1" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-1" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-1" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path class="cls-2" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><polygon class="cls-3" points="47.03 0.01 40.32 0.01 0 48.06 0 56.05 47.03 0.01"/><polygon class="cls-3" points="60.45 0.01 53.74 0.01 0 64.05 0 72.04 60.45 0.01"/><path class="cls-3" d="M72.83,1.24a51,51,0,0,0-5.9-1L0,80v8Z"/><polygon class="cls-3" points="33.61 0.01 26.9 0.01 0 32.06 0 40.06 33.61 0.01"/><path class="cls-3" d="M83.27,4.78a51,51,0,0,0-5-2L0,96v8Z"/><path class="cls-3" d="M41.12,102.78h.18l64.78-77.2a51.55,51.55,0,0,0-2.94-4.49L5.55,137.38a20.62,20.62,0,0,0,3.95,3.29L41.12,103Z"/><path class="cls-3" d="M112.22,42.23l-50.8,60.54h.25a51.55,51.55,0,0,0,6.85-.47L113,49.3A51.32,51.32,0,0,0,112.22,42.23Z"/><path class="cls-3" d="M40.71,127.46l-12.59,15A20.58,20.58,0,0,0,40.71,127.46Z"/><path class="cls-3" d="M110,68.88a51,51,0,0,0,2.67-11.18L76.73,100.52a51.1,51.1,0,0,0,10.6-4.64Z"/><path class="cls-3" d="M92.22,10.1a51.58,51.58,0,0,0-4.3-2.87L0,112v8Z"/><path class="cls-3" d="M99.83,17q-1.73-1.92-3.64-3.66L.42,127.5a20.41,20.41,0,0,0,2,5.58Z"/><path class="cls-3" d="M41.12,119v-8l-26.82,32a20.53,20.53,0,0,0,5.9,1Z"/><path class="cls-3" d="M110.71,36a51,51,0,0,0-2.09-5.5L48,102.78h6.71Z"/><circle class="cls-1" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-1" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 175.64 143.93"><defs><style>.cls-1{fill:#e45e5d;}.cls-2{fill:#c7bdcd;}.cls-3{fill:#f69e98;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M147.19,51.12h25.61a2.57,2.57,0,1,0,0-5.14H147.19a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M147.19,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.79,0H147.19a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.79,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.79,118.28Z"/><path class="cls-2" d="M160,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,160,72.63Zm0,26.16A10.51,10.51,0,1,1,170.5,88.28,10.52,10.52,0,0,1,160,98.79Z"/><path class="cls-3" d="M2.77,133.64A20.62,20.62,0,0,0,7,138.77H34.14a20.62,20.62,0,0,0,4.21-5.13Z"/><path class="cls-3" d="M0,92.52v5.14H84a51.48,51.48,0,0,0,8.41-5.14Z"/><rect class="cls-3" y="102.8" width="41.12" height="5.13"/><rect class="cls-3" y="113.08" width="41.12" height="5.14"/><path class="cls-3" d="M.68,15.41H98.3a51.8,51.8,0,0,0-5.86-5.14H2.78A20.41,20.41,0,0,0,.68,15.41Z"/><path class="cls-3" d="M0,123.36H0a20.53,20.53,0,0,0,.67,5.12H40.45a20.53,20.53,0,0,0,.67-5.12H0Z"/><path class="cls-3" d="M0,56.53H112.8c.17-1.69.26-3.4.26-5.13H0Z"/><path class="cls-3" d="M0,82.24v5.14H98.32a51.79,51.79,0,0,0,4.43-5.14Z"/><path class="cls-3" d="M0,20.57V25.7H106.14a51.58,51.58,0,0,0-3.39-5.14Z"/><path class="cls-3" d="M20.81,0h-.25A20.46,20.46,0,0,0,7,5.14H84A51.07,51.07,0,0,0,61.67,0Z"/><path class="cls-3" d="M0,30.85V36H110.69a51,51,0,0,0-1.94-5.14Z"/><path class="cls-3" d="M0,72v5.13H106.14A51.24,51.24,0,0,0,108.75,72Z"/><path class="cls-3" d="M0,61.68v5.14H110.69A50.92,50.92,0,0,0,112,61.68Z"/><path class="cls-3" d="M0,41.22v5.14H112.8a51.15,51.15,0,0,0-.77-5.14Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,0,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 175.64 143.93"><defs><style type="text/css">.cls-1{fill:#e45e5d;}.cls-2{fill:#c7bdcd;}.cls-3{fill:#f69e98;}</style></defs><title>Asset 3</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><path class="cls-2" d="M147.19,51.12h25.61a2.57,2.57,0,1,0,0-5.14H147.19a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M147.19,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.79,0H147.19a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.79,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23a2.57,2.57,0,0,0-2.57,2.57h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.79,118.28Z"/><path class="cls-2" d="M160,72.63a15.65,15.65,0,1,0,15.65,15.65A15.67,15.67,0,0,0,160,72.63Zm0,26.16A10.51,10.51,0,1,1,170.5,88.28,10.52,10.52,0,0,1,160,98.79Z"/><path class="cls-3" d="M2.77,133.64A20.62,20.62,0,0,0,7,138.77H34.14a20.62,20.62,0,0,0,4.21-5.13Z"/><path class="cls-3" d="M0,92.52v5.14H84a51.48,51.48,0,0,0,8.41-5.14Z"/><rect class="cls-3" y="102.8" width="41.12" height="5.13"/><rect class="cls-3" y="113.08" width="41.12" height="5.14"/><path class="cls-3" d="M.68,15.41H98.3a51.8,51.8,0,0,0-5.86-5.14H2.78A20.41,20.41,0,0,0,.68,15.41Z"/><path class="cls-3" d="M0,123.36H0a20.53,20.53,0,0,0,.67,5.12H40.45a20.53,20.53,0,0,0,.67-5.12H0Z"/><path class="cls-3" d="M0,56.53H112.8c.17-1.69.26-3.4.26-5.13H0Z"/><path class="cls-3" d="M0,82.24v5.14H98.32a51.79,51.79,0,0,0,4.43-5.14Z"/><path class="cls-3" d="M0,20.57V25.7H106.14a51.58,51.58,0,0,0-3.39-5.14Z"/><path class="cls-3" d="M20.81,0h-.25A20.46,20.46,0,0,0,7,5.14H84A51.07,51.07,0,0,0,61.67,0Z"/><path class="cls-3" d="M0,30.85V36H110.69a51,51,0,0,0-1.94-5.14Z"/><path class="cls-3" d="M0,72v5.13H106.14A51.24,51.24,0,0,0,108.75,72Z"/><path class="cls-3" d="M0,61.68v5.14H110.69A50.92,50.92,0,0,0,112,61.68Z"/><path class="cls-3" d="M0,41.22v5.14H112.8a51.15,51.15,0,0,0-.77-5.14Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="translate(-8.07 15.53) rotate(-35)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,0,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style>.cls-1{fill:#764d80;}.cls-2{fill:#afdbc5;}</style></defs><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="matrix(0.82, -0.57, 0.57, 0.82, -8.07, 15.53)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,1,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-2" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#764d80;}.cls-2{fill:#afdbc5;}</style></defs><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path class="cls-1" d="M61.67,0H20.56A20.56,20.56,0,0,0,0,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H61.67A51.38,51.38,0,0,0,61.67,0Z"/><circle class="cls-2" cx="20.59" cy="20.57" r="20.56" transform="matrix(0.82, -0.57, 0.57, 0.82, -8.07, 15.53)"/><path class="cls-2" d="M109.36,111.56a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.58,67.57Z"/><path class="cls-2" d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path class="cls-2" d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,1,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path class="cls-2" d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path class="cls-2" d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Asset 6</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-1" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-1" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-1" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-1" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-1" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174.99 143.93"><defs><style type="text/css">.cls-1{fill:#fff;}</style></defs><title>Asset 6</title><g id="Layer_2" data-name="Layer 2"><g id="Design"><path d="M146.53,51.12h25.61a2.57,2.57,0,0,0,0-5.14H146.53a2.57,2.57,0,0,0,0,5.14Z"/><path d="M146.53,5.14h7.66v7.79l-.05,0-9,6.32a2.57,2.57,0,0,0,2.95,4.21l7.23-5.06a10.24,10.24,0,0,0,19.42-4.59V2.64s0,0,0-.07A2.57,2.57,0,0,0,172.14,0H146.53a2.57,2.57,0,0,0,0,5.14Zm23,8.71a5.12,5.12,0,1,1-10.23,0V5.14h10.23Z"/><path d="M172.14,118.28a2.57,2.57,0,0,0-2.57,2.57v7.6h-23A2.57,2.57,0,0,0,144,131h0a2.57,2.57,0,0,0,2.57,2.57h23v7.78a2.57,2.57,0,0,0,5.14,0V131h0V120.85A2.57,2.57,0,0,0,172.14,118.28Z"/><path d="M159.34,72.63A15.65,15.65,0,1,0,175,88.28,15.67,15.67,0,0,0,159.34,72.63Zm0,26.16a10.51,10.51,0,1,1,10.51-10.51A10.52,10.52,0,0,1,159.34,98.79Z"/><path d="M62.33,0H21.22A20.56,20.56,0,0,0,.66,20.57v102.8a20.56,20.56,0,0,0,41.12,0V102.79H62.33A51.38,51.38,0,0,0,62.33,0Z"/><path class="cls-1" d="M21.22,138.81A15.45,15.45,0,0,1,5.79,123.37V20.57A15.45,15.45,0,0,1,21.09,5.14H62.33a46.26,46.26,0,0,1,0,92.51H36.65v25.71A15.45,15.45,0,0,1,21.22,138.81Z"/><path d="M21.22,133.68a10.32,10.32,0,0,1-10.3-10.3V20.57A10.33,10.33,0,0,1,21,10.27H62.33a41.13,41.13,0,0,1,0,82.26H31.52v30.84A10.32,10.32,0,0,1,21.22,133.68Z"/><path class="cls-1" d="M21.22,128.55A5.18,5.18,0,0,1,16,123.37V20.57a5.2,5.2,0,0,1,5-5.17H62.33a36,36,0,0,1,0,72H26.39v36A5.18,5.18,0,0,1,21.22,128.55Z"/><path d="M21.27,82.28H62.33a30.87,30.87,0,0,0,0-61.75H21.22Z"/><path class="cls-1" d="M26.39,77.15l0-51.49h36a25.75,25.75,0,0,1,0,51.49Z"/><path d="M31.51,72l0-41.23H62.33a20.62,20.62,0,0,1,0,41.23Z"/><path class="cls-1" d="M36.64,66.9l0-31H62.33a15.49,15.49,0,0,1,0,31Z"/><path d="M41.76,61.77l0-20.72H62.33a10.36,10.36,0,0,1,0,20.72Z"/><path class="cls-1" d="M46.89,56.64V46.18H62.33a5.23,5.23,0,0,1,0,10.47Z"/><circle cx="20.56" cy="20.57" r="20.56" transform="translate(-8.08 15.51) rotate(-35)"/><path d="M109.34,111.57a20.56,20.56,0,1,1-33.69,23.59l-30.79-44A20.56,20.56,0,0,1,78.55,67.58Z"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -36,7 +36,7 @@
</head>
<body style="height: 100%;">
<section id="matrixchat" style="height: 100%;"></section>
<noscript>Sorry, Riot requires JavaScript to be enabled.</noscript>
<noscript>Sorry, Riot requires JavaScript to be enabled.</noscript> <!-- TODO: Translate this? -->
<% for (var i=0; i < htmlWebpackPlugin.files.js.length; i++) {
// Not a particularly graceful way of not putting the indexeddb worker script
// into the main page

View File

@@ -56,12 +56,14 @@ if (process.env.NODE_ENV !== 'production') {
var RunModernizrTests = require("./modernizr"); // this side-effects a global
var ReactDOM = require("react-dom");
var sdk = require("matrix-react-sdk");
var PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg");
const PlatformPeg = require("matrix-react-sdk/lib/PlatformPeg");
sdk.loadSkin(require('../component-index'));
var VectorConferenceHandler = require('../VectorConferenceHandler');
var UpdateChecker = require("./updater");
var q = require('q');
var request = require('browser-request');
import * as UserSettingsStore from 'matrix-react-sdk/lib/UserSettingsStore';
import * as languageHandler from 'matrix-react-sdk/lib/languageHandler';
import url from 'url';
@@ -141,7 +143,7 @@ var onNewScreen = function(screen) {
var hash = '#/' + screen;
lastLocationHashSet = hash;
window.location.hash = hash;
}
};
// We use this to work out what URL the SDK should
// pass through when registering to allow the user to
@@ -228,8 +230,9 @@ function onLoadCompleted() {
}
}
async function loadApp() {
await loadLanguage();
const fragparts = parseQsFromFragment(window.location);
const params = parseQs(window.location);
@@ -242,13 +245,13 @@ async function loadApp() {
if (!preventRedirect) {
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
if (confirm("Riot is not supported on mobile web. Install the app?")) {
if (confirm(languageHandler._t("Riot is not supported on mobile web. Install the app?"))) {
window.location = "https://itunes.apple.com/us/app/vector.im/id1083446067";
return;
}
}
else if (/Android/.test(navigator.userAgent)) {
if (confirm("Riot is not supported on mobile web. Install the app?")) {
if (confirm(languageHandler._t("Riot is not supported on mobile web. Install the app?"))) {
window.location = "https://play.google.com/store/apps/details?id=im.vector.alpha";
return;
}
@@ -275,7 +278,6 @@ async function loadApp() {
</div>, document.getElementById('matrixchat'));
} else if (validBrowser) {
UpdateChecker.start();
const MatrixChat = sdk.getComponent('structures.MatrixChat');
window.matrixChat = ReactDOM.render(
<MatrixChat
@@ -292,8 +294,7 @@ async function loadApp() {
/>,
document.getElementById('matrixchat')
);
}
else {
} else {
console.error("Browser is missing required features.");
// take to a different landing page to AWOOOOOGA at the user
var CompatibilityPage = sdk.getComponent("structures.CompatibilityPage");
@@ -309,4 +310,22 @@ async function loadApp() {
}
}
async function loadLanguage() {
const prefLang = UserSettingsStore.getLocalSetting('language');
let langs = [];
if (!prefLang) {
languageHandler.getLanguagesFromBrowser().forEach((l) => {
langs.push(...languageHandler.getNormalizedLanguageKeys(l));
});
} else {
langs = [prefLang];
}
try {
await languageHandler.setLanguage(langs);
} catch (e) {
console.error("Unable to set language", e);
}
}
loadApp();

View File

@@ -19,8 +19,9 @@ limitations under the License.
import VectorBasePlatform from './VectorBasePlatform';
import dis from 'matrix-react-sdk/lib/dispatcher';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import q from 'q';
import electron, {remote} from 'electron';
import electron, {remote, ipcRenderer} from 'electron';
remote.autoUpdater.on('update-downloaded', onUpdateDownloaded);
@@ -54,20 +55,28 @@ function platformFriendlyName(): string {
}
}
function _onAction(payload: Object) {
// Whitelist payload actions, no point sending most across
if (['call_state'].includes(payload.action)) {
ipcRenderer.send('app_onAction', payload);
}
}
export default class ElectronPlatform extends VectorBasePlatform {
constructor() {
super();
dis.register(_onAction);
}
getHumanReadableName(): string {
return 'Electron Platform'; // no translation required: only used for analytics
}
setNotificationCount(count: number) {
if (this.notificationCount === count) return;
super.setNotificationCount(count);
// this sometimes throws because electron is made of fail:
// https://github.com/electron/electron/issues/7351
// For now, let's catch the error, but I suspect it may
// continue to fail and we might just have to accept that
// electron's remote RPC is a non-starter for now and use IPC
try {
remote.app.setBadgeCount(count);
} catch (e) {
console.error('Failed to set notification count', e);
}
ipcRenderer.send('setBadgeCount', count);
}
supportsNotifications(): boolean {
@@ -79,7 +88,6 @@ export default class ElectronPlatform extends VectorBasePlatform {
}
displayNotification(title: string, msg: string, avatarUrl: string, room: Object): Notification {
// GNOME notification spec parses HTML tags for styling...
// Electron Docs state all supported linux notification systems follow this markup spec
// https://github.com/electron/electron/blob/master/docs/tutorial/desktop-environment-integration.md#linux
@@ -117,6 +125,10 @@ export default class ElectronPlatform extends VectorBasePlatform {
return notification;
}
loudNotification(ev: Event, room: Object) {
ipcRenderer.send('loudNotification');
}
clearNotification(notif: Notification) {
notif.close();
}
@@ -139,13 +151,15 @@ export default class ElectronPlatform extends VectorBasePlatform {
}
getDefaultDeviceDisplayName(): string {
return 'Riot Desktop on ' + platformFriendlyName();
return _t('Riot Desktop on %(platformName)s', { platformName: platformFriendlyName() });
}
screenCaptureErrorString(): ?string {
return null;
}
isElectron(): boolean { return true; }
requestNotificationPermission(): Promise<string> {
return q('granted');
}

View File

@@ -17,12 +17,63 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import BasePlatform from 'matrix-react-sdk/lib/BasePlatform'
import BasePlatform from 'matrix-react-sdk/lib/BasePlatform';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import Favico from 'favico.js';
/**
* Vector-specific extensions to the BasePlatform template
*/
export default class VectorBasePlatform extends BasePlatform {
constructor() {
super();
// The 'animations' are really low framerate and look terrible.
// Also it re-starts the animationb every time you set the badge,
// and we set the state each time, even if the value hasn't changed,
// so we'd need to fix that if enabling the animation.
this.favicon = new Favico({animation: 'none'});
this._updateFavicon();
}
getHumanReadableName(): string {
return 'Vector Base Platform'; // no translation required: only used for analytics
}
_updateFavicon() {
try {
// This needs to be in in a try block as it will throw
// if there are more than 100 badge count changes in
// its internal queue
let bgColor = "#d00",
notif = this.notificationCount;
if (this.errorDidOccur) {
notif = notif || "×";
bgColor = "#f00";
}
this.favicon.badge(notif, {
bgColor: bgColor,
});
} catch (e) {
console.warn(`Failed to set badge count: ${e.message}`);
}
}
setNotificationCount(count: number) {
if (this.notificationCount === count) return;
super.setNotificationCount(count);
this._updateFavicon();
}
setErrorStatus(errorDidOccur: boolean) {
if (this.errorDidOccur === errorDidOccur) return;
super.setErrorStatus(errorDidOccur);
this._updateFavicon();
}
/**
* Check for the availability of an update to the version of the
* app that's currently running.
@@ -45,6 +96,6 @@ export default class VectorBasePlatform extends BasePlatform {
* device Vector is running on
*/
getDefaultDeviceDisplayName(): string {
return "Unknown device";
return _t("Unknown device");
}
}

View File

@@ -18,9 +18,9 @@ limitations under the License.
*/
import VectorBasePlatform from './VectorBasePlatform';
import Favico from 'favico.js';
import request from 'browser-request';
import dis from 'matrix-react-sdk/lib/dispatcher.js';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import q from 'q';
import url from 'url';
@@ -30,45 +30,10 @@ export default class WebPlatform extends VectorBasePlatform {
constructor() {
super();
this.runningVersion = null;
// The 'animations' are really low framerate and look terrible.
// Also it re-starts the animationb every time you set the badge,
// and we set the state each time, even if the value hasn't changed,
// so we'd need to fix that if enabling the animation.
this.favicon = new Favico({animation: 'none'});
this._updateFavicon();
}
_updateFavicon() {
try {
// This needs to be in in a try block as it will throw
// if there are more than 100 badge count changes in
// its internal queue
let bgColor = "#d00",
notif = this.notificationCount;
if (this.errorDidOccur) {
notif = notif || "×";
bgColor = "#f00";
}
this.favicon.badge(notif, {
bgColor: bgColor,
});
} catch (e) {
console.warn(`Failed to set badge count: ${e.message}`);
}
}
setNotificationCount(count: number) {
if (this.notificationCount === count) return;
super.setNotificationCount(count);
this._updateFavicon();
}
setErrorStatus(errorDidOccur: boolean) {
if (this.errorDidOccur === errorDidOccur) return;
super.setErrorStatus(errorDidOccur);
this._updateFavicon();
getHumanReadableName(): string {
return 'Web Platform'; // no translation required: only used for analytics
}
/**
@@ -195,13 +160,15 @@ export default class WebPlatform extends VectorBasePlatform {
const appName = u.format();
const ua = new UAParser();
return `${appName} via ${ua.getBrowser().name} on ${ua.getOS().name}`;
const browserName = ua.getBrowser().name;
const osName = ua.getOS().name;
return _t('%(appName)s via %(browserName)s on %(osName)s', {appName: appName, browserName: browserName, osName: osName});
}
screenCaptureErrorString(): ?string {
// it won't work at all if you're not on HTTPS so whine whine whine
if (!global.window || global.window.location.protocol !== "https:") {
return "You need to be using HTTPS to place a screen-sharing call.";
return _t("You need to be using HTTPS to place a screen-sharing call.");
}
return null;
}

View File

@@ -19,6 +19,7 @@ import q from "q";
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import PlatformPeg from 'matrix-react-sdk/lib/PlatformPeg';
import { _t } from 'matrix-react-sdk/lib/languageHandler';
import rageshake from './rageshake'
@@ -53,7 +54,7 @@ export default async function sendBugReport(bugReportEndpoint, opts) {
opts = opts || {};
const progressCallback = opts.progressCallback || (() => {});
progressCallback("Collecting app version information");
progressCallback(_t("Collecting app version information"));
let version = "UNKNOWN";
try {
version = await PlatformPeg.get().getAppVersion();
@@ -81,7 +82,7 @@ export default async function sendBugReport(bugReportEndpoint, opts) {
}
if (opts.sendLogs) {
progressCallback("Collecting logs");
progressCallback(_t("Collecting logs"));
const logs = await rageshake.getLogsForReport();
for (let entry of logs) {
// encode as UTF-8
@@ -94,7 +95,7 @@ export default async function sendBugReport(bugReportEndpoint, opts) {
}
}
progressCallback("Uploading report");
progressCallback(_t("Uploading report"));
await _submitReport(bugReportEndpoint, body, progressCallback);
}
@@ -106,7 +107,7 @@ function _submitReport(endpoint, body, progressCallback) {
req.timeout = 5 * 60 * 1000;
req.onreadystatechange = function() {
if (req.readyState === XMLHttpRequest.LOADING) {
progressCallback("Waiting for response from server");
progressCallback(_t("Waiting for response from server"));
} else if (req.readyState === XMLHttpRequest.DONE) {
on_done();
}

View File

@@ -74,7 +74,6 @@ describe('joining a room', function () {
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
httpBackend.when('GET', '/sync').respond(200, {});
// note that we deliberately do *not* set an expectation for a
// presence update - setting one makes the first httpBackend.flush
@@ -86,7 +85,11 @@ describe('joining a room', function () {
localStorage.setItem("mx_access_token", ACCESS_TOKEN );
localStorage.setItem("mx_user_id", USER_ID);
var mc = <MatrixChat config={{}}/>;
var mc = (
<MatrixChat config={{}}
makeRegistrationUrl={()=>{throw new Error("unimplemented");}}
/>
);
matrixChat = ReactDOM.render(mc, parentDiv);
// switch to the Directory
@@ -94,10 +97,24 @@ describe('joining a room', function () {
var roomView;
// wait for /sync to happen
return q.delay(1).then(() => {
return httpBackend.flush();
}).then(() => {
// wait for /sync to happen. This may take some time, as the client
// has to initialise indexeddb.
console.log("waiting for /sync");
let syncDone = false;
httpBackend.when('GET', '/sync')
.check((r) => {syncDone = true;})
.respond(200, {});
function awaitSync(attempts) {
if (syncDone) {
return q();
}
if (!attempts) {
throw new Error("Gave up waiting for /sync")
}
return httpBackend.flush().then(() => awaitSync(attempts-1));
}
return awaitSync(10).then(() => {
// wait for the directory requests
httpBackend.when('POST', '/publicRooms').respond(200, {chunk: []});
httpBackend.when('GET', '/thirdparty/protocols').respond(200, {});

View File

@@ -28,6 +28,7 @@ import jssdk from 'matrix-js-sdk';
import sdk from 'matrix-react-sdk';
import MatrixClientPeg from 'matrix-react-sdk/lib/MatrixClientPeg';
import * as languageHandler from 'matrix-react-sdk/lib/languageHandler';
import test_utils from '../test-utils';
import MockHttpBackend from '../mock-request';
@@ -61,6 +62,10 @@ describe('loading:', function () {
windowLocation = null;
matrixChat = null;
languageHandler.setMissingEntryGenerator(function(key) {
return key.split('|', 2)[1];
});
});
afterEach(function() {
@@ -115,9 +120,9 @@ describe('loading:', function () {
}
function routeUrl(location, matrixChat) {
console.log(Date.now() + "Routing URL " + location);
console.log(Date.now() + ` routing URL '${location}'`);
const s = getScreenFromLocation(location);
console.log("Showing screen", s);
console.log("Showing screen "+ s);
matrixChat.showScreen(s.screen, s.params);
}
@@ -136,6 +141,7 @@ describe('loading:', function () {
enableGuest={true}
onLoadCompleted={loadCompleteDefer.resolve}
initialScreenAfterLogin={getScreenFromLocation(windowLocation)}
makeRegistrationUrl={() => {throw new Error('Not implemented');}}
/>, parentDiv
);
@@ -151,6 +157,27 @@ describe('loading:', function () {
}, 0);
}
// set an expectation that we will get a call to /sync, then flush
// http requests until we do.
//
// returns a promise resolving to the received request
async function expectAndAwaitSync(response) {
response = response || {};
let syncRequest = null;
httpBackend.when('GET', '/sync')
.check((r) => {syncRequest = r;})
.respond(200, response);
console.log("waiting for /sync");
for (let attempts = 10; attempts > 0; attempts--) {
if (syncRequest) {
return syncRequest;
}
await httpBackend.flush();
}
throw new Error("Gave up waiting for /sync");
}
describe("Clean load with no stored credentials:", function() {
it('gives a login panel by default', function (done) {
loadApp();
@@ -221,8 +248,7 @@ describe('loading:', function () {
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
httpBackend.when('GET', '/sync').respond(200, {});
return httpBackend.flush();
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a room view
return awaitRoomView(matrixChat);
@@ -250,13 +276,12 @@ describe('loading:', function () {
it('shows a directory by default if we have no joined rooms', function(done) {
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
httpBackend.when('GET', '/sync').respond(200, {});
loadApp();
return awaitSyncingSpinner(matrixChat).then(() => {
// we got a sync spinner - let the sync complete
return httpBackend.flush();
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a directory
httpBackend.verifyNoOutstandingExpectation();
@@ -269,7 +294,6 @@ describe('loading:', function () {
it('shows a room view if we followed a room link', function(done) {
httpBackend.when('GET', '/pushrules').respond(200, {});
httpBackend.when('POST', '/filter').respond(200, { filter_id: 'fid' });
httpBackend.when('GET', '/sync').respond(200, {});
loadApp({
uriFragment: "#/room/!room:id",
@@ -277,7 +301,7 @@ describe('loading:', function () {
return awaitSyncingSpinner(matrixChat).then(() => {
// we got a sync spinner - let the sync complete
return httpBackend.flush();
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a room view
return awaitRoomView(matrixChat);
@@ -310,8 +334,7 @@ describe('loading:', function () {
return awaitSyncingSpinner(matrixChat);
}).then(() => {
// we got a sync spinner - let the sync complete
httpBackend.when('GET', '/sync').respond(200, {});
return httpBackend.flush();
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a directory
httpBackend.verifyNoOutstandingExpectation();
@@ -344,11 +367,10 @@ describe('loading:', function () {
}).then(() => {
return awaitSyncingSpinner(matrixChat);
}).then(() => {
httpBackend.when('GET', '/sync').check(function(req) {
expect(req.path).toMatch(new RegExp("^https://homeserver/"));
}).respond(200, {});
return httpBackend.flush();
}).then(() => {
return expectAndAwaitSync();
}).then((req) => {
expect(req.path).toMatch(new RegExp("^https://homeserver/"));
// once the sync completes, we should have a directory
httpBackend.verifyNoOutstandingExpectation();
ReactTestUtils.findRenderedComponentWithType(
@@ -379,8 +401,7 @@ describe('loading:', function () {
}).then(() => {
return awaitSyncingSpinner(matrixChat);
}).then(() => {
httpBackend.when('GET', '/sync').respond(200, {});
return httpBackend.flush();
return expectAndAwaitSync();
}).then(() => {
// once the sync completes, we should have a room view
return awaitRoomView(matrixChat);
@@ -450,7 +471,7 @@ function awaitSyncingSpinner(matrixChat, retryLimit, retryCount) {
retryCount = 0;
}
if (matrixChat.state.loading) {
if (matrixChat.state.loading || matrixChat.state.loggingIn) {
console.log(Date.now() + " Awaiting sync spinner: still loading.");
if (retryCount >= retryLimit) {
throw new Error("MatrixChat still not loaded after " +

View File

@@ -1,6 +1,6 @@
"use strict";
var q = require("q");
var expect = require('expect');
const q = require("q");
import expect from 'expect';
/**
* Construct a mock HTTP backend, heavily inspired by Angular.js.
@@ -9,23 +9,25 @@ var expect = require('expect');
function HttpBackend() {
this.requests = [];
this.expectedRequests = [];
var self = this;
const self = this;
// the request function dependency that the SDK needs.
this.requestFn = function(opts, callback) {
var realReq = new Request(opts.method, opts.uri, opts.body, opts.qs);
realReq.callback = callback;
console.log("HTTP backend received request: %s %s", opts.method, opts.uri);
self.requests.push(realReq);
const req = new Request(opts, callback);
console.log("HTTP backend received request: " + req);
self.requests.push(req);
var abort = function() {
var idx = self.requests.indexOf(realReq);
const abort = function() {
const idx = self.requests.indexOf(req);
if (idx >= 0) {
console.log("Aborting HTTP request: %s %s", opts.method, opts.uri);
console.log("Aborting HTTP request: %s %s", opts.method,
opts.uri);
self.requests.splice(idx, 1);
req.callback("aborted");
}
}
};
return {
abort: abort
abort: abort,
};
};
}
@@ -34,43 +36,61 @@ HttpBackend.prototype = {
* Respond to all of the requests (flush the queue).
* @param {string} path The path to flush (optional) default: all.
* @param {integer} numToFlush The number of things to flush (optional), default: all.
* @return {Promise} resolved when there is nothing left to flush.
* @param {integer=} waitTime The time (in ms) to wait for a request to happen.
* default: 5
*
* @return {Promise} resolves when there is nothing left to flush, with the
* number of requests flushed
*/
flush: function(path, numToFlush) {
var defer = q.defer();
var self = this;
var flushed = 0;
var triedWaiting = false;
flush: function(path, numToFlush, waitTime) {
const defer = q.defer();
const self = this;
let flushed = 0;
let triedWaiting = false;
if (waitTime === undefined) {
waitTime = 5;
}
console.log(
"HTTP backend flushing... (path=%s numToFlush=%s)", path, numToFlush
"HTTP backend flushing... (path=" + path
+ " numToFlush=" + numToFlush
+ " waitTime=" + waitTime
+ ")",
);
var tryFlush = function() {
const tryFlush = function() {
// if there's more real requests and more expected requests, flush 'em.
console.log(
" trying to flush queue => reqs=%s expected=%s [%s]",
self.requests.length, self.expectedRequests.length, path
" trying to flush queue => reqs=[" + self.requests
+ "] expected=[" + self.expectedRequests
+ "]",
);
if (self._takeFromQueue(path)) {
// try again on the next tick.
console.log(" flushed. Trying for more. [%s]", path);
flushed += 1;
if (numToFlush && flushed === numToFlush) {
console.log(" [%s] Flushed assigned amount: %s", path, numToFlush);
defer.resolve();
}
else {
console.log(" Flushed assigned amount:", numToFlush);
defer.resolve(flushed);
} else {
console.log(" flushed. Trying for more.");
setTimeout(tryFlush, 0);
}
}
else if (flushed === 0 && !triedWaiting) {
} else if (flushed === 0 && !triedWaiting) {
// we may not have made the request yet, wait a generous amount of
// time before giving up.
setTimeout(tryFlush, 5);
console.log(
" nothing to flush yet; waiting " + waitTime +
"ms for requests.")
setTimeout(tryFlush, waitTime);
triedWaiting = true;
}
else {
console.log(" no more flushes. [%s]", path);
defer.resolve();
} else {
if (flushed === 0) {
console.log(" nothing to flush; giving up");
} else {
console.log(
" no more flushes after flushing", flushed,
"requests",
);
}
defer.resolve(flushed);
}
};
@@ -85,14 +105,19 @@ HttpBackend.prototype = {
* @return {boolean} true if something was resolved.
*/
_takeFromQueue: function(path) {
var req = null;
var i, j;
var matchingReq, expectedReq, testResponse = null;
let req = null;
let i;
let j;
let matchingReq = null;
let expectedReq = null;
let testResponse = null;
for (i = 0; i < this.requests.length; i++) {
req = this.requests[i];
for (j = 0; j < this.expectedRequests.length; j++) {
expectedReq = this.expectedRequests[j];
if (path && path !== expectedReq.path) { continue; }
if (path && path !== expectedReq.path) {
continue;
}
if (expectedReq.method === req.method &&
req.path.indexOf(expectedReq.path) !== -1) {
if (!expectedReq.data || (JSON.stringify(expectedReq.data) ===
@@ -114,12 +139,12 @@ HttpBackend.prototype = {
}
testResponse = matchingReq.response;
console.log(" responding to %s", matchingReq.path);
var body = testResponse.body;
let body = testResponse.body;
if (Object.prototype.toString.call(body) == "[object Function]") {
body = body(req.path, req.data);
}
req.callback(
testResponse.err, testResponse.response, body
testResponse.err, testResponse.response, body,
);
matchingReq = null;
}
@@ -134,10 +159,10 @@ HttpBackend.prototype = {
* Makes sure that the SDK hasn't sent any more requests to the backend.
*/
verifyNoOutstandingRequests: function() {
var firstOutstandingReq = this.requests[0] || {};
const firstOutstandingReq = this.requests[0] || {};
expect(this.requests.length).toEqual(0,
"Expected no more HTTP requests but received request to " +
firstOutstandingReq.path
firstOutstandingReq.path,
);
},
@@ -145,12 +170,9 @@ HttpBackend.prototype = {
* Makes sure that the test doesn't have any unresolved requests.
*/
verifyNoOutstandingExpectation: function() {
var firstOutstandingExpectation = this.expectedRequests[0] || {};
expect(this.expectedRequests.length).toEqual(
0,
"Expected to see HTTP request for "
+ firstOutstandingExpectation.method
+ " " + firstOutstandingExpectation.path
const firstOutstandingExpectation = this.expectedRequests[0] || {};
expect(this.expectedRequests.length).toEqual(0,
"Expected to see HTTP request for " + firstOutstandingExpectation.path,
);
},
@@ -162,22 +184,36 @@ HttpBackend.prototype = {
* @return {Request} An expected request.
*/
when: function(method, path, data) {
var pendingReq = new Request(method, path, data);
const pendingReq = new ExpectedRequest(method, path, data);
this.expectedRequests.push(pendingReq);
return pendingReq;
}
},
};
function Request(method, path, data, queryParams) {
/**
* Represents the expectation of a request.
*
* <p>Includes the conditions to be matched against, the checks to be made,
* and the response to be returned.
*
* @constructor
* @param {string} method
* @param {string} path
* @param {object?} data
*/
function ExpectedRequest(method, path, data) {
this.method = method;
this.path = path;
this.data = data;
this.queryParams = queryParams;
this.callback = null;
this.response = null;
this.checks = [];
}
Request.prototype = {
ExpectedRequest.prototype = {
toString: function() {
return this.method + " " + this.path
},
/**
* Execute a check when this request has been satisfied.
* @param {Function} fn The function to execute.
@@ -198,10 +234,10 @@ Request.prototype = {
this.response = {
response: {
statusCode: code,
headers: {}
headers: {},
},
body: data,
err: null
err: null,
};
},
@@ -214,14 +250,62 @@ Request.prototype = {
this.response = {
response: {
statusCode: code,
headers: {}
headers: {},
},
body: null,
err: err
err: err,
};
},
};
/**
* Represents a request made by the app.
*
* @constructor
* @param {object} opts opts passed to request()
* @param {function} callback
*/
function Request(opts, callback) {
this.opts = opts;
this.callback = callback;
Object.defineProperty(this, 'method', {
get: function() {
return opts.method;
},
});
Object.defineProperty(this, 'path', {
get: function() {
return opts.uri;
},
});
Object.defineProperty(this, 'data', {
get: function() {
return opts.body;
},
});
Object.defineProperty(this, 'queryParams', {
get: function() {
return opts.qs;
},
});
Object.defineProperty(this, 'headers', {
get: function() {
return opts.headers || {};
},
});
}
Request.prototype = {
toString: function() {
return this.method + " " + this.path;
},
};
/**
* The HttpBackend class.
*/

View File

@@ -5,4 +5,4 @@
*/
var sdk = require('matrix-react-sdk');
sdk.loadSkin(require('component-index'));
sdk.loadSkin(require('../src/component-index'));

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
var notifications = require('notifications');
var notifications = require('../../../src/notifications');
var ContentRules = notifications.ContentRules;
var PushRuleVectorState = notifications.PushRuleVectorState;

View File

@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
var notifications = require('notifications');
var notifications = require('../../../src/notifications');
var prvs = notifications.PushRuleVectorState;

View File

@@ -10,7 +10,7 @@ module.exports = {
// We ship olm.js as a separate lump of javascript. This makes it get
// loaded via a separate <script/> tag in index.html (which loads it
// into the browser global `Olm`), and define it as an external below.
// into the browser global `Olm`, where js-sdk expects to find it).
//
// (we should probably make js-sdk load it asynchronously at some
// point, so that it doesn't block the pageload, but that is a separate
@@ -99,7 +99,6 @@ module.exports = {
},
},
externals: {
"olm": "Olm",
// Don't try to bundle electron: leave it as a commonjs dependency
// (the 'commonjs' here means it will output a 'require')
"electron": "commonjs electron",