From 03194e66b3b7d58847af7007253ccdac077cbd6d Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 00:14:16 +0100 Subject: [PATCH 01/28] actually wire up alwaysShowTimestamps --- src/components/structures/MessagePanel.js | 10 +++++++++- src/components/structures/TimelinePanel.js | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index d98a464aef..6b80223e42 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -87,6 +87,9 @@ module.exports = React.createClass({ // show twelve hour timestamps isTwelveHour: React.PropTypes.bool, + + // show timestamps always + alwaysShowTimestamps: React.PropTypes.bool, }, componentWillMount: function() { @@ -618,8 +621,13 @@ module.exports = React.createClass({ var style = this.props.hidden ? { display: 'none' } : {}; style.opacity = this.props.opacity; + var className = this.props.className + " mx_fadable"; + if (this.props.alwaysShowTimestamps) { + className += " mx_MessagePanel_alwaysShowTimestamps"; + } + return ( - From ad2c84375d150ed386d2b73634630794abec5643 Mon Sep 17 00:00:00 2001 From: nouts Date: Sat, 27 May 2017 10:08:13 +0000 Subject: [PATCH 02/28] Translated using Weblate (French) Currently translated at 57.3% (378 of 659 strings) Translation: Riot Web/matrix-react-sdk Translate-URL: https://translate.nordgedanken.de/projects/riot-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 2c77aee405..0ced014f14 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -371,5 +371,15 @@ "NOT verified": "NON vérifié", "No devices with registered encryption keys": "Pas d’appareil avec des clés d’encryption enregistrées", "No more results": "Fin des résultats", - "No results": "Pas de résultats" + "No results": "Pas de résultats", + "unknown error code": "Code erreur inconnu", + "OK": "OK", + "Once encryption is enabled for a room it cannot be turned off again (for now)": "Une fois le chiffrement activé dans un salon il ne peut pas être désactivé (pour le moment)", + "Only people who have been invited": "Seul les personnes ayant été invitées", + "or": "ou", + "Password": "Mot de passe", + "Passwords can't be empty": "Le mot de passe ne peut pas être vide", + "People": "Personne", + "Permissions": "Permissions", + "Phone": "Téléphone" } From b8b6a874239a49e528c3f95a3afe74e3bf12188a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 13:58:20 +0100 Subject: [PATCH 03/28] fixing missing EN translation --- src/i18n/strings/en_EN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f317c6a08a..f8a0cb16eb 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -407,6 +407,7 @@ "Sender device information": "Sender device information", "Send Invites": "Send Invites", "Send Reset Email": "Send Reset Email", + "sent an image": "sent an image", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s sent an image.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.", "sent a video": "sent a video", From 0cacf5b1a0e8807ffa9dee250c619bad563e46aa Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 14:54:05 +0100 Subject: [PATCH 04/28] script to make punctuation consistent in i18n strings --- scripts/fix-i18n.pl | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 scripts/fix-i18n.pl diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl new file mode 100755 index 0000000000..6afc93e05e --- /dev/null +++ b/scripts/fix-i18n.pl @@ -0,0 +1,77 @@ +#!/usr/bin/perl -ni + +use strict; +use warnings; + +# script which synchronises i18n strings to include punctuation. +# i've cherry-picked ones which seem to have diverged between the different translations +# from TextForEvent, causing missing events all over the place + +BEGIN { +$::fixups = [split(/\n/, < Date: Sat, 27 May 2017 14:55:55 +0100 Subject: [PATCH 05/28] standardise i18n TextForEvent to include punctuation. fixes lots of missing & inconsistent strings, as somehow some of the i18n files had ended up with the raw strings being inconsistent in terms of punctuation, causing problems as per https://github.com/vector-im/riot-web/issues/4045 --- src/TextForEvent.js | 30 +++++++++++++++--------------- src/i18n/strings/da.json | 2 +- src/i18n/strings/de_DE.json | 28 ++++++++++++++-------------- src/i18n/strings/en_EN.json | 28 ++++++++++++++-------------- src/i18n/strings/fr.json | 18 +++++++++--------- src/i18n/strings/pt.json | 30 +++++++++++++++--------------- src/i18n/strings/pt_BR.json | 28 ++++++++++++++-------------- src/i18n/strings/ru.json | 26 +++++++++++++------------- 8 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 2d53c5db9f..48a2a7cccc 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -39,7 +39,7 @@ function textForMemberEvent(ev) { } else { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { - return _t('%(senderName)s requested a VoIP conference', {senderName: senderName}); + return _t('%(senderName)s requested a VoIP conference.', {senderName: senderName}); } else { return _t('%(senderName)s invited %(targetName)s.', {senderName: senderName, targetName: targetName}); @@ -53,17 +53,17 @@ function textForMemberEvent(ev) { case 'join': if (ev.getPrevContent() && ev.getPrevContent().membership == 'join') { if (ev.getPrevContent().displayname && ev.getContent().displayname && ev.getPrevContent().displayname != ev.getContent().displayname) { - return _t('%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s', {senderName: ev.getSender(), oldDisplayName: ev.getPrevContent().displayname, displayName: ev.getContent().displayname}); + return _t('%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.', {senderName: ev.getSender(), oldDisplayName: ev.getPrevContent().displayname, displayName: ev.getContent().displayname}); } else if (!ev.getPrevContent().displayname && ev.getContent().displayname) { - return _t('%(senderName)s set their display name to %(displayName)s', {senderName: ev.getSender(), displayName: ev.getContent().displayname}); + return _t('%(senderName)s set their display name to %(displayName)s.', {senderName: ev.getSender(), displayName: ev.getContent().displayname}); } else if (ev.getPrevContent().displayname && !ev.getContent().displayname) { - return _t('%(senderName)s removed their display name (%(oldDisplayName)s)', {senderName: ev.getSender(), oldDisplayName: ev.getPrevContent().displayname}); + return _t('%(senderName)s removed their display name (%(oldDisplayName)s).', {senderName: ev.getSender(), oldDisplayName: ev.getPrevContent().displayname}); } else if (ev.getPrevContent().avatar_url && !ev.getContent().avatar_url) { - return _t('%(senderName)s removed their profile picture', {senderName: senderName}); + return _t('%(senderName)s removed their profile picture.', {senderName: senderName}); } else if (ev.getPrevContent().avatar_url && ev.getContent().avatar_url && ev.getPrevContent().avatar_url != ev.getContent().avatar_url) { - return _t('%(senderName)s changed their profile picture', {senderName: senderName}); + return _t('%(senderName)s changed their profile picture.', {senderName: senderName}); } else if (!ev.getPrevContent().avatar_url && ev.getContent().avatar_url) { - return _t('%(senderName)s set a profile picture', {senderName: senderName}); + return _t('%(senderName)s set a profile picture.', {senderName: senderName}); } else { // suppress null rejoins return ''; @@ -71,7 +71,7 @@ function textForMemberEvent(ev) { } else { if (!ev.target) console.warn("Join message has no target! -- " + ev.getContent().state_key); if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { - return _t('VoIP conference started'); + return _t('VoIP conference started.'); } else { return _t('%(targetName)s joined the room.', {targetName: targetName}); @@ -80,7 +80,7 @@ function textForMemberEvent(ev) { case 'leave': if (ev.getSender() === ev.getStateKey()) { if (ConferenceHandler && ConferenceHandler.isConferenceUser(ev.getStateKey())) { - return _t('VoIP conference finished'); + return _t('VoIP conference finished.'); } else if (ev.getPrevContent().membership === "invite") { return _t('%(targetName)s rejected the invitation.', {targetName: targetName}); @@ -112,13 +112,13 @@ function textForMemberEvent(ev) { function textForTopicEvent(ev) { var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - return _t('%(senderDisplayName)s changed the topic to "%(topic)s"', {senderDisplayName: senderDisplayName, topic: ev.getContent().topic}); + return _t('%(senderDisplayName)s changed the topic to "%(topic)s".', {senderDisplayName: senderDisplayName, topic: ev.getContent().topic}); } function textForRoomNameEvent(ev) { var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - return _t('%(senderDisplayName)s changed the room name to %(roomName)s', {senderDisplayName: senderDisplayName, roomName: ev.getContent().name}); + return _t('%(senderDisplayName)s changed the room name to %(roomName)s.', {senderDisplayName: senderDisplayName, roomName: ev.getContent().name}); } function textForMessageEvent(ev) { @@ -135,13 +135,13 @@ function textForMessageEvent(ev) { function textForCallAnswerEvent(event) { var senderName = event.sender ? event.sender.name : _t('Someone'); var supported = MatrixClientPeg.get().supportsVoip() ? "" : _t('(not supported by this browser)'); - return _t('%(senderName)s answered the call', {senderName: senderName}) + ' ' + supported; + return _t('%(senderName)s answered the call.', {senderName: senderName}) + ' ' + supported; } function textForCallHangupEvent(event) { var senderName = event.sender ? event.sender.name : _t('Someone'); var supported = MatrixClientPeg.get().supportsVoip() ? "" : _t('(not supported by this browser)'); - return _t('%(senderName)s ended the call', {senderName: senderName}) + ' ' + supported; + return _t('%(senderName)s ended the call.', {senderName: senderName}) + ' ' + supported; } function textForCallInviteEvent(event) { @@ -186,7 +186,7 @@ function textForHistoryVisibilityEvent(event) { function textForEncryptionEvent(event) { var senderName = event.sender ? event.sender.name : event.getSender(); - return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)', {senderName: senderName, algorithm: event.getContent().algorithm}); + return _t('%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).', {senderName: senderName, algorithm: event.getContent().algorithm}); } // Currently will only display a change if a user's power level is changed @@ -224,7 +224,7 @@ function textForPowerEvent(event) { if (!diff.length) { return ''; } - return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s', {senderName: senderName, powerLevelDiffText: diff.join(", ")}); + return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', {senderName: senderName, powerLevelDiffText: diff.join(", ")}); } var handlers = { diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 72e0ae60c2..af6f0bb0fe 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -132,7 +132,7 @@ "de": "Tysk", "da": "Dansk", "ru": "Russisk", - "%(targetName)s accepted an invitation": "%(targetName)s accepterede en invitation", + "%(targetName)s accepted an invitation.": "%(targetName)s accepterede en invitation.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepteret invitationen til %(displayName)s.", "%(names)s and %(lastPerson)s are typing": "%(names)s og %(lastPerson)s er ved at skrive", "%(names)s and one other are typing": "%(names)s og den anden skriver", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index ed2d127771..0d14a80e81 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -258,8 +258,8 @@ "Verification Pending": "Verifizierung ausstehend", "Video call": "Videoanruf", "Voice call": "Sprachanruf", - "VoIP conference finished": "VoIP-Konferenz beendet", - "VoIP conference started": "VoIP-Konferenz gestartet", + "VoIP conference finished.": "VoIP-Konferenz beendet.", + "VoIP conference started.": "VoIP-Konferenz gestartet.", "(warning: cannot be disabled again!)": "(Warnung: Kann nicht wieder deaktiviert werden!)", "was banned": "wurde gebannt", "was invited": "wurde eingeladen", @@ -348,19 +348,19 @@ "Encrypt room": "Entschlüssele Raum", "To send events of type": "Zum Senden von Ereignissen mit Typ", "%(names)s and %(lastPerson)s are typing": "%(names)s und %(lastPerson)s schreiben", - "%(targetName)s accepted an invitation": "%(targetName)s akzeptierte eine Einladung", + "%(targetName)s accepted an invitation.": "%(targetName)s akzeptierte eine Einladung.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s akzeptierte eine Einladung für %(displayName)s.", "%(names)s and one other are typing": "%(names)s und eine weitere Person tippen", "%(names)s and %(count)s others are typing": "%(names)s und %(count)s weitere Personen tippen", "%(senderName)s answered the call.": "%(senderName)s beantwortete den Anruf.", "%(senderName)s banned %(targetName)s.": "%(senderName)s bannte %(targetName)s.", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s änderte den Anzeigenamen von %(oldDisplayName)s zu %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s änderte das Profilbild", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s änderte das Berechtigungslevel von %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s änderte den Anzeigenamen von %(oldDisplayName)s zu %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s änderte das Profilbild.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s änderte das Berechtigungslevel von %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s änderte das Thema zu \"%(topic)s\"", "/ddg is not a command": "/ddg ist kein Kommando", - "%(senderName)s ended the call": "%(senderName)s beendete den Anruf", + "%(senderName)s ended the call.": "%(senderName)s beendete den Anruf.", "Failed to lookup current room": "Aktuellen Raum nachzuschlagen schlug fehl", "Failed to send request.": "Anfrage zu senden schlug fehl.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", @@ -379,18 +379,18 @@ "Power level must be positive integer.": "Berechtigungslevel muss eine positive Zahl sein.", "Reason": "Grund", "%(targetName)s rejected the invitation.": "%(targetName)s lehnte die Einladung ab.", - "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s löschte den Anzeigenamen (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture": "%(senderName)s löschte das Profilbild", - "%(senderName)s requested a VoIP conference": "%(senderName)s fragte nach einer VoIP-Konferenz", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s löschte den Anzeigenamen (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s löschte das Profilbild.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s fragte nach einer VoIP-Konferenz.", "Room %(roomId)s not visible": "Raum %(roomId)s ist nicht sichtbar", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s hat ein Bild gesendet.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s sandte eine Einladung an %(targetDisplayName)s um diesem Raum beizutreten.", - "%(senderName)s set a profile picture": "%(senderName)s setzte ein Profilbild", - "%(senderName)s set their display name to %(displayName)s": "%(senderName)s setzte den Anzeigenamen zu %(displayName)s", + "%(senderName)s set a profile picture.": "%(senderName)s setzte ein Profilbild.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s setzte den Anzeigenamen zu %(displayName)s.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.", "These are experimental features that may break in unexpected ways": "Dies sind experimentelle Funktionen, die in unerwarteter Weise Fehler verursachen können", "To use it, just wait for autocomplete results to load and tab through them.": "Um dies zu nutzen, warte auf die Autovervollständigungsergebnisse und benutze die TAB Taste.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)": "%(senderName)s schaltete Ende-zu-Ende-Verschlüsselung ein (Algorithmus: %(algorithm)s)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s schaltete Ende-zu-Ende-Verschlüsselung ein (Algorithmus: %(algorithm)s).", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s zog Bann für %(targetName)s zurück.", "Usage": "Verwendung", "Use with caution": "Mit Vorsicht benutzen", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f8a0cb16eb..1d55f11c3c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -124,7 +124,7 @@ "A registered account is required for this action": "A registered account is required for this action", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", "accept": "accept", - "%(targetName)s accepted an invitation": "%(targetName)s accepted an invitation", + "%(targetName)s accepted an invitation.": "%(targetName)s accepted an invitation.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s accepted the invitation for %(displayName)s.", "Account": "Account", "Access Token:": "Access Token:", @@ -172,10 +172,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or %(urlStart)s enable unsafe scripts %(urlEnd)s": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or %(urlStart)s enable unsafe scripts %(urlEnd)s", "Can't load user settings": "Can't load user settings", "Change Password": "Change Password", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s changed their profile picture", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s changed the power level of %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s changed the room name to %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s changed the topic to \"%(topic)s\"", "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", @@ -235,7 +235,7 @@ "Enable encryption": "Enable encryption", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Encrypted messages will not be visible on clients that do not yet implement encryption", "Encrypted room": "Encrypted room", - "%(senderName)s ended the call": "%(senderName)s ended the call", + "%(senderName)s ended the call.": "%(senderName)s ended the call.", "End-to-end encryption information": "End-to-end encryption information", "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable", "Enter Code": "Enter Code", @@ -381,10 +381,10 @@ "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", "Reject invitation": "Reject invitation", "Remove Contact Information?": "Remove Contact Information?", - "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s removed their display name (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture": "%(senderName)s removed their profile picture", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", "Remove": "Remove", - "%(senderName)s requested a VoIP conference": "%(senderName)s requested a VoIP conference", + "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", "Report it": "Report it", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved", "restore": "restore", @@ -418,8 +418,8 @@ "Server may be unavailable, overloaded, or you hit a bug": "Server may be unavailable, overloaded, or you hit a bug", "Server unavailable, overloaded, or something else went wrong": "Server unavailable, overloaded, or something else went wrong", "Session ID": "Session ID", - "%(senderName)s set a profile picture": "%(senderName)s set a profile picture", - "%(senderName)s set their display name to %(displayName)s": "%(senderName)s set their display name to %(displayName)s", + "%(senderName)s set a profile picture.": "%(senderName)s set a profile picture.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s set their display name to %(displayName)s.", "Settings": "Settings", "Show panel": "Show panel", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Show timestamps in 12 hour format (e.g. 2:30pm)", @@ -483,7 +483,7 @@ "Tried to load a specific point in this room's timeline, but was unable to find it": "Tried to load a specific point in this room's timeline, but was unable to find it", "Turn Markdown off": "Turn Markdown off", "Turn Markdown on": "Turn Markdown on", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).", "Unable to add email address": "Unable to add email address", "Unable to remove contact information": "Unable to remove contact information", "Unable to restore previous session": "Unable to restore previous session", @@ -517,8 +517,8 @@ "verified": "verified", "Video call": "Video call", "Voice call": "Voice call", - "VoIP conference finished": "VoIP conference finished", - "VoIP conference started": "VoIP conference started", + "VoIP conference finished.": "VoIP conference finished.", + "VoIP conference started.": "VoIP conference started.", "VoIP is unsupported": "VoIP is unsupported", "(warning: cannot be disabled again!)": "(warning: cannot be disabled again!)", "Warning!": "Warning!", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 0ced014f14..0a20bc1a87 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -137,7 +137,7 @@ "Enable encryption": "Activer l'encryption", "Encrypted messages will not be visible on clients that do not yet implement encryption": "Les messages encryptés ne seront pas visibles dans les clients qui n’implémentent pas encore l’encryption", "Encrypted room": "Salon encrypté", - "%(senderName)s ended the call": "%(senderName)s a terminé l’appel", + "%(senderName)s ended the call.": "%(senderName)s a terminé l’appel.", "End-to-end encryption information": "Information sur l'encryption bout-en-bout", "End-to-end encryption is in beta and may not be reliable": "L’encryption bout-en-bout est en béta et risque de ne pas être fiable", "Enter Code": "Entrer le code", @@ -173,8 +173,8 @@ "Failed to join the room": "Échec de l'adhésion au salon", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "Un message texte a été envoyé à +%(msisdn)s. Merci d'entrer le code de vérification qu'il contient", "accept": "Accepter", - "%(targetName)s accepted an invitation": "%(targetName)s a accepté une invitation", - "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s a accepté une invitation de %(displayName)s", + "%(targetName)s accepted an invitation.": "%(targetName)s a accepté une invitation.", + "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s a accepté une invitation de %(displayName)s.", "Account": "Compte", "Add email address": "Ajouter une adresse e-mail", "Add phone number": "Ajouter un numéro de téléphone", @@ -196,7 +196,7 @@ "%(names)s and %(count)s others are typing": "%(names)s et %(count)s d'autres sont en train de taper", "An email has been sent to": "Un e-mail a été envoyé à", "A new password must be entered.": "Un nouveau mot de passe doit être entré.", - "%(senderName)s answered the call": "%(senderName)s a répondu à l’appel", + "%(senderName)s answered the call.": "%(senderName)s a répondu à l’appel.", "Anyone who knows the room's link, apart from guests": "Tout ceux qui connaissent le lien du salon, à part les invités", "Anyone who knows the room's link, including guests": "Tout ceux qui connaissent le lien du salon, y compris les invités", "Are you sure?": "Êtes-vous sûr ?", @@ -204,7 +204,7 @@ "Are you sure you want upload the following files?": "Êtes-vous sûr de vouloir télécharger les fichiers suivants ?", "Attachment": "Pièce jointe", "Autoplay GIFs and videos": "Jouer automatiquement les GIFs et vidéos", - "%(senderName)s banned %(targetName)s": "%(senderName)s a banni %(targetName)s", + "%(senderName)s banned %(targetName)s.": "%(senderName)s a banni %(targetName)s.", "Ban": "Bannir", "Banned users": "Utilisateurs bannis", "Bans user with given id": "Utilisateurs bannis avec un identifiant donné", @@ -215,10 +215,10 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or %(urlStart)s enable unsafe scripts %(urlEnd)s": "Impossible de se connecter au homeserver en HTTP si l'URL dans la barre de votre explorateur est en HTTPS. Utilisez HTTPS ou %(urlStart)s activez le support des scripts non-vérifiés %(urlEnd)s", "Can't load user settings": "Impossible de charger les paramètres utilisateur", "Change Password": "Changer le mot de passe", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s a changé son nom d’affichage de %(oldDisplayName)s en %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s a changé sa photo de profil", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s a changé le niveau de pouvoir de %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s a changé son nom d’affichage de %(oldDisplayName)s en %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s a changé sa photo de profil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le niveau de pouvoir de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s a changé le sujet du salon en \"%(topic)s\"", "Changes to who can read history will only apply to future messages in this room": "Les changements de visibilité de l’historique de ce salon ne s’appliquent qu’aux messages futurs", "Changes your display nickname": "Change votre nom d'affichage", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 356510a94a..fc4b32f929 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -254,8 +254,8 @@ "verified": "verificado", "Video call": "Chamada de vídeo", "Voice call": "Chamada de voz", - "VoIP conference finished": "Conferência VoIP encerrada", - "VoIP conference started": "Conferência VoIP iniciada", + "VoIP conference finished.": "Conferência VoIP encerrada.", + "VoIP conference started.": "Conferência VoIP iniciada.", "(warning: cannot be disabled again!)": "(atenção: esta operação não poderá ser desfeita depois!)", "Warning!": "Atenção!", "was banned": "banida/o", @@ -304,7 +304,7 @@ "de": "Alemão", "da": "Dinamarquês", "ru": "Russo", - "%(targetName)s accepted an invitation": "%(targetName)s aceitou um convite.", + "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "all room members, from the point they are invited": "todas/os as/os integrantes da sala, a partir do momento em que foram convidadas/os", "all room members, from the point they joined": "todas/os as/os integrantes da sala, a partir do momento em que entraram na sala", @@ -315,10 +315,10 @@ "anyone.": "qualquer pessoa", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s alterou sua imagem de perfil", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s alterou o tópico para \"%(topic)s\"", "click to reveal": "clique para ver", "Conference call failed": "Chamada de conferência falhou", @@ -328,7 +328,7 @@ "/ddg is not a command": "/ddg não é um comando", "Drop here %(toAction)s": "Arraste aqui %(toAction)s", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", - "%(senderName)s ended the call": "%(senderName)s finalizou a chamada", + "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to lookup current room": "Não foi possível buscar na sala atual", "Failed to send email": "Não foi possível enviar email", @@ -342,7 +342,7 @@ "%(displayName)s is typing": "%(displayName)s está escrevendo", "%(targetName)s joined the room.": "%(targetName)s entrou na sala.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", - "%(targetName)s left the room": "%(targetName)s saiu da sala", + "%(targetName)s left the room.": "%(targetName)s saiu da sala.", "%(senderName)s made future room history visible to": "%(senderName)s deixou o histórico futuro da sala visível para", "Missing room_id in request": "Faltou o id da sala na requisição", "Missing user_id in request": "Faltou o id de usuário na requisição", @@ -356,16 +356,16 @@ "Reason": "Razão", "Refer a friend to Riot": "Recomende Riot a um/a amigo/a", "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", - "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture": "%(senderName)s removeu sua imagem de perfil", - "%(senderName)s requested a VoIP conference": "%(senderName)s está solicitando uma conferência de voz", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", - "%(senderName)s set a profile picture": "%(senderName)s definiu uma imagem de perfil", - "%(senderName)s set their display name to %(displayName)s": "%(senderName)s definiu seu nome público para %(displayName)s", + "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "tag as %(tagName)s": "marcar como %(tagName)s", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", @@ -384,7 +384,7 @@ "to start a chat with someone": "para iniciar uma conversa com alguém", "to tag direct chat": "para marcar a conversa como pessoal", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", "Unable to restore previous session": "Não foi possível restaurar a sessão anterior", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 8f9bb015a0..7cdecb3189 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -259,8 +259,8 @@ "verified": "verificado", "Video call": "Chamada de vídeo", "Voice call": "Chamada de voz", - "VoIP conference finished": "Conferência VoIP encerrada", - "VoIP conference started": "Conferência VoIP iniciada", + "VoIP conference finished.": "Conferência VoIP encerrada.", + "VoIP conference started.": "Conferência VoIP iniciada.", "(warning: cannot be disabled again!)": "(atenção: esta operação não poderá ser desfeita depois!)", "Warning": "Atenção!", "was banned": "banida/o", @@ -309,7 +309,7 @@ "de": "Alemão", "da": "Dinamarquês", "ru": "Russo", - "%(targetName)s accepted an invitation": "%(targetName)s aceitou um convite", + "%(targetName)s accepted an invitation.": "%(targetName)s aceitou um convite.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s aceitou o convite para %(displayName)s.", "all room members, from the point they are invited": "todas/os as/os integrantes da sala, a partir do momento em que foram convidadas/os", "all room members, from the point they joined": "todas/os as/os integrantes da sala, a partir do momento em que entraram na sala", @@ -320,10 +320,10 @@ "anyone.": "qualquer pessoa", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s alterou sua imagem de perfil", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", "click to reveal": "clique para ver", "Conference call failed": "Chamada de conferência falhou", "Conference calling is in development and may not be reliable": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar", @@ -332,7 +332,7 @@ "/ddg is not a command": "/ddg não é um comando", "Drop here %(toAction)s": "Arraste aqui %(toAction)s", "Drop here to tag %(section)s": "Arraste aqui para marcar como %(section)s", - "%(senderName)s ended the call": "%(senderName)s finalizou a chamada", + "%(senderName)s ended the call.": "%(senderName)s finalizou a chamada.", "Existing Call": "Chamada em andamento", "Failed to lookup current room": "Não foi possível buscar na sala atual", "Failed to send email": "Não foi possível enviar email", @@ -360,16 +360,16 @@ "Reason": "Razão", "Refer a friend to Riot": "Recomende Riot a um/a amigo/a", "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", - "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture": "%(senderName)s removeu sua imagem de perfil", - "%(senderName)s requested a VoIP conference": "%(senderName)s está solicitando uma conferência de voz", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s está solicitando uma conferência de voz.", "Riot does not have permission to send you notifications - please check your browser settings": "Riot não tem permissões para enviar notificações a você - por favor, verifique as configurações do seu navegador", "Riot was not given permission to send notifications - please try again": "Riot não tem permissões para enviar notificações a você - por favor, tente novamente", "Room %(roomId)s not visible": "A sala %(roomId)s não está visível", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s enviou uma imagem.", "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s enviou um convite para %(targetDisplayName)s entrar na sala.", - "%(senderName)s set a profile picture": "%(senderName)s definiu uma imagem de perfil", - "%(senderName)s set their display name to %(displayName)s": "%(senderName)s definiu seu nome público para %(displayName)s", + "%(senderName)s set a profile picture.": "%(senderName)s definiu uma imagem de perfil.", + "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s definiu seu nome público para %(displayName)s.", "tag as %(tagName)s": "marcar como %(tagName)s", "This email address is already in use": "Este endereço de email já está sendo usado", "This email address was not found": "Este endereço de email não foi encontrado", @@ -389,7 +389,7 @@ "to tag as %(tagName)s": "para marcar como %(tagName)s", "to tag direct chat": "para marcar a conversa como pessoal", "To use it, just wait for autocomplete results to load and tab through them.": "Para usar esta funcionalidade, espere o carregamento dos resultados de autocompletar e então escolha entre as opções.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s ativou criptografia ponta a ponta (algoritmo %(algorithm)s).", "Unable to restore previous session": "Não foi possível restaurar a sessão anterior", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s desfez o banimento de %(targetName)s.", "Unable to capture screen": "Não foi possível capturar a imagem da tela", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index d17d4723c5..b34c633f94 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -188,8 +188,8 @@ "verified": "проверенный", "Video call": "Видио вызов", "Voice call": "Голосовой вызов", - "VoIP conference finished": "VoIP конференция закончилась", - "VoIP conference started": "VoIP Конференция стартовала", + "VoIP conference finished.": "VoIP конференция закончилась.", + "VoIP conference started.": "VoIP Конференция стартовала.", "(warning: cannot be disabled again!)": "(предупреждение: не может быть снова отключен!)", "Warning!": "Предупреждение!", "was banned": "запрещен", @@ -216,7 +216,7 @@ "de": "Немецкий", "da": "Датский", "ru": "Русский", - "%(targetName)s accepted an invitation": "%(targetName)s принял приглашение", + "%(targetName)s accepted an invitation.": "%(targetName)s принял приглашение.", "%(targetName)s accepted the invitation for %(displayName)s.": "%(targetName)s принял приглашение от %(displayName)s.", "Resend all": "Переслать снова всем", "cancel all": "отменить всем", @@ -227,10 +227,10 @@ "%(senderName)s answered the call.": "%(senderName)s ответил на звонок.", "%(senderName)s banned %(targetName)s.": "%(senderName)s запрещенный %(targetName)s.", "Call Timeout": "Время ожидания вызова", - "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s": "%(senderName)s их имя измененное с %(oldDisplayName)s на %(displayName)s", - "%(senderName)s changed their profile picture": "%(senderName)s измененное ихнее фото профиля", - "%(senderName)s changed the power level of %(powerLevelDiffText)s": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s", - "%(senderDisplayName)s changed the room name to %(roomName)s": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s", + "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s их имя измененное с %(oldDisplayName)s на %(displayName)s.", + "%(senderName)s changed their profile picture.": "%(senderName)s измененное ихнее фото профиля.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s измененная тема на %(topic)s", "Conference call failed": "Конференц-вызов прервался", "Conference calling is in development and may not be reliable": "Конференц-вызов находится в процессе и может не быть надежным", @@ -239,7 +239,7 @@ "/ddg is not a command": "/ddg не команда", "Drop here %(toAction)s": "Вставить здесь %(toAction)s", "Drop here to tag %(section)s": "Вставить здесь для тега %(section)s", - "%(senderName)s ended the call": "%(senderName)s прекратил звонок", + "%(senderName)s ended the call.": "%(senderName)s прекратил звонок.", "Existing Call": "Существующий вызов", "Failed to lookup current room": "Не удалось выполнить поиск текущий комнаты", "Failed to send request.": "Не удалось выслать запрос.", @@ -251,7 +251,7 @@ "click to reveal": "нажать для открытия", "%(senderName)s invited %(targetName)s.": "%(senderName)s приглашает %(targetName)s.", "%(displayName)s is typing": "%(displayName)s вводит текст", - "%(targetName)s joined the room": "%(targetName)s присоединенный к комнате", + "%(targetName)s joined the room.": "%(targetName)s присоединенный к комнате.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s выкинул %(targetName)s.", "%(targetName)s left the room.": "%(targetName)s покинул комнату.", "%(senderName)s made future room history visible to": "%(senderName)s история сделаной будущей комнаты, видимая для", @@ -390,7 +390,7 @@ "to start a chat with someone": "Начать чат с кем-то", "to tag direct chat": "Пометить прямой чат", "To use it, just wait for autocomplete results to load and tab through them.": "Для его использования, просто подождите результатов автозаполнения для загрузки на вкладке и через них.", - "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s)": "%(senderName)s включил сквозное шифрование (algorithm %(algorithm)s)", + "%(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s).": "%(senderName)s включил сквозное шифрование (algorithm %(algorithm)s).", "Unable to restore previous session": "Невозможно востановить предыдущий сеанс", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s запрет отменен %(targetName)s.", "Unable to capture screen": "Невозможно записать снимок экрана", @@ -537,9 +537,9 @@ "%(targetName)s rejected the invitation.": "%(targetName)s отклонил приглашение.", "Reject invitation": "Отклонить приглашение", "Remove Contact Information?": "Убрать контактную информацию?", - "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s убрал своё отображаемое имя (%(oldDisplayName)s)", - "%(senderName)s removed their profile picture": "%(senderName)s убрал своё изображение", - "%(senderName)s requested a VoIP conference": "%(senderName)s запросил голосовую конференц-связь", + "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s убрал своё отображаемое имя (%(oldDisplayName)s).", + "%(senderName)s removed their profile picture.": "%(senderName)s убрал своё изображение.", + "%(senderName)s requested a VoIP conference.": "%(senderName)s запросил голосовую конференц-связь.", "Report it": "Сообщить об этом", "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "На данный момент сброс пароля сбросит все ключи шифрования на всех устройствах, зашифрованная история общения будет нечитаема, если вы сперва не скачаете ваши ключи от комнаты и не загрузите их после. В будущем это будет улучшено", "restore": "восстановить", From 398ad4798ec4b108bdfa54388d353f843588ec1e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 14:57:52 +0100 Subject: [PATCH 06/28] fix string typo --- src/TextForEvent.js | 2 +- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- src/i18n/strings/ru.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 48a2a7cccc..a1b13035ba 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -100,7 +100,7 @@ function textForMemberEvent(ev) { } else if (ev.getPrevContent().membership === "invite") { return _t( - '%(senderName)s withdrew %(targetName)s\'s inivitation.', + '%(senderName)s withdrew %(targetName)s\'s invitation.', {senderName: senderName, targetName: targetName} ) + ' ' + reason; } diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0d14a80e81..6ddbee0eb1 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -394,7 +394,7 @@ "%(senderName)s unbanned %(targetName)s.": "%(senderName)s zog Bann für %(targetName)s zurück.", "Usage": "Verwendung", "Use with caution": "Mit Vorsicht benutzen", - "%(senderName)s withdrew %(targetName)s's inivitation.": "%(senderName)s zog die Einladung für %(targetName)s zurück.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s zog die Einladung für %(targetName)s zurück.", "You need to be able to invite users to do that.": "Du musst in der Lage sein Nutzer einzuladen um dies zu tun.", "You need to be logged in.": "Du musst angemeldet sein.", "There are no visible files in this room": "Es gibt keine sichtbaren Dateien in diesem Raum", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1d55f11c3c..d2e2618869 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -526,7 +526,7 @@ "Who can read history?": "Who can read history?", "Who would you like to add to this room?": "Who would you like to add to this room?", "Who would you like to communicate with?": "Who would you like to communicate with?", - "%(senderName)s withdrew %(targetName)s's inivitation.": "%(senderName)s withdrew %(targetName)s's inivitation.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s withdrew %(targetName)s's invitation.", "Would you like to": "Would you like to", "You are already in a call": "You are already in a call", "You're not in any rooms yet! Press": "You're not in any rooms yet! Press", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index fc4b32f929..66ca428aeb 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -393,7 +393,7 @@ "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", - "%(senderName)s withdrew %(targetName)s's inivitation.": "%(senderName)s desfez o convite a %(targetName)s's.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s's.", "You are already in a call": "Você já está em uma chamada", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 7cdecb3189..d371ac51dc 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -398,7 +398,7 @@ "Usage": "Uso", "Use with caution": "Use com cautela", "VoIP is unsupported": "Chamada de voz não permitida", - "%(senderName)s withdrew %(targetName)s's inivitation.": "%(senderName)s desfez o convite a %(targetName)s.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s desfez o convite a %(targetName)s.", "You are already in a call": "Você já está em uma chamada", "You're not in any rooms yet! Press": "Você ainda não está em nenhuma sala! Pressione", "You are trying to access %(roomName)s": "Você está tentando acessar a sala %(roomName)s", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index b34c633f94..bf506c60e0 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -364,7 +364,7 @@ "You're not in any rooms yet! Press": "Вы еще не находитесь ни в каких комнатах! Нажать", "You are trying to access %(roomName)s": "Вы пытаетесь получить доступ %(roomName)s", "You cannot place a call with yourself": "Вы не можете позвонить самим себе", - "%(senderName)s withdrew %(targetName)s's inivitation.": "%(senderName)s анулировал %(targetName)s's преглашение.", + "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s анулировал %(targetName)s's преглашение.", "Sep": "Сен.", "Jan": "Янв.", "Feb": "Фев.", From 6d6b14a26ca4bdb90cc878a00bc7f9574d2d039c Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 15:52:24 +0100 Subject: [PATCH 07/28] fix spurious missing translation ('Default') --- src/TextForEvent.js | 11 +++++++++-- src/i18n/strings/en_EN.json | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index a1b13035ba..169868e812 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -217,14 +217,21 @@ function textForPowerEvent(event) { const to = event.getContent().users[userId]; if (to !== from) { diff.push( - _t('%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s', {userId: userId, fromPowerLevel: Roles.textualPowerLevel(from, userDefault), toPowerLevel: Roles.textualPowerLevel(to, userDefault)}) + _t('%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s', { + userId: userId, + fromPowerLevel: Roles.textualPowerLevel(from, userDefault), + toPowerLevel: Roles.textualPowerLevel(to, userDefault) + }) ); } }); if (!diff.length) { return ''; } - return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', {senderName: senderName, powerLevelDiffText: diff.join(", ")}); + return _t('%(senderName)s changed the power level of %(powerLevelDiffText)s.', { + senderName: senderName, + powerLevelDiffText: diff.join(", ") + }); } var handlers = { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d2e2618869..b16800fb04 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -214,6 +214,7 @@ "Delete": "Delete", "demote": "demote", "Deops user with given id": "Deops user with given id", + "Default": "Default", "Device ID": "Device ID", "Devices": "Devices", "Devices will not yet be able to decrypt history from before they joined the room": "Devices will not yet be able to decrypt history from before they joined the room", From f0f5bc83f252f9f68b84eeaebbc25de1b9e434c2 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 15:54:52 +0100 Subject: [PATCH 08/28] fix more weirdly inconsistent fullstops --- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/fr.json | 2 +- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- src/i18n/strings/ru.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6ddbee0eb1..417f332695 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -123,7 +123,7 @@ "Forget room": "Raum vergessen", "Forgot your password?": "Passwort vergessen?", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Aus Sicherheitsgründen werden beim Ausloggen alle Ende-zu-Ende-Verschlüsselungsschlüssel von diesem Browser gelöscht. Wenn du in späteren Riot-Sitzungen die Konversationshistorie entschlüsseln möchtest, exportiere bitte deine Schlüssel zur sicheren Verwahrung.", - "For security, this session has been signed out. Please sign in again": "Zur Sicherheit wurde diese Sitzung abgemeldet. Bitte melde dich erneut an", + "For security, this session has been signed out. Please sign in again.": "Zur Sicherheit wurde diese Sitzung abgemeldet. Bitte melde dich erneut an.", "Found a bug?": "Fehler gefunden?", "Guests cannot join this room even if explicitly invited": "Gäste können diesem Raum nicht beitreten auch wenn sie explizit eingeladen werden", "Guests can't set avatars. Please register.": "Gäste können keine Avatare setzen. Bitte registriere dich.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b16800fb04..4d1f3ad53f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -275,7 +275,7 @@ "Filter room members": "Filter room members", "Forget room": "Forget room", "Forgot your password?": "Forgot your password?", - "For security, this session has been signed out. Please sign in again": "For security, this session has been signed out. Please sign in again", + "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", "Found a bug?": "Found a bug?", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "Guest users can't create new rooms. Please register to create room and start a chat": "Guest users can't create new rooms. Please register to create room and start a chat", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 0a20bc1a87..b8ed7684be 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -294,7 +294,7 @@ "Filter room members": "Filtrer les membres par nom", "Forget room": "Oublier le salon", "Forgot your password?": "Mot de passe perdu ?", - "For security, this session has been signed out. Please sign in again": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau", + "For security, this session has been signed out. Please sign in again.": "Par sécurité, la session a expiré. Merci de vous authentifer à nouveau.", "Found a bug?": "Trouvé un problème ?", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s de %(fromPowerLevel)s à %(toPowerLevel)s", "Guest users can't create new rooms. Please register to create room and start a chat": "Les utilisateurs invités ne peuvent créer de nouveaux salons. Merci de vous enregistrer pour commencer une discussion", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 66ca428aeb..1d972ec1af 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -94,7 +94,7 @@ "Forget room": "Esquecer sala", "Forgot your password?": "Esqueceu sua senha?", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.", - "For security, this session has been signed out. Please sign in again": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente", + "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", "Guests can't set avatars. Please register": "Convidados não podem definir uma foto do perfil. Por favor, registre-se", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index d371ac51dc..9e1f864caa 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -97,7 +97,7 @@ "Forget room": "Esquecer sala", "Forgot your password?": "Esqueceu sua senha?", "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.", - "For security, this session has been signed out. Please sign in again": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente", + "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", "Guests can't set avatars. Please register": "Convidados não podem definir uma foto do perfil. Por favor, registre-se", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index bf506c60e0..279ce3b6c0 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -88,7 +88,7 @@ "Filter room members": "Фильтр участников комнаты", "Forget room": "Забыть комнату", "Forgot your password?": "Вы забыли пароль?", - "For security, this session has been signed out. Please sign in again": "Для обеспечения безопасности, эта сессия была подписана. Войдите в систему еще раз.", + "For security, this session has been signed out. Please sign in again.": "Для обеспечения безопасности, эта сессия была подписана. Войдите в систему еще раз.", "Found a bug?": "Нашли ошибку?", "had": "имеет", "Hangup": "Отключение", From c34edbec3eda3d655bb497301f91e398a0fa6b46 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 16:02:51 +0100 Subject: [PATCH 09/28] include fullstop fixup --- scripts/fix-i18n.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl index 6afc93e05e..2924340dc2 100755 --- a/scripts/fix-i18n.pl +++ b/scripts/fix-i18n.pl @@ -38,6 +38,7 @@ VoIP conference finished. %(senderName)s sent an invitation to %(targetDisplayName)s to join the room. %(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s). %(senderName)s changed the power level of %(powerLevelDiffText)s. +For security, this session has been signed out. Please sign in again. EOT )]; } From 957aa0403d34f33f13d24f00e51ea86e56adef77 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 16:03:07 +0100 Subject: [PATCH 10/28] fix https://github.com/vector-im/riot-web/issues/4052 --- src/components/views/rooms/RoomPreviewBar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index 2cf9ade847..b20b2ef58e 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -86,7 +86,7 @@ module.exports = React.createClass({ _roomNameElement: function(fallback) { fallback = fallback || 'a room'; const name = this.props.room ? this.props.room.name : (this.props.room_alias || ""); - return name ? { name } : fallback; + return name ? name : fallback; }, render: function() { From c8dab3ae65513976d3b70bc2607df14690695e98 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 16:47:15 +0100 Subject: [PATCH 11/28] script for checking health of i18n --- scripts/check-i18n.pl | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 scripts/check-i18n.pl diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl new file mode 100755 index 0000000000..ebafa0b19c --- /dev/null +++ b/scripts/check-i18n.pl @@ -0,0 +1,68 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Cwd 'abs_path'; + +# script which checks how out of sync the i18ns are drifting + +# example i18n format: +# "%(oneUser)sleft": "%(oneUser)sleft", + +$|=1; + +$0 =~ /^(.*\/)/; +my $i18ndir = abs_path($1."/../src/i18n/strings"); +my $en = read_i18n($i18ndir."/en_EN.json"); + +opendir(DIR, $i18ndir) || die $!; +my @files = readdir(DIR); +closedir(DIR); +foreach my $lang (grep { -f "$i18ndir/$_" && !/en_EN\.json/ } @files) { + print "\nChecking $lang\n"; + + my $map = read_i18n($i18ndir."/".$lang); + my $count = 0; + + foreach my $k (sort keys %$map) { + if ($en->{$k}) { + if ($map->{$k} eq $k) { + printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", "$k"); + } + $count++; + } + else { + if ($en->{$k . "."}) { + printf ("%10s %24s\t%s\n", $lang, "en_EN has fullstop!", "$k"); + next; + } + + $k =~ /^(.*)\.?$/; + if ($en->{$1}) { + printf ("%10s %24s\t%s\n", $lang, "en_EN lacks fullstop!", "$k"); + next; + } + + printf ("%10s %24s\t%s\n", $lang, "Not present in en_EN", "$k"); + } + } + + printf ("$count/" . (scalar keys %$en) . " strings translated\n"); +} + +sub read_i18n { + my $path = shift; + my $map = {}; + + open(FILE, "<", $path) || die $!; + while() { + if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) { + my ($indent, $src, $colon, $dst, $comma) = ($1, $2, $3, $4, $5); + + $map->{$src} = $dst; + } + } + close(FILE); + + return $map; +} \ No newline at end of file From 44f8ee44e641c740b57c68dfd33a0d0a69b3f084 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:13:17 +0100 Subject: [PATCH 12/28] check for missing src strings too --- scripts/check-i18n.pl | 47 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index ebafa0b19c..a7e5f3c2e2 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -13,8 +13,30 @@ $|=1; $0 =~ /^(.*\/)/; my $i18ndir = abs_path($1."/../src/i18n/strings"); +my $srcdir = abs_path($1."/../src"); + my $en = read_i18n($i18ndir."/en_EN.json"); +my $src_strings = read_src_strings($srcdir); + +print "Checking strings in src\n"; +foreach my $s (@$src_strings) { + if (!$en->{$s}) { + if ($en->{$s . '.'}) { + printf ("%10s %24s\t%s\n", "src", "en_EN has fullstop!", "$s"); + } + else { + $s =~ /^(.*)\.?$/; + if ($en->{$1}) { + printf ("%10s %24s\t%s\n", "src", "en_EN lacks fullstop!", "$s"); + } + else { + printf ("%10s %24s\t%s\n", "src", "Translation missing!", "$s"); + } + } + } +} + opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); closedir(DIR); @@ -65,4 +87,29 @@ sub read_i18n { close(FILE); return $map; +} + +sub read_src_strings { + my $path = shift; + + use File::Find; + use File::Slurp; + + my $strings = []; + + my @files; + find( sub { push @files, $File::Find::name if (-f $_ && /\.jsx?$/) }, $path ); + foreach my $file (@files) { + my $src = read_file($file); + while ($src =~ /_t\(\s*'(.*?[^\\])'/sg) { + my $s = $1; + $s =~ s/\\'/'/g; + push @$strings, $s; + } + while ($src =~ /_t\(\s*"(.*?[^\\])"/sg) { + push @$strings, $1; + } + } + + return $strings; } \ No newline at end of file From e684cd5d288ec2d138a056c5c3bd7d0254fd8603 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:27:58 +0100 Subject: [PATCH 13/28] track broken i18n files --- scripts/check-i18n.pl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index a7e5f3c2e2..ff25955bdc 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -20,18 +20,19 @@ my $en = read_i18n($i18ndir."/en_EN.json"); my $src_strings = read_src_strings($srcdir); print "Checking strings in src\n"; -foreach my $s (@$src_strings) { +foreach my $tuple (@$src_strings) { + my ($s, $file) = (@$tuple); if (!$en->{$s}) { if ($en->{$s . '.'}) { - printf ("%10s %24s\t%s\n", "src", "en_EN has fullstop!", "$s"); + printf ("%50s %24s\t%s\n", $file, "en_EN has fullstop!", $s); } else { $s =~ /^(.*)\.?$/; if ($en->{$1}) { - printf ("%10s %24s\t%s\n", "src", "en_EN lacks fullstop!", "$s"); + printf ("%50s %24s\t%s\n", $file, "en_EN lacks fullstop!", $s); } else { - printf ("%10s %24s\t%s\n", "src", "Translation missing!", "$s"); + printf ("%50s %24s\t%s\n", $file, "Translation missing!", $s); } } } @@ -101,13 +102,14 @@ sub read_src_strings { find( sub { push @files, $File::Find::name if (-f $_ && /\.jsx?$/) }, $path ); foreach my $file (@files) { my $src = read_file($file); + $file =~ s/^.*\/src/src/; while ($src =~ /_t\(\s*'(.*?[^\\])'/sg) { my $s = $1; $s =~ s/\\'/'/g; - push @$strings, $s; + push @$strings, [$s, $file]; } while ($src =~ /_t\(\s*"(.*?[^\\])"/sg) { - push @$strings, $1; + push @$strings, [$1, $file]; } } From 730258bd3caa4174d4fa90c5132151ad59618c64 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:30:32 +0100 Subject: [PATCH 14/28] fix punctuation on e2e warning --- scripts/fix-i18n.pl | 1 + src/Lifecycle.js | 6 ++---- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- src/i18n/strings/ru.json | 2 +- 7 files changed, 8 insertions(+), 9 deletions(-) diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl index 2924340dc2..5002abd55d 100755 --- a/scripts/fix-i18n.pl +++ b/scripts/fix-i18n.pl @@ -39,6 +39,7 @@ VoIP conference finished. %(senderName)s turned on end-to-end encryption (algorithm %(algorithm)s). %(senderName)s changed the power level of %(powerLevelDiffText)s. For security, this session has been signed out. Please sign in again. +You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience. EOT )]; } diff --git a/src/Lifecycle.js b/src/Lifecycle.js index 0e3e52fe40..a4a4f557bc 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -231,10 +231,8 @@ function _handleRestoreFailure(e) { let msg = e.message; if (msg == "OLM.BAD_LEGACY_ACCOUNT_PICKLE") { msg = _t( - 'You need to log back in to generate end-to-end ' + - 'encryption keys for this device and submit the public key to your homeserver. ' + - 'This is a once off; sorry for the inconvenience' - ) + '.'; + 'You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.' + ); _clearLocalStorage(); diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 417f332695..4f2db07633 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -307,7 +307,7 @@ "You are already in a call": "Du bist bereits bei einem Anruf", "You cannot place a call with yourself": "Du kannst keinen Anruf mit dir selbst starten", "You cannot place VoIP calls in this browser": "Du kannst kein VoIP-Gespräch in diesem Browser starten", - "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience": "Du musst dich erneut anmelden um Ende-zu-Ende-Verschlüsselungscodes für dieses Gerät zu generieren und den öffentl. Schlüssel an deinen Homeserver zu senden. Dies muss einmal gemacht werden. Entschuldige die Unannehmlichkeit", + "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden um Ende-zu-Ende-Verschlüsselungscodes für dieses Gerät zu generieren und den öffentl. Schlüssel an deinen Homeserver zu senden. Dies muss einmal gemacht werden. Entschuldige die Unannehmlichkeit.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verknüpft zu sein", "Sun": "So", "Mon": "Mo", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4d1f3ad53f..ee4e439b91 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -541,7 +541,7 @@ "you must be a": "you must be a", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be logged in.": "You need to be logged in.", - "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience", + "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Your email address does not appear to be associated with a Matrix ID on this Homeserver", "Your password has been reset": "Your password has been reset", "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 1d972ec1af..9afd58b979 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -401,7 +401,7 @@ "You cannot place VoIP calls in this browser": "Você não pode fazer chamadas de voz neste navegador", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be logged in.": "Você tem que estar logado.", - "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez", + "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor", "Set a display name:": "Defina um nome público para você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 9e1f864caa..7c1cdddd93 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -406,7 +406,7 @@ "You cannot place VoIP calls in this browser": "Você não pode fazer chamadas de voz neste navegador", "You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.", "You need to be logged in.": "Você tem que estar logado.", - "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez", + "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor", "Set a display name:": "Defina um nome público para você:", "Upload an avatar:": "Envie uma imagem de perfil para identificar você:", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 279ce3b6c0..b66c5c304b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -385,7 +385,7 @@ "Thu": "Чт", "Fri": "Пя", "Sat": "Сб", - "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства", + "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver", "to start a chat with someone": "Начать чат с кем-то", "to tag direct chat": "Пометить прямой чат", From f442a665c835a23e32f1324db213a59080e98819 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:36:02 +0100 Subject: [PATCH 15/28] fix more i18n punctuation fails --- scripts/check-i18n.pl | 5 ++++- scripts/fix-i18n.pl | 2 ++ src/TextForEvent.js | 2 +- src/i18n/strings/da.json | 2 +- src/i18n/strings/de_DE.json | 4 ++-- src/i18n/strings/en_EN.json | 4 ++-- src/i18n/strings/fr.json | 4 ++-- src/i18n/strings/pt.json | 4 ++-- src/i18n/strings/pt_BR.json | 4 ++-- src/i18n/strings/ru.json | 4 ++-- 10 files changed, 20 insertions(+), 15 deletions(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index ff25955bdc..b415108b96 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -38,6 +38,8 @@ foreach my $tuple (@$src_strings) { } } +#exit; + opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); closedir(DIR); @@ -81,7 +83,8 @@ sub read_i18n { while() { if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) { my ($indent, $src, $colon, $dst, $comma) = ($1, $2, $3, $4, $5); - + $src =~ s/\\"/"/g; + $dst =~ s/\\"/"/g; $map->{$src} = $dst; } } diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl index 5002abd55d..8f23673561 100755 --- a/scripts/fix-i18n.pl +++ b/scripts/fix-i18n.pl @@ -51,6 +51,8 @@ EOT my $sub = 0; if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) { my ($indent, $src, $colon, $dst, $comma) = ($1, $2, $3, $4, $5); + $src =~ s/\\"/"/g; + $dst =~ s/\\"/"/g; foreach my $fixup (@{$::fixups}) { my $dotless_fixup = substr($fixup, 0, -1); diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 169868e812..6438a9a1ad 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -179,7 +179,7 @@ function textForHistoryVisibilityEvent(event) { text += _t('anyone') + '.'; } else { - text += ' ' + _t('unknown') + ' (' + vis + ')'; + text += ' ' + _t('unknown') + ' (' + vis + ').'; } return text; } diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index af6f0bb0fe..60904eb4af 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -64,7 +64,7 @@ "and": "og", "An email has been sent to": "En e-mail blev sendt til", "answered the call.": "svarede på kaldet", - "anyone.": "alle", + "anyone": "alle", "Anyone who knows the room's link, apart from guests": "Alle der kender link til rummet, bortset fra gæster", "Anyone who knows the room's link, including guests": "Alle der kender link til rummet, inklusiv gæster", "Are you sure you want to leave the room?": "Er du sikker på du vil forlade rummet?", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4f2db07633..63c0c5a58e 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -59,7 +59,7 @@ "all room members, from the point they joined": "Alle Raum-Mitglieder - seitdem sie beigetreten sind", "and": "und", "An email has been sent to": "Eine E-Mail wurde gesendet an", - "anyone.": "Jeder", + "anyone": "Jeder", "Anyone who knows the room's link, apart from guests": "Jeder der den Raum-Link kennt - abgesehen von Gästen", "Anyone who knows the room's link, including guests": "Jeder der den Raum-Link kennt - auch Gäste", "Are you sure you want to leave the room?": "Bist du sicher, dass du den Raum verlassen willst?", @@ -358,7 +358,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s änderte das Profilbild.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s änderte das Berechtigungslevel von %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s änderte das Thema zu \"%(topic)s\"", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s änderte das Thema zu "%(topic)s".", "/ddg is not a command": "/ddg ist kein Kommando", "%(senderName)s ended the call.": "%(senderName)s beendete den Anruf.", "Failed to lookup current room": "Aktuellen Raum nachzuschlagen schlug fehl", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ee4e439b91..0870a6d574 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -151,7 +151,7 @@ "An email has been sent to": "An email has been sent to", "A new password must be entered.": "A new password must be entered.", "%(senderName)s answered the call.": "%(senderName)s answered the call.", - "anyone.": "anyone", + "anyone": "anyone", "An error has occurred.": "An error has occurred.", "Anyone who knows the room's link, apart from guests": "Anyone who knows the room's link, apart from guests", "Anyone who knows the room's link, including guests": "Anyone who knows the room's link, including guests", @@ -176,7 +176,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s changed the topic to \"%(topic)s\"", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s changed the topic to "%(topic)s".", "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", "changing room on a RoomView is not supported": "changing room on a RoomView is not supported", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index b8ed7684be..94cf453c65 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -119,7 +119,7 @@ "zh-sg": "Chinese (Singapore)", "zh-tw": "Chinese (Taiwan)", "zu": "Zulu", - "anyone.": "anyone", + "anyone": "anyone", "Direct Chat": "Conversation Directe", "Direct chats": "Conversations directes", "Disable inline URL previews by default": "Désactiver l’aperçu des URLs", @@ -219,7 +219,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s a changé sa photo de profil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le niveau de pouvoir de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s a changé le sujet du salon en \"%(topic)s\"", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s a changé le sujet du salon en "%(topic)s".", "Changes to who can read history will only apply to future messages in this room": "Les changements de visibilité de l’historique de ce salon ne s’appliquent qu’aux messages futurs", "Changes your display nickname": "Change votre nom d'affichage", "Claimed Ed25519 fingerprint key": "Clé empreinte Ed25519 revendiquée", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 9afd58b979..57dbc3ae25 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -312,14 +312,14 @@ "%(names)s and one other are typing": "%(names)s e uma outra pessoa estão escrevendo", "%(names)s and %(count)s others are typing": "%(names)s e %(count)s outras pessoas estão escrevendo", "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", - "anyone.": "qualquer pessoa", + "anyone": "qualquer pessoa", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s alterou o tópico para \"%(topic)s\"", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s alterou o tópico para "%(topic)s".", "click to reveal": "clique para ver", "Conference call failed": "Chamada de conferência falhou", "Conference calling is in development and may not be reliable": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 7c1cdddd93..e2cd527ee0 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -36,7 +36,7 @@ "changed their profile picture": "alterou sua foto de perfil", "changed the power level of": "mudou o nível de permissões de", "changed the room name to": "mudou o nome da sala para", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\"", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s mudou o tópico para "%(topic)s".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", @@ -317,7 +317,7 @@ "%(names)s and one other are typing": "%(names)s e uma outra pessoa estão escrevendo", "%(names)s and %(count)s others are typing": "%(names)s e %(count)s outras pessoas estão escrevendo", "%(senderName)s answered the call.": "%(senderName)s atendeu à chamada.", - "anyone.": "qualquer pessoa", + "anyone": "qualquer pessoa", "%(senderName)s banned %(targetName)s.": "%(senderName)s removeu %(targetName)s da sala.", "Call Timeout": "Tempo esgotado. Chamada encerrada", "%(senderName)s changed their display name from %(oldDisplayName)s to %(displayName)s.": "%(senderName)s mudou seu nome público de %(oldDisplayName)s para %(displayName)s.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index b66c5c304b..125defd9a3 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -16,7 +16,7 @@ "An email has been sent to": "Email был отправлен", "A new password must be entered.": "Введите новый пароль.", "answered the call.": "принятый звонок.", - "anyone.": "кто угодно", + "anyone": "кто угодно", "Anyone who knows the room's link, apart from guests": "Любой, кто знает ссылку на комнату, кроме гостей", "Anyone who knows the room's link, including guests": "Любой, кто знает ссылку комнаты, включая гостей", "Are you sure you want to reject the invitation?": "Вы уверены что вы хотите отклонить приглашение?", @@ -231,7 +231,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s измененное ихнее фото профиля.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\"": "%(senderDisplayName)s измененная тема на %(topic)s", + "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s измененная тема на %(topic)s.", "Conference call failed": "Конференц-вызов прервался", "Conference calling is in development and may not be reliable": "Конференц-вызов находится в процессе и может не быть надежным", "Conference calls are not supported in encrypted rooms": "Конференц-вызовы не поддерживаются в зашифрованных комнатах", From c61ca422616feb81ac88e4c9701dc1372fcf65c7 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:41:54 +0100 Subject: [PATCH 16/28] oops, fix quoting --- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/en_EN.json | 2 +- src/i18n/strings/fr.json | 2 +- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- src/i18n/strings/ru.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 63c0c5a58e..20053a28f0 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -358,7 +358,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s änderte das Profilbild.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s änderte das Berechtigungslevel von %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s änderte den Raumnamen zu %(roomName)s.", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s änderte das Thema zu "%(topic)s".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s änderte das Thema zu \"%(topic)s\".", "/ddg is not a command": "/ddg ist kein Kommando", "%(senderName)s ended the call.": "%(senderName)s beendete den Anruf.", "Failed to lookup current room": "Aktuellen Raum nachzuschlagen schlug fehl", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0870a6d574..27a9105ac6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -176,7 +176,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s changed their profile picture.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s changed the room name to %(roomName)s.", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s changed the topic to "%(topic)s".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s changed the topic to \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", "changing room on a RoomView is not supported": "changing room on a RoomView is not supported", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 94cf453c65..e10c606233 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -219,7 +219,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s a changé sa photo de profil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s a changé le niveau de pouvoir de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a changé le nom du salon en %(roomName)s.", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s a changé le sujet du salon en "%(topic)s".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s a changé le sujet du salon en \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "Les changements de visibilité de l’historique de ce salon ne s’appliquent qu’aux messages futurs", "Changes your display nickname": "Change votre nom d'affichage", "Claimed Ed25519 fingerprint key": "Clé empreinte Ed25519 revendiquée", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 57dbc3ae25..955ee1837c 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -319,7 +319,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s alterou sua imagem de perfil.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s alterou o nível de permissões de %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s alterou o nome da sala para %(roomName)s.", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s alterou o tópico para "%(topic)s".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s alterou o tópico para \"%(topic)s\".", "click to reveal": "clique para ver", "Conference call failed": "Chamada de conferência falhou", "Conference calling is in development and may not be reliable": "Chamadas de conferência estão em desenvolvimento e portanto podem não funcionar", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index e2cd527ee0..adc3650c4e 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -36,7 +36,7 @@ "changed their profile picture": "alterou sua foto de perfil", "changed the power level of": "mudou o nível de permissões de", "changed the room name to": "mudou o nome da sala para", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s mudou o tópico para "%(topic)s".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes to who can read history will only apply to future messages in this room": "As mudanças sobre quem pode ler o histórico da sala só serão aplicadas às mensagens futuras nesta sala", "Changes your display nickname": "Troca o seu apelido", "Claimed Ed25519 fingerprint key": "Chave reivindicada da Impressão Digital Ed25519", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 125defd9a3..bb7621e69d 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -231,7 +231,7 @@ "%(senderName)s changed their profile picture.": "%(senderName)s измененное ихнее фото профиля.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s уровень мощности изменен на %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s имя комнаты измененно на %(roomName)s.", - "%(senderDisplayName)s changed the topic to "%(topic)s".": "%(senderDisplayName)s измененная тема на %(topic)s.", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s измененная тема на %(topic)s.", "Conference call failed": "Конференц-вызов прервался", "Conference calling is in development and may not be reliable": "Конференц-вызов находится в процессе и может не быть надежным", "Conference calls are not supported in encrypted rooms": "Конференц-вызовы не поддерживаются в зашифрованных комнатах", From 1305fd619e0857c95c058e33a0c166b68b9b6534 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 17:42:58 +0100 Subject: [PATCH 17/28] fix quoting --- scripts/fix-i18n.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl index 8f23673561..5d5e8f68b9 100755 --- a/scripts/fix-i18n.pl +++ b/scripts/fix-i18n.pl @@ -70,6 +70,8 @@ if ($_ =~ m/^(\s+)"(.*?)"(: *)"(.*?)"(,?)$/) { } if ($sub) { + $src =~ s/"/\\"/g; + $dst =~ s/"/\\"/g; print qq($indent"$src"$colon"$dst"$comma\n); last; } From 8524f5868c8d8b1adbdcc3554ce8d12b28959e04 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sat, 27 May 2017 17:59:11 +0100 Subject: [PATCH 18/28] import _t, drop two unused imports without this FilePanel would ever-load Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/FilePanel.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index ea048df97e..b85e7dc2d2 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -15,12 +15,11 @@ limitations under the License. */ import React from 'react'; -import ReactDOM from 'react-dom'; import Matrix from 'matrix-js-sdk'; import sdk from '../../index'; import MatrixClientPeg from '../../MatrixClientPeg'; -import dis from '../../dispatcher'; +import { _t } from '../../languageHandler'; /* * Component which shows the filtered file using a TimelinePanel From 3302fc690f7d5a7ca8bcf7618c3483e704c5a48d Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:20:35 +0100 Subject: [PATCH 19/28] fix all missing translations picked up by check-i18n.pl --- scripts/check-i18n.pl | 5 +++-- scripts/fix-i18n.pl | 8 +++++++ src/components/structures/UserSettings.js | 21 ++++++++++-------- .../structures/login/ForgotPassword.js | 8 +++---- src/components/views/login/PasswordLogin.js | 2 +- .../views/room_settings/AliasSettings.js | 4 ++-- src/components/views/rooms/RoomHeader.js | 2 +- src/components/views/rooms/RoomSettings.js | 2 +- .../views/settings/ChangePassword.js | 2 +- src/i18n/strings/de_DE.json | 6 ++--- src/i18n/strings/en_EN.json | 22 +++++++++++++++---- src/i18n/strings/pt.json | 12 +++++----- src/i18n/strings/pt_BR.json | 12 +++++----- src/i18n/strings/ru.json | 4 ++-- 14 files changed, 67 insertions(+), 43 deletions(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index b415108b96..4b670a7694 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -38,8 +38,6 @@ foreach my $tuple (@$src_strings) { } } -#exit; - opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); closedir(DIR); @@ -105,6 +103,9 @@ sub read_src_strings { find( sub { push @files, $File::Find::name if (-f $_ && /\.jsx?$/) }, $path ); foreach my $file (@files) { my $src = read_file($file); + $src =~ s/'\s*\+\s*'//g; + $src =~ s/"\s*\+\s*"//g; + $file =~ s/^.*\/src/src/; while ($src =~ /_t\(\s*'(.*?[^\\])'/sg) { my $s = $1; diff --git a/scripts/fix-i18n.pl b/scripts/fix-i18n.pl index 5d5e8f68b9..d4ae3dfb49 100755 --- a/scripts/fix-i18n.pl +++ b/scripts/fix-i18n.pl @@ -40,6 +40,14 @@ VoIP conference finished. %(senderName)s changed the power level of %(powerLevelDiffText)s. For security, this session has been signed out. Please sign in again. You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience. +A new password must be entered. +Guests can't set avatars. Please register. +Failed to set avatar. +Unable to verify email address. +Guests can't use labs features. Please register. +A new password must be entered. +Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved. +Guests cannot join this room even if explicitly invited. EOT )]; } diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 59b8f5a385..0ca1a6c57a 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -258,7 +258,7 @@ module.exports = React.createClass({ const NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); Modal.createDialog(NeedToRegisterDialog, { title: _t("Please Register"), - description: _t("Guests can't set avatars. Please register") + ".", + description: _t("Guests can't set avatars. Please register."), }); return; } @@ -283,7 +283,7 @@ module.exports = React.createClass({ console.error("Failed to set avatar: " + err); const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { - title: _t("Failed to set avatar"), + title: _t("Failed to set avatar."), description: ((err && err.message) ? err.message : _t("Operation failed")), }); }); @@ -295,7 +295,10 @@ module.exports = React.createClass({ title: _t("Sign out"), description:
- { _t("For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.") }. + { _t("For security, logging out will delete any end-to-end " + + "encryption keys from this browser. If you want to be able " + + "to decrypt your conversation history from future Riot sessions, " + + "please export your room keys for safe-keeping.") }.
, button: _t("Sign out"), extraButtons: [ @@ -391,7 +394,7 @@ module.exports = React.createClass({ const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createDialog(QuestionDialog, { title: _t("Remove Contact Information?"), - description: _t("Remove ") + threepid.address + "?", + description: _t("Remove %(threePid)s?", { threePid : threepid.address }), button: _t('Remove'), onFinished: (submit) => { if (submit) { @@ -433,8 +436,8 @@ module.exports = React.createClass({ this.setState({email_add_pending: false}); if (err.errcode == 'M_THREEPID_AUTH_FAILED') { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - let message = _t("Unable to verify email address. "); - message += _t("Please check your email and click on the link it contains. Once this is done, click continue."); + let message = _t("Unable to verify email address.") + " "; + _t("Please check your email and click on the link it contains. Once this is done, click continue."); Modal.createDialog(QuestionDialog, { title: _t("Verification Pending"), description: message, @@ -445,7 +448,7 @@ module.exports = React.createClass({ const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Unable to verify email address: " + err); Modal.createDialog(ErrorDialog, { - title: _t("Unable to verify email address"), + title: _t("Unable to verify email address."), description: ((err && err.message) ? err.message : _t("Operation failed")), }); } @@ -536,7 +539,7 @@ module.exports = React.createClass({

Referral

- {_t("Refer a friend to Riot: ")} {href} + {_t("Refer a friend to Riot:")} {href}
); @@ -734,7 +737,7 @@ module.exports = React.createClass({ const NeedToRegisterDialog = sdk.getComponent("dialogs.NeedToRegisterDialog"); Modal.createDialog(NeedToRegisterDialog, { title: _t("Please Register"), - description: _t("Guests can't use labs features. Please register") + ".", + description: _t("Guests can't use labs features. Please register."), }); return; } diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js index c7dc35c1a8..6e7cda1365 100644 --- a/src/components/structures/login/ForgotPassword.js +++ b/src/components/structures/login/ForgotPassword.js @@ -82,7 +82,7 @@ module.exports = React.createClass({ this.showErrorDialog(_t('The email address linked to your account must be entered.')); } else if (!this.state.password || !this.state.password2) { - this.showErrorDialog(_t('A new password must be entered') + "."); + this.showErrorDialog(_t('A new password must be entered.')); } else if (this.state.password !== this.state.password2) { this.showErrorDialog(_t('New passwords must match each other.')); @@ -98,10 +98,8 @@ module.exports = React.createClass({ 'end-to-end encryption keys on all devices, ' + 'making encrypted chat history unreadable, ' + 'unless you first export your room keys and re-import ' + - 'them afterwards. In future this ' + - '' + - 'will be improved' - ) }. + 'them afterwards. In future this will be improved.' + ) } , button: _t('Continue'), extraButtons: [ diff --git a/src/components/views/login/PasswordLogin.js b/src/components/views/login/PasswordLogin.js index 8e5229c63d..11d8f2cc7c 100644 --- a/src/components/views/login/PasswordLogin.js +++ b/src/components/views/login/PasswordLogin.js @@ -188,7 +188,7 @@ class PasswordLogin extends React.Component { value={this.state.loginType} onOptionChange={this.onLoginTypeChange}> { _t('my Matrix ID') } - { _t('Email Address') } + { _t('Email address') } { _t('Phone') } diff --git a/src/components/views/room_settings/AliasSettings.js b/src/components/views/room_settings/AliasSettings.js index b5ef1d8309..b48c5a4fe2 100644 --- a/src/components/views/room_settings/AliasSettings.js +++ b/src/components/views/room_settings/AliasSettings.js @@ -156,7 +156,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: _t('Invalid alias format'), - description: _t('"%(alias)s" is not a valid format for an alias', { alias: alias }), + description: _t('\'%(alias)s\' is not a valid format for an alias', { alias: alias }), }); } }, @@ -172,7 +172,7 @@ module.exports = React.createClass({ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createDialog(ErrorDialog, { title: _t('Invalid address format'), - description: _t('"%(alias)s" is not a valid format for an address', { alias: alias }), + description: _t('\'%(alias)s\' is not a valid format for an address', { alias: alias }), }); } }, diff --git a/src/components/views/rooms/RoomHeader.js b/src/components/views/rooms/RoomHeader.js index c5e3a56922..3463ef948f 100644 --- a/src/components/views/rooms/RoomHeader.js +++ b/src/components/views/rooms/RoomHeader.js @@ -121,7 +121,7 @@ module.exports = React.createClass({ console.error("Failed to set avatar: " + errMsg); Modal.createDialog(ErrorDialog, { title: _t("Error"), - description: _t("Failed to set avatar") + ".", + description: _t("Failed to set avatar."), }); }).done(); }, diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index e50bcdde46..8125adfe44 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -762,7 +762,7 @@ module.exports = React.createClass({ if (this.state.join_rule !== "public" && this.state.guest_access === "forbidden") { inviteGuestWarning =
- { _t('Guests cannot join this room even if explicitly invited') }. { + { _t('Guests cannot join this room even if explicitly invited.') } { this.setState({ join_rule: "invite", guest_access: "can_join" }); e.preventDefault(); }}>{ _t('Click here to fix') }. diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 33091f9c71..48c0b5501e 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -77,7 +77,7 @@ module.exports = React.createClass({ 'Changing password will currently reset any end-to-end encryption keys on all devices, ' + 'making encrypted chat history unreadable, unless you first export your room keys ' + 'and re-import them afterwards. ' + - 'In future this will be improved. ' + 'In future this will be improved.' ) } (https://github.com/vector-im/riot-web/issues/2671)
, button: _t("Continue"), diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 20053a28f0..984754ad84 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -177,7 +177,7 @@ "Privacy warning": "Datenschutzwarnung", "Privileged Users": "Privilegierte Nutzer", "Profile": "Profil", - "Refer a friend to Riot": "Lade eine(n) Freund(in) zu Riot ein", + "Refer a friend to Riot:": "Lade eine(n) Freund(in) zu Riot ein", "rejected": "abgeleht", "Once you've followed the link it contains, click below": "Nachdem du dem Link gefolgt bist, klicke unten", "rejected the invitation.": "lehnte die Einladung ab.", @@ -186,7 +186,7 @@ "removed their display name": "löschte den eigenen Anzeigenamen", "Remove": "Entferne", "requested a VoIP conference": "hat eine VoIP-Konferenz angefordert", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "Eine Passwortänderung sorgt aktuell dafür, dass alle Ende-zu-Ende-Schlüssel von allen Geräten zurückgesetzt werden. Dadurch wird die verschlüsselte Chat-Historie unlesbar, es sei denn Sie exportieren vorher Ihre Raum-Schlüssel und importieren sie nachher wieder. In Zukunft wird dies verbessert", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Eine Passwortänderung sorgt aktuell dafür, dass alle Ende-zu-Ende-Schlüssel von allen Geräten zurückgesetzt werden. Dadurch wird die verschlüsselte Chat-Historie unlesbar, es sei denn Sie exportieren vorher Ihre Raum-Schlüssel und importieren sie nachher wieder. In Zukunft wird dies verbessert.", "restore": "Zum zurücksetzen", "Return to login screen": "Zur Anmeldung zurückkehren", "Room Colour": "Raumfarbe", @@ -242,7 +242,7 @@ "turned on end-to-end encryption (algorithm": "aktivierte Ende-zu-Ende-Verschlüsselung (Algorithmus", "Unable to add email address": "Unfähig die E-Mail-Adresse hinzuzufügen", "Unable to remove contact information": "Unfähig die Kontakt-Informationen zu löschen", - "Unable to verify email address": "Unfähig die E-Mail-Adresse zu verifizieren", + "Unable to verify email address.": "Unfähig die E-Mail-Adresse zu verifizieren.", "Unban": "Entbannen", "Unencrypted room": "Unverschlüsselter Raum", "unknown error code": "Unbekannter Fehlercode", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 27a9105ac6..4105594058 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -180,6 +180,7 @@ "Changes to who can read history will only apply to future messages in this room": "Changes to who can read history will only apply to future messages in this room", "Changes your display nickname": "Changes your display nickname", "changing room on a RoomView is not supported": "changing room on a RoomView is not supported", + "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Changing password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "Claimed Ed25519 fingerprint key": "Claimed Ed25519 fingerprint key", "Clear Cache and Reload": "Clear Cache and Reload", "Clear Cache": "Clear Cache", @@ -230,7 +231,7 @@ "Drop here to tag %(section)s": "Drop here to tag %(section)s", "Ed25519 fingerprint": "Ed25519 fingerprint", "Email": "Email", - "Email Address": "Email Address", + "Email address": "Email address", "Email, name or matrix ID": "Email, name or matrix ID", "Emoji": "Emoji", "Enable encryption": "Enable encryption", @@ -241,6 +242,7 @@ "End-to-end encryption is in beta and may not be reliable": "End-to-end encryption is in beta and may not be reliable", "Enter Code": "Enter Code", "Error": "Error", + "Error decrypting attachment": "Error decrypting attachment", "Event information": "Event information", "Existing Call": "Existing Call", "Export E2E room keys": "Export E2E room keys", @@ -261,6 +263,7 @@ "Failed to save settings": "Failed to save settings", "Failed to send email": "Failed to send email", "Failed to send request.": "Failed to send request.", + "Failed to set avatar.": "Failed to set avatar.", "Failed to set display name": "Failed to set display name", "Failed to set up conference call": "Failed to set up conference call", "Failed to toggle moderator status": "Failed to toggle moderator status", @@ -276,10 +279,15 @@ "Forget room": "Forget room", "Forgot your password?": "Forgot your password?", "For security, this session has been signed out. Please sign in again.": "For security, this session has been signed out. Please sign in again.", + "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.", "Found a bug?": "Found a bug?", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", + "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.", "Guest users can't create new rooms. Please register to create room and start a chat": "Guest users can't create new rooms. Please register to create room and start a chat", "Guest users can't upload files. Please register to upload": "Guest users can't upload files. Please register to upload", + "Guests can't set avatars. Please register.": "Guests can't set avatars. Please register.", + "Guests can't use labs features. Please register.": "Guests can't use labs features. Please register.", + "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "had": "had", "Hangup": "Hangup", "Hide read receipts": "Hide read receipts", @@ -294,6 +302,7 @@ "Invalid alias format": "Invalid alias format", "Invalid address format": "Invalid address format", "Invalid Email Address": "Invalid Email Address", + "Invalid file%(extra)s": "Invalid file%(extra)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s invited %(targetName)s.", "Invite new room members": "Invite new room members", "Invites": "Invites", @@ -334,6 +343,7 @@ "Mobile phone number": "Mobile phone number", "Moderator": "Moderator", "Must be viewing a room": "Must be viewing a room", + "Mute": "Mute", "my Matrix ID": "my Matrix ID", "Name": "Name", "Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device", @@ -360,6 +370,7 @@ "Once encryption is enabled for a room it cannot be turned off again (for now)": "Once encryption is enabled for a room it cannot be turned off again (for now)", "Once you've followed the link it contains, click below": "Once you've followed the link it contains, click below", "Only people who have been invited": "Only people who have been invited", + "Operation failed": "Operation failed", "or": "or", "Password": "Password", "Passwords can't be empty": "Passwords can't be empty", @@ -376,7 +387,7 @@ "Profile": "Profile", "Reason": "Reason", "Revoke Moderator": "Revoke Moderator", - "Refer a friend to Riot": "Refer a friend to Riot", + "Refer a friend to Riot:": "Refer a friend to Riot:", "Registration required": "Registration required", "rejected": "rejected", "%(targetName)s rejected the invitation.": "%(targetName)s rejected the invitation.", @@ -385,9 +396,10 @@ "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removed their display name (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s removed their profile picture.", "Remove": "Remove", + "Remove %(threePid)s?": "Remove %(threePid)s?", "%(senderName)s requested a VoIP conference.": "%(senderName)s requested a VoIP conference.", "Report it": "Report it", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.", "restore": "restore", "Return to app": "Return to app", "Return to login screen": "Return to login screen", @@ -488,7 +500,7 @@ "Unable to add email address": "Unable to add email address", "Unable to remove contact information": "Unable to remove contact information", "Unable to restore previous session": "Unable to restore previous session", - "Unable to verify email address": "Unable to verify email address", + "Unable to verify email address.": "Unable to verify email address.", "Unban": "Unban", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s unbanned %(targetName)s.", "Unable to capture screen": "Unable to capture screen", @@ -501,6 +513,7 @@ "unknown error code": "unknown error code", "Unknown room %(roomId)s": "Unknown room %(roomId)s", "unknown": "unknown", + "Unmute": "Unmute", "uploaded a file": "uploaded a file", "Upload avatar": "Upload avatar", "Upload Failed": "Upload Failed", @@ -541,6 +554,7 @@ "you must be a": "you must be a", "You need to be able to invite users to do that.": "You need to be able to invite users to do that.", "You need to be logged in.": "You need to be logged in.", + "You need to enter a user name.": "You need to enter a user name.", "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver": "Your email address does not appear to be associated with a Matrix ID on this Homeserver", "Your password has been reset": "Your password has been reset", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 955ee1837c..8b2cafb7a9 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -97,8 +97,8 @@ "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", - "Guests can't set avatars. Please register": "Convidados não podem definir uma foto do perfil. Por favor, registre-se", - "Guests can't use labs features. Please register": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre", + "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", + "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", "had": "teve", "Hangup": "Desligar", @@ -162,7 +162,7 @@ "Privacy warning": "Alerta sobre privacidade", "Privileged Users": "Usuárias/os privilegiadas/os", "Profile": "Perfil", - "Refer a friend to Riot: ": "Indicar um amigo para participar", + "Refer a friend to Riot:": "Indicar um amigo para participar", "rejected": "recusou", "rejected the invitation.": "rejeitou o convite.", "Reject invitation": "Rejeitar convite", @@ -171,7 +171,7 @@ "removed their profile picture": "removeu sua foto de perfil", "Remove": "Remover", "requested a VoIP conference": "requisitou uma conferência VoIP", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado.", "restore": "restaurar", "Return to app": "Retornar ao aplicativo", "Return to login screen": "Retornar à tela de login", @@ -233,7 +233,7 @@ "turned on end-to-end encryption (algorithm": "acionou a encriptação ponta-a-ponta (algoritmo", "Unable to add email address": "Não foi possível adicionar endereço de email", "Unable to remove contact information": "Não foi possível remover informação de contato", - "Unable to verify email address": "Não foi possível verificar o endereço de email", + "Unable to verify email address.": "Não foi possível verificar o endereço de email.", "Unban": "Desfazer banimento", "Unencrypted room": "Sala não criptografada", "unencrypted": "não criptografado", @@ -354,7 +354,7 @@ "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Press": "Aperte", "Reason": "Razão", - "Refer a friend to Riot": "Recomende Riot a um/a amigo/a", + "Refer a friend to Riot:": "Recomende Riot a um/a amigo/a", "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index adc3650c4e..bb67aa4c5f 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -100,8 +100,8 @@ "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", - "Guests can't set avatars. Please register": "Convidados não podem definir uma foto do perfil. Por favor, registre-se", - "Guests can't use labs features. Please register": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre", + "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", + "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", "had": "teve", "Hangup": "Desligar", @@ -166,7 +166,7 @@ "Privacy warning": "Alerta sobre privacidade", "Privileged Users": "Usuárias/os privilegiadas/os", "Profile": "Perfil", - "Refer a friend to Riot: ": "Indicar um amigo para participar", + "Refer a friend to Riot:": "Indicar um amigo para participar", "rejected": "recusou", "rejected the invitation.": "rejeitou o convite.", "Reject invitation": "Rejeitar convite", @@ -175,7 +175,7 @@ "removed their profile picture": "removeu sua foto de perfil", "Remove": "Remover", "requested a VoIP conference": "requisitou uma conferência VoIP", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Atualmente, ao alterar sua senha, você também zera todas as chaves de criptografia ponta-a-ponta em todos os dipositivos, fazendo com que o histórico de conversas da sala não possa mais ser lido, a não ser que você antes exporte suas chaves de sala e as reimporte após a alteração da senha. No futuro, isso será melhorado.", "restore": "restaurar", "Return to app": "Retornar ao aplicativo", "Return to login screen": "Retornar à tela de login", @@ -238,7 +238,7 @@ "turned on end-to-end encryption (algorithm": "acionou a encriptação ponta-a-ponta (algoritmo", "Unable to add email address": "Não foi possível adicionar endereço de email", "Unable to remove contact information": "Não foi possível remover informação de contato", - "Unable to verify email address": "Não foi possível verificar o endereço de email", + "Unable to verify email address.": "Não foi possível verificar o endereço de email.", "Unban": "Desfazer banimento", "Unencrypted room": "Sala não criptografada", "unencrypted": "não criptografado", @@ -358,7 +358,7 @@ "Power level must be positive integer.": "O nível de permissões tem que ser um número inteiro e positivo.", "Press": "Aperte", "Reason": "Razão", - "Refer a friend to Riot": "Recomende Riot a um/a amigo/a", + "Refer a friend to Riot:": "Recomende Riot a um/a amigo/a", "%(targetName)s rejected the invitation.": "%(targetName)s recusou o convite.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s removeu o seu nome público (%(oldDisplayName)s).", "%(senderName)s removed their profile picture.": "%(senderName)s removeu sua imagem de perfil.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index bb7621e69d..5b81b88a92 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -167,7 +167,7 @@ "turned on end-to-end encryption (algorithm": "turned on end-to-end encryption (algorithm", "Unable to add email address": "Невозможно добавить email адрес", "Unable to remove contact information": "Невозможно удалить контактную информацию", - "Unable to verify email address": "Невозможно проверить адрес электронной почты", + "Unable to verify email address.": "Невозможно проверить адрес электронной почты.", "Unban": "Отменить запрет", "Unencrypted room": "Незашифрованная комната", "unencrypted": "незашифрованно", @@ -541,7 +541,7 @@ "%(senderName)s removed their profile picture.": "%(senderName)s убрал своё изображение.", "%(senderName)s requested a VoIP conference.": "%(senderName)s запросил голосовую конференц-связь.", "Report it": "Сообщить об этом", - "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved": "На данный момент сброс пароля сбросит все ключи шифрования на всех устройствах, зашифрованная история общения будет нечитаема, если вы сперва не скачаете ваши ключи от комнаты и не загрузите их после. В будущем это будет улучшено", + "Resetting password will currently reset any end-to-end encryption keys on all devices, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "На данный момент сброс пароля сбросит все ключи шифрования на всех устройствах, зашифрованная история общения будет нечитаема, если вы сперва не скачаете ваши ключи от комнаты и не загрузите их после. В будущем это будет улучшено.", "restore": "восстановить", "Return to app": "Вернуться в приложение", "Riot does not have permission to send you notifications - please check your browser settings": "Riot не имеет права для отправки вам уведомлений, пожалуйста, проверьте настройки вашего браузера", From 8766f8ab7eff56d46dcd3a67117f524ad309d19f Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:22:36 +0100 Subject: [PATCH 20/28] sync punctuation --- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/pt.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 984754ad84..4909acffb6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -125,7 +125,7 @@ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Aus Sicherheitsgründen werden beim Ausloggen alle Ende-zu-Ende-Verschlüsselungsschlüssel von diesem Browser gelöscht. Wenn du in späteren Riot-Sitzungen die Konversationshistorie entschlüsseln möchtest, exportiere bitte deine Schlüssel zur sicheren Verwahrung.", "For security, this session has been signed out. Please sign in again.": "Zur Sicherheit wurde diese Sitzung abgemeldet. Bitte melde dich erneut an.", "Found a bug?": "Fehler gefunden?", - "Guests cannot join this room even if explicitly invited": "Gäste können diesem Raum nicht beitreten auch wenn sie explizit eingeladen werden", + "Guests cannot join this room even if explicitly invited.": "Gäste können diesem Raum nicht beitreten auch wenn sie explizit eingeladen werden.", "Guests can't set avatars. Please register.": "Gäste können keine Avatare setzen. Bitte registriere dich.", "Guest users can't upload files. Please register to upload.": "Gäste können keine Dateien hochladen. Bitte registrieren um hochzuladen.", "had": "hatte", diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 8b2cafb7a9..e636eb54d7 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -96,7 +96,7 @@ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.", "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", - "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", + "Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.", "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index bb67aa4c5f..fa9f3bc4da 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -99,7 +99,7 @@ "For security, logging out will delete any end-to-end encryption keys from this browser. If you want to be able to decrypt your conversation history from future Riot sessions, please export your room keys for safe-keeping.": "Por segurança, deslogar irá remover qualquer chave de criptografia ponta-a-ponta deste navegador. Caso deseje descriptografar o histórico das suas conversas E2E em sessões Riot futuras, por favor exporte as chaves da sala para sua garantia.", "For security, this session has been signed out. Please sign in again.": "Por questões de segurança, esta sessão foi encerrada. Por gentileza conecte-se novamente.", "Found a bug?": "Encontrou um problema de funcionamento do sistema?", - "Guests cannot join this room even if explicitly invited": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os", + "Guests cannot join this room even if explicitly invited.": "Visitantes não podem entrar nesta sala, mesmo se forem explicitamente convidadas/os.", "Guests can't set avatars. Please register.": "Convidados não podem definir uma foto do perfil. Por favor, registre-se.", "Guests can't use labs features. Please register.": "Convidados não podem usar as funcionalidades de laboratório (lab), por gentileza se registre.", "Guest users can't upload files. Please register to upload": "Usuários não podem fazer envio de arquivos. Por favor se cadastre para enviar arquivos", From 3703306a9e4a497a70127255f169fed90e37fb6e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:35:18 +0100 Subject: [PATCH 21/28] oops --- src/components/structures/UserSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 0ca1a6c57a..993586df84 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -436,7 +436,7 @@ module.exports = React.createClass({ this.setState({email_add_pending: false}); if (err.errcode == 'M_THREEPID_AUTH_FAILED') { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - let message = _t("Unable to verify email address.") + " "; + let message = _t("Unable to verify email address.") + " " + _t("Please check your email and click on the link it contains. Once this is done, click continue."); Modal.createDialog(QuestionDialog, { title: _t("Verification Pending"), From 8d79ab6ce2b1100d2f5aa88b5ff5fed9e6defb9f Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:35:34 +0100 Subject: [PATCH 22/28] track entries that exist in en_EN but not in the src... --- scripts/check-i18n.pl | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 4b670a7694..21f10238e6 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -18,10 +18,12 @@ my $srcdir = abs_path($1."/../src"); my $en = read_i18n($i18ndir."/en_EN.json"); my $src_strings = read_src_strings($srcdir); +my $src = {}; print "Checking strings in src\n"; foreach my $tuple (@$src_strings) { my ($s, $file) = (@$tuple); + $src->{$s} = $file; if (!$en->{$s}) { if ($en->{$s . '.'}) { printf ("%50s %24s\t%s\n", $file, "en_EN has fullstop!", $s); @@ -38,6 +40,29 @@ foreach my $tuple (@$src_strings) { } } +print "\nChecking en_EN\n"; +my $count = 0; +foreach my $k (sort keys %$en) { + if (!$src->{$k}) { + if ($src->{$k. '.'}) { + printf ("%50s %24s\t%s\n", $src->{$k. '.'}, "src has fullstop!", $k); + } + else { + $k =~ /^(.*)\.?$/; + if ($src->{$1}) { + printf ("%50s %24s\t%s\n", $src->{$1}, "src lacks fullstop!", $k); + } + else { + printf ("%50s %24s\t%s\n", '???', "Not present in src?", $k); + } + } + } + else { + $count++; + } +} +printf ("$count/" . (scalar keys %$src) . " strings found in src are present in en_EN\n"); + opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); closedir(DIR); @@ -50,23 +75,23 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/en_EN\.json/ } @files) { foreach my $k (sort keys %$map) { if ($en->{$k}) { if ($map->{$k} eq $k) { - printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", "$k"); + printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", $k); } $count++; } else { if ($en->{$k . "."}) { - printf ("%10s %24s\t%s\n", $lang, "en_EN has fullstop!", "$k"); + printf ("%10s %24s\t%s\n", $lang, "en_EN has fullstop!", $k); next; } $k =~ /^(.*)\.?$/; if ($en->{$1}) { - printf ("%10s %24s\t%s\n", $lang, "en_EN lacks fullstop!", "$k"); + printf ("%10s %24s\t%s\n", $lang, "en_EN lacks fullstop!", $k); next; } - printf ("%10s %24s\t%s\n", $lang, "Not present in en_EN", "$k"); + printf ("%10s %24s\t%s\n", $lang, "Not present in en_EN", $k); } } From bc433bc2a2d15740c170bdc14e89559aa998acde Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:38:37 +0100 Subject: [PATCH 23/28] ignore country codes --- scripts/check-i18n.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 21f10238e6..3cb2cec18c 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -43,6 +43,8 @@ foreach my $tuple (@$src_strings) { print "\nChecking en_EN\n"; my $count = 0; foreach my $k (sort keys %$en) { + # crappy heuristic to ignore country codes for now... + next if ($k =~ /^(..|..-..)$/); if (!$src->{$k}) { if ($src->{$k. '.'}) { printf ("%50s %24s\t%s\n", $src->{$k. '.'}, "src has fullstop!", $k); From b697c0472f8fca59c2c7f3ac3bf3a8512d480f1a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 18:41:43 +0100 Subject: [PATCH 24/28] fix fullstop --- scripts/check-i18n.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 3cb2cec18c..6c92dae53d 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -68,7 +68,7 @@ printf ("$count/" . (scalar keys %$src) . " strings found in src are present in opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); closedir(DIR); -foreach my $lang (grep { -f "$i18ndir/$_" && !/en_EN\.json/ } @files) { +foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) { print "\nChecking $lang\n"; my $map = read_i18n($i18ndir."/".$lang); From 71bc15c2fc6f9267a0a9b186fbd0a081ed170ae7 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 19:03:18 +0100 Subject: [PATCH 25/28] fix . --- src/i18n/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index e10c606233..53d24d484b 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -270,7 +270,7 @@ "Failed to reject invitation": "Échec lors du rejet de l'invitation", "Failed to save settings": "Échec lors de la sauvegarde des paramètres", "Failed to send email": "Échec lors de l’envoi de l’e-mail", - "Failed to send request": "Échec lors de l’envoi de la requête", + "Failed to send request.": "Échec lors de l’envoi de la requête.", "Failed to set display name": "Échec lors de l'enregistrement du nom d'affichage", "Failed to set up conference call": "Échec lors de l’établissement de l’appel", "Failed to toggle moderator status": "Échec lors de l’établissement du statut de modérateur", From 796158422c4598228d08bb58e1894954c7eff728 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 19:03:26 +0100 Subject: [PATCH 26/28] list the strings remaining to be translated --- scripts/check-i18n.pl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 6c92dae53d..2d50138788 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -42,6 +42,9 @@ foreach my $tuple (@$src_strings) { print "\nChecking en_EN\n"; my $count = 0; +my $remaining_src = {}; +foreach (keys %$src) { $remaining_src->{$_}++ }; + foreach my $k (sort keys %$en) { # crappy heuristic to ignore country codes for now... next if ($k =~ /^(..|..-..)$/); @@ -61,9 +64,13 @@ foreach my $k (sort keys %$en) { } else { $count++; + delete $remaining_src->{$k}; } } printf ("$count/" . (scalar keys %$src) . " strings found in src are present in en_EN\n"); +foreach (keys %$remaining_src) { + printf "remaining: $_\n"; +} opendir(DIR, $i18ndir) || die $!; my @files = readdir(DIR); @@ -74,12 +81,17 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) my $map = read_i18n($i18ndir."/".$lang); my $count = 0; + my $remaining_en = {}; + foreach (keys %$en) { $remaining_en->{$_}++ }; + + foreach my $k (sort keys %$map) { if ($en->{$k}) { if ($map->{$k} eq $k) { printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", $k); } $count++; + delete $remaining_en->{$k}; } else { if ($en->{$k . "."}) { @@ -97,6 +109,12 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) } } + if (scalar keys %$remaining_en < 100) { + foreach (keys %$remaining_en) { + printf ("%10s %24s\t%s\n", $lang, "Not yet translated", $_); + } + } + printf ("$count/" . (scalar keys %$en) . " strings translated\n"); } From 063230af03f1f2c4381eae86aa41195ee15d108a Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 19:51:44 +0100 Subject: [PATCH 27/28] fix typo breaking russian i18n --- src/i18n/strings/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 5b81b88a92..cdebc47160 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -449,7 +449,7 @@ "sx": "Суту", "zh-hk": "Китайский (Гонконг)", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains": "На +%(msisdn)s было отправлено текстовое сообщение. Пожалуйста, введите проверочный код из него", - "and %(overflowCount)s others...": "и %(overflowCounts)s других...", + "and %(overflowCount)s others...": "и %(overflowCount)s других...", "Are you sure?": "Вы уверены?", "Autoplay GIFs and videos": "Проигрывать GIF и видео автоматически", "Can't connect to homeserver - please check your connectivity and ensure your %(urlStart)s homeserver's SSL certificate %(urlEnd)s is trusted": "Невозможно соединиться с домашним сервером - проверьте своё соединение и убедитесь, что %(urlStart)s SSL-сертификат вашего домашнего сервера %(urlEnd)s включён в доверяемые", From dba35f4901264ce4958b60897d12cb37f4abc7ac Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 27 May 2017 20:14:52 +0100 Subject: [PATCH 28/28] extend script to check for broken variables --- scripts/check-i18n.pl | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/scripts/check-i18n.pl b/scripts/check-i18n.pl index 2d50138788..55499b0570 100755 --- a/scripts/check-i18n.pl +++ b/scripts/check-i18n.pl @@ -48,6 +48,11 @@ foreach (keys %$src) { $remaining_src->{$_}++ }; foreach my $k (sort keys %$en) { # crappy heuristic to ignore country codes for now... next if ($k =~ /^(..|..-..)$/); + + if ($en->{$k} ne $k) { + printf ("%50s %24s\t%s\n", "en_EN", "en_EN is not symmetrical", $k); + } + if (!$src->{$k}) { if ($src->{$k. '.'}) { printf ("%50s %24s\t%s\n", $src->{$k. '.'}, "src has fullstop!", $k); @@ -69,7 +74,7 @@ foreach my $k (sort keys %$en) { } printf ("$count/" . (scalar keys %$src) . " strings found in src are present in en_EN\n"); foreach (keys %$remaining_src) { - printf "remaining: $_\n"; + print "missing: $_\n"; } opendir(DIR, $i18ndir) || die $!; @@ -84,8 +89,23 @@ foreach my $lang (grep { -f "$i18ndir/$_" && !/(basefile|en_EN)\.json/ } @files) my $remaining_en = {}; foreach (keys %$en) { $remaining_en->{$_}++ }; - foreach my $k (sort keys %$map) { + { + no warnings 'uninitialized'; + my $vars = {}; + while ($k =~ /%\((.*?)\)s/g) { + $vars->{$1}++; + } + while ($map->{$k} =~ /%\((.*?)\)s/g) { + $vars->{$1}--; + } + foreach my $var (keys %$vars) { + if ($vars->{$var} != 0) { + printf ("%10s %24s\t%s\n", $lang, "Broken var ($var)s", $k); + } + } + } + if ($en->{$k}) { if ($map->{$k} eq $k) { printf ("%10s %24s\t%s\n", $lang, "Untranslated string?", $k);