From 9f4da84701680cb7369aa160fd09000f5fc91202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BC=D1=8F=D0=BD=20=D0=9C=D0=B8=D0=BD=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= Date: Mon, 22 Jul 2019 11:10:25 +0100 Subject: [PATCH] I18next update (#4456) * Removes unused translations. * Fixes using translated strings. * Moves using latest i18next versions and stop using compatibility modes. * Sorts i18next options. * Fixes defaultNS used by i18next. This is used when translating html tags with data-i18n keys as attributes, used by jQuery-Impromptu. --- lang/main.json | 188 +++++++----------- package-lock.json | 91 ++++++--- package.json | 10 +- react/features/base/i18n/functions.js | 10 +- react/features/base/i18n/i18next.js | 27 +-- .../chat/components/web/ChatMessage.js | 2 +- react/features/recording/middleware.js | 4 +- 7 files changed, 161 insertions(+), 171 deletions(-) diff --git a/lang/main.json b/lang/main.json index 32fe48c58..8229b0dec 100644 --- a/lang/main.json +++ b/lang/main.json @@ -6,17 +6,15 @@ "disabled": "You can't invite people.", "failedToAdd": "Failed to add participants", "footerText": "Dialing out is disabled.", - "invite": "Invite", "loading": "Searching for people and phone numbers", "loadingNumber": "Validating phone number", "loadingPeople": "Searching for people to invite", "noResults": "No matching search results", - "notAvailable": "You can't invite people.", "noValidNumbers": "Please enter a phone number", "searchNumbers": "Add phone numbers", "searchPeople": "Search for people", "searchPeopleAndNumbers": "Search for people or add their phone numbers", - "telephone": "Telephone: __number__", + "telephone": "Telephone: {{number}}", "title": "Invite people to this meeting" }, "audioDevices": { @@ -26,13 +24,11 @@ "speaker": "Speaker" }, "audioOnly": { - "audioOnly": "Audio only", - "featureToggleDisabled": "Toggling of __feature__ is disabled while in audio only mode" + "audioOnly": "Audio only" }, "calendarSync": { "addMeetingURL": "Add a meeting link", "confirmAddLink": "Do you want to add a Jitsi link to this event?", - "confirmAddLinkTitle": "Calendar", "error": { "appConfiguration": "Calendar integration is not properly configured.", "generic": "An error has occurred. Please check your calendar settings or try refreshing the calendar.", @@ -49,7 +45,7 @@ "today": "Today" }, "chat": { - "error": "Error: your message \"__originalText__\" was not sent. Reason: __error__", + "error": "Error: your message \"{{originalText}}\" was not sent. Reason: {{error}}", "messagebox": "Type a message", "nickname": { "popover": "Choose a nickname", @@ -71,11 +67,11 @@ "DISCONNECTING": "Disconnecting", "ERROR": "Error", "FETCH_SESSION_ID": "Obtaining session-id...", - "GET_SESSION_ID_ERROR": "Get session-id error: __code__", + "GET_SESSION_ID_ERROR": "Get session-id error: {{code}}", "GOT_SESSION_ID": "Obtaining session-id... Done", - "LOW_BANDWIDTH": "Video for __displayName__ has been turned off to save bandwidth", + "LOW_BANDWIDTH": "Video for {{displayName}} has been turned off to save bandwidth", "RECONNECTING": "A network problem occurred. Reconnecting...", - "USER_CONNECTION_INTERRUPTED": "__displayName__ is having connectivity issues..." + "USER_CONNECTION_INTERRUPTED": "{{displayName}} is having connectivity issues..." }, "connectionindicator": { "address": "Address:", @@ -85,14 +81,12 @@ "connectedTo": "Connected to:", "e2e_rtt": "E2E RTT:", "framerate": "Frame rate:", - "header": "Connection data", "less": "Show less", "localaddress": "Local address:", "localaddress_plural": "Local addresses:", "localport": "Local port:", "localport_plural": "Local ports:", "more": "Show more", - "na": "Come back here for connection information once the conference starts", "packetloss": "Packet loss:", "peer_to_peer": " (p2p)", "quality": { @@ -118,17 +112,16 @@ "yesterday": "Yesterday" }, "deepLinking": { - "appNotInstalled": "You need the __app__ mobile app to join this meeting on your phone.", - "description": "Nothing happened? We tried launching your meeting in the __app__ desktop app. Try again or launch it in the __app__ web app.", - "descriptionWithoutWeb": "Nothing happened? We tried launching your meeting in the __app__ desktop app.", + "appNotInstalled": "You need the {{app}} mobile app to join this meeting on your phone.", + "description": "Nothing happened? We tried launching your meeting in the {{app}} desktop app. Try again or launch it in the {{app}} web app.", + "descriptionWithoutWeb": "Nothing happened? We tried launching your meeting in the {{app}} desktop app.", "downloadApp": "Download the app", "launchWebButton": "Launch in web", "openApp": "Continue to the app", - "title": "Launching your meeting in __app__...", + "title": "Launching your meeting in {{app}}...", "tryAgainButton": "Try again in desktop" }, - "defaultLink": "e.g. __url__", - "defaultNickname": "ex. Jane Pink", + "defaultLink": "e.g. {{url}}", "deviceError": { "cameraError": "Failed to access your camera", "cameraPermission": "Error obtaining camera permission", @@ -136,7 +129,6 @@ "microphonePermission": "Error obtaining microphone permission" }, "deviceSelection": { - "deviceSettings": "Device settings", "noPermission": "Permission not granted", "previewUnavailable": "Preview unavailable", "selectADevice": "Select a device", @@ -160,47 +152,39 @@ "cameraUnsupportedResolutionError": "Your camera does not support required video resolution.", "Cancel": "Cancel", "close": "Close", - "conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in __seconds__ sec...", + "conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in {{seconds}} sec...", "conferenceDisconnectTitle": "You have been disconnected.", - "conferenceReloadMsg": "We're trying to fix this. Reconnecting in __seconds__ sec...", + "conferenceReloadMsg": "We're trying to fix this. Reconnecting in {{seconds}} sec...", "conferenceReloadTitle": "Unfortunately, something went wrong.", "confirm": "Confirm", "confirmNo": "No", "confirmYes": "Yes", "connectError": "Oops! Something went wrong and we couldn't connect to the conference.", - "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: __msg__", + "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}", "connecting": "Connecting", "contactSupport": "Contact support", "copy": "Copy", - "defaultError": "There was some kind of error", - "detectext": "Error when trying to detect desktopsharing extension.", "dismiss": "Dismiss", "displayNameRequired": "Hi! What’s your name?", "done": "Done", - "doNotShowMessageAgain": "Don't show this message again", "enterDisplayName": "Please enter your name here", "error": "Error", "externalInstallationMsg": "You need to install our desktop sharing extension.", "externalInstallationTitle": "Extension required", - "failedpermissions": "Failed to obtain permissions to use the local microphone and/or camera.", - "feedbackHelp": "Your feedback will help us to improve our video experience.", - "feedbackQuestion": "Tell us about your call!", "goToStore": "Go to the webstore", "gracefulShutdown": "Our service is currently down for maintenance. Please try again later.", - "hungUp": "You hung up", "IamHost": "I am the host", "incorrectRoomLockPassword": "Incorrect password", "incorrectPassword": "Incorrect username or password", "inlineInstallationMsg": "You need to install our desktop sharing extension.", "inlineInstallExtension": "Install now", - "internalError": "Oops! Something went wrong. The following error occurred: __error__", + "internalError": "Oops! Something went wrong. The following error occurred: {{error}}", "internalErrorTitle": "Internal error", - "joinAgain": "Join again", - "kickMessage": "You can contact __participantDisplayName__ for more details.", + "kickMessage": "You can contact {{participantDisplayName}} for more details.", "kickParticipantButton": "Kick", "kickParticipantDialog": "Are you sure you want to kick this participant?", "kickParticipantTitle": "Kick this participant?", - "kickTitle": "Ouch! __participantDisplayName__ kicked you out of the meeting", + "kickTitle": "Ouch! {{participantDisplayName}} kicked you out of the meeting", "liveStreaming": "Live Streaming", "liveStreamingDisabledForGuestTooltip": "Guests can't start live streaming.", "liveStreamingDisabledTooltip": "Start live stream disabled.", @@ -222,23 +206,20 @@ "muteParticipantDialog": "Are you sure you want to mute this participant? You won't be able to unmute them, but they can unmute themselves at any time.", "muteParticipantTitle": "Mute this participant?", "Ok": "Ok", - "oops": "Oops!", "passwordLabel": "$t(lockRoomPasswordUppercase)", "passwordNotSupported": "Setting a meeting $t(lockRoomPassword) is not supported.", "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) not supported", "passwordRequired": "$t(lockRoomPasswordUppercase) required", - "permissionDenied": "Permission Denied", "popupError": "Your browser is blocking pop-up windows from this site. Please enable pop-ups in your browser's security settings and try again.", "popupErrorTitle": "Pop-up blocked", "recording": "Recording", "recordingDisabledForGuestTooltip": "Guests can't start recordings.", "recordingDisabledTooltip": "Start recording disabled.", - "recordingToken": "Enter recording token", "rejoinNow": "Rejoin now", - "remoteControlAllowedMessage": "__user__ accepted your remote control request!", - "remoteControlDeniedMessage": "__user__ rejected your remote control request!", - "remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from __user__!", - "remoteControlRequestMessage": "Will you allow __user__ to remotely control your desktop?", + "remoteControlAllowedMessage": "{{user}} accepted your remote control request!", + "remoteControlDeniedMessage": "{{user}} rejected your remote control request!", + "remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from {{user}}!", + "remoteControlRequestMessage": "Will you allow {{user}} to remotely control your desktop?", "remoteControlShareScreenWarning": "Note that if you press \"Allow\" you will share your screen!", "remoteControlStopMessage": "The remote control session ended!", "remoteControlTitle": "Remote desktop control", @@ -247,9 +228,8 @@ "removeSharedVideoMsg": "Are you sure you would like to remove your shared video?", "removeSharedVideoTitle": "Remove shared video", "reservationError": "Reservation system error", - "reservationErrorMsg": "Error code: __code__, message: __msg__", + "reservationErrorMsg": "Error code: {{code}}, message: {{msg}}", "retry": "Retry", - "Save": "Save", "screenSharingFailedToInstall": "Oops! Your screen sharing extension failed to install.", "screenSharingFailedToInstallTitle": "Screen sharing extension failed to install", "screenSharingFirefoxPermissionDeniedError": "Something went wrong while we were trying to share your screen. Please make sure that you have given us permission to do so. ", @@ -263,9 +243,6 @@ "shareYourScreen": "Share your screen", "shareYourScreenDisabled": "Screen sharing disabled.", "shareYourScreenDisabledForGuest": "Guests can't screen share.", - "SLDFailure": "Oops! Something went wrong and we failed to mute! (SLD Failure)", - "sorryFeedback": "We're sorry to hear that. Would you like to tell us more?", - "SRDFailure": "Oops! Something went wrong and we failed to stop video! (SRD Failure)", "startLiveStreaming": "Start live stream", "startRecording": "Start recording", "startRemoteControlErrorMessage": "An error occurred while trying to start the remote control session!", @@ -275,23 +252,21 @@ "stopStreamingWarning": "Are you sure you would like to stop the live streaming?", "streamKey": "Live stream key", "Submit": "Submit", - "thankYou": "Thank you for using __appName__!", + "thankYou": "Thank you for using {{appName}}!", "token": "token", "tokenAuthFailed": "Sorry, you're not allowed to join this call.", "tokenAuthFailedTitle": "Authentication failed", "transcribing": "Transcribing", - "unableToSwitch": "Unable to switch video stream.", "unlockRoom": "Remove meeting $t(lockRoomPassword)", "userPassword": "user password", - "WaitForHostMsg": "The conference __room__ has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.", - "WaitForHostMsgWOk": "The conference __room__ has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.", + "WaitForHostMsg": "The conference {{room}} has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.", + "WaitForHostMsgWOk": "The conference {{room}} has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.", "WaitingForHost": "Waiting for the host ...", - "warning": "Warning", "Yes": "Yes", "yourEntireScreen": "Your entire screen" }, "dialOut": { - "statusMessage": "is now __status__" + "statusMessage": "is now {{status}}" }, "feedback": { "average": "Average", @@ -322,12 +297,12 @@ "dialInSummaryError": "Error fetching dial-in info now. Please try again later.", "dialInTollFree": "Toll Free", "genericError": "Whoops, something went wrong.", - "inviteLiveStream": "To view the live stream of this meeting, click this link: __url__", - "invitePhone": "To join by phone instead, tap this: __number__,,__conferenceID__#\n", - "invitePhoneAlternatives": "Looking for a different dial-in number?\nSee meeting dial-in numbers: __url__\n\n\nIf also dialing-in through a room phone, join without connecting to audio: __silentUrl__", + "inviteLiveStream": "To view the live stream of this meeting, click this link: {{url}}", + "invitePhone": "To join by phone instead, tap this: {{number}},,{{conferenceID}}#\n", + "invitePhoneAlternatives": "Looking for a different dial-in number?\nSee meeting dial-in numbers: {{url}}\n\n\nIf also dialing-in through a room phone, join without connecting to audio: {{silentUrl}}", "inviteURLFirstPartGeneral": "You are invited to join a meeting.", - "inviteURLFirstPartPersonal": "__name__ is inviting you to a meeting.\n", - "inviteURLSecondPart": "\nJoin the meeting:\n__url__\n", + "inviteURLFirstPartPersonal": "{{name}} is inviting you to a meeting.\n", + "inviteURLSecondPart": "\nJoin the meeting:\n{{url}}\n", "liveStreamURL": "Live stream:", "moreNumbers": "More numbers", "noNumbers": "No dial-in numbers.", @@ -353,7 +328,6 @@ "support": "Support", "supportMsg": "If this keeps happening, reach out to" }, - "inviteUrlDefaultMsg": "Your conference is currently being created...", "keyboardShortcuts": { "focusLocal": "Focus on your video", "focusRemote": "Focus on another person's video", @@ -373,14 +347,13 @@ "liveStreaming": { "busy": "We're working on freeing streaming resources. Please try again in a few minutes.", "busyTitle": "All streamers are currently busy", - "buttonTooltip": "Start / Stop Live Stream", "changeSignIn": "Switch accounts.", "choose": "Choose a live stream", - "chooseCTA": "Choose a streaming option. You're currently logged in as __email__.", + "chooseCTA": "Choose a streaming option. You're currently logged in as {{email}}.", "enterStreamKey": "Enter your YouTube live stream key here.", "error": "Live Streaming failed. Please try again.", "errorAPI": "An error occurred while accessing your YouTube broadcasts. Please try logging in again.", - "errorLiveStreamNotEnabled": "Live Streaming is not enabled on __email__. Please enable live streaming or log into an account with live streaming enabled.", + "errorLiveStreamNotEnabled": "Live Streaming is not enabled on {{email}}. Please enable live streaming or log into an account with live streaming enabled.", "expandedOff": "The live streaming has stopped", "expandedOn": "The meeting is currently being streamed to YouTube.", "expandedPending": "The live streaming is being started...", @@ -415,8 +388,8 @@ "me": "Me", "messages": { "engaged": "Local recording engaged.", - "finished": "Recording session __token__ finished. Please send the recorded file to the moderator.", - "finishedModerator": "Recording session __token__ finished. The recording of the local track has been saved. Please ask the other participants to submit their recordings.", + "finished": "Recording session {{token}} finished. Please send the recorded file to the moderator.", + "finishedModerator": "Recording session {{token}} finished. The recording of the local track has been saved. Please ask the other participants to submit their recordings.", "notModerator": "You are not the moderator. You cannot start or stop local recording." }, "moderator": "Moderator", @@ -432,30 +405,30 @@ "lockRoomPasswordUppercase": "Password", "me": "me", "notify": { - "connectedOneMember": "__name__ joined the meeting", - "connectedThreePlusMembers": "__name__ and __count__ others joined the meeting", - "connectedTwoMembers": "__first__ and __second__ joined the meeting", + "connectedOneMember": "{{name}} joined the meeting", + "connectedThreePlusMembers": "{{name}} and {{count}} others joined the meeting", + "connectedTwoMembers": "{{first}} and {{second}} joined the meeting", "disconnected": "disconnected", "focus": "Conference focus", - "focusFail": "__component__ not available - retry in __ms__ sec", - "grantedTo": "Moderator rights granted to __to__!", - "invitedOneMember": "__name__ has been invited", - "invitedThreePlusMembers": "__name__ and __count__ others have been invited", - "invitedTwoMembers": "__first__ and __second__ have been invited", - "kickParticipant": "__kicked__ was kicked by __kicker__", + "focusFail": "{{component}} not available - retry in {{ms}} sec", + "grantedTo": "Moderator rights granted to {{to}}!", + "invitedOneMember": "{{name}} has been invited", + "invitedThreePlusMembers": "{{name}} and {{count}} others have been invited", + "invitedTwoMembers": "{{first}} and {{second}} have been invited", + "kickParticipant": "{{kicked}} was kicked by {{kicker}}", "me": "Me", "moderator": "Moderator rights granted!", "muted": "You have started the conversation muted.", "mutedTitle": "You're muted!", - "mutedRemotelyTitle": "You have been muted by __participantDisplayName__!", + "mutedRemotelyTitle": "You have been muted by {{participantDisplayName}}!", "mutedRemotelyDescription": "You can always unmute when you're ready to speak. Mute back when you're done to keep noise away from the meeting.", "passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removed by another participant", "passwordSetRemotely": "$t(lockRoomPasswordUppercase) set by another participant", - "raisedHand": "__name__ would like to speak.", + "raisedHand": "{{name}} would like to speak.", "somebody": "Somebody", "startSilentTitle": "You joined with no audio output!", "startSilentDescription": "Rejoin the meeting to enable audio", - "suboptimalExperienceDescription": "Eer... we are afraid your experience with __appName__ isn't going to be that great here. We are looking for ways to improve this but, until then, please try using one of the fully supported browsers.", + "suboptimalExperienceDescription": "Eer... we are afraid your experience with {{appName}} isn't going to be that great here. We are looking for ways to improve this but, until then, please try using one of the fully supported browsers.", "suboptimalExperienceTitle": "Browser Warning", "unmute": "Unmute", "newDeviceCameraTitle": "New camera detected", @@ -463,7 +436,7 @@ "newDeviceAction": "Use" }, "passwordSetRemotely": "set by another participant", - "passwordDigitsOnly": "Up to __number__ digits", + "passwordDigitsOnly": "Up to {{number}} digits", "poweredby": "powered by", "presenceStatus": { "busy": "Busy", @@ -485,17 +458,12 @@ "setEmailLabel": "Set your gravatar email", "title": "Profile" }, - "raisedHand": "Would like to speak", - "recentList": { - "joinPastMeeting": "Join a past meeting" - }, "recording": { "authDropboxText": "Upload to Dropbox", - "availableSpace": "Available space: __spaceLeft__ MB (approximately __duration__ minutes of recording)", + "availableSpace": "Available space: {{spaceLeft}} MB (approximately {{duration}} minutes of recording)", "beta": "BETA", "busy": "We're working on freeing recording resources. Please try again in a few minutes.", "busyTitle": "All recorders are currently busy", - "buttonTooltip": "Start / Stop recording", "error": "Recording failed. Please try again.", "expandedOff": "Recording has stopped", "expandedOn": "The meeting is currently being recorded.", @@ -503,7 +471,7 @@ "failedToStart": "Recording failed to start", "fileSharingdescription": "Share recording with meeting participants", "live": "LIVE", - "loggedIn": "Logged in as __userName__", + "loggedIn": "Logged in as {{userName}}", "off": "Recording stopped", "on": "Recording", "pending": "Preparing to record the meeting...", @@ -512,27 +480,24 @@ "serviceName": "Recording service", "signIn": "Sign in", "signOut": "Sign out", - "startRecordingBody": "Are you sure you would like to start recording?", - "unavailable": "Oops! The __serviceName__ is currently unavailable. We're working on resolving the issue. Please try again later.", + "unavailable": "Oops! The {{serviceName}} is currently unavailable. We're working on resolving the issue. Please try again later.", "unavailableTitle": "Recording unavailable" }, "sectionList": { "pullToRefresh": "Pull to refresh" }, "settings": { - "audioVideo": "AUDIO AND VIDEO", "calendar": { - "about": "The __appName__ calendar integration is used to securely access your calendar so it can read upcoming events.", + "about": "The {{appName}} calendar integration is used to securely access your calendar so it can read upcoming events.", "disconnect": "Disconnect", "microsoftSignIn": "Sign in with Microsoft", - "signedIn": "Currently accessing calendar events for __email__. Click the Disconnect button below to stop accessing calendar events.", + "signedIn": "Currently accessing calendar events for {{email}}. Click the Disconnect button below to stop accessing calendar events.", "title": "Calendar" }, - "cameraAndMic": "Camera and microphone", "devices": "Devices", "followMe": "Everyone follows me", "language": "Language", - "loggedIn": "Logged in as __name__", + "loggedIn": "Logged in as {{name}}", "moderator": "Moderator", "more": "More", "name": "Name", @@ -542,8 +507,7 @@ "selectMic": "Microphone", "startAudioMuted": "Everyone starts muted", "startVideoMuted": "Everyone starts hidden", - "title": "Settings", - "update": "Update" + "title": "Settings" }, "settingsView": { "alertOk": "OK", @@ -561,21 +525,21 @@ "version": "Version" }, "share": { - "dialInfoText": "\n\n=====\n\nJust want to dial in on your phone?\n\n__defaultDialInNumber__Click this link to see the dial in phone numbers for this meeting\n__dialInfoPageUrl__", - "mainText": "Click the following link to join the meeting:\n__roomUrl__" + "dialInfoText": "\n\n=====\n\nJust want to dial in on your phone?\n\n{{defaultDialInNumber}}Click this link to see the dial in phone numbers for this meeting\n{{dialInfoPageUrl}}", + "mainText": "Click the following link to join the meeting:\n{{roomUrl}}" }, "speaker": "Speaker", "speakerStats": { - "hours": "__count__h", - "minutes": "__count__m", + "hours": "{{count}}h", + "minutes": "{{count}}m", "name": "Name", - "seconds": "__count__s", + "seconds": "{{count}}s", "speakerStats": "Speaker Stats", "speakerTime": "Speaker Time" }, "startupoverlay": { "policyText": " ", - "title": "__app__ needs to use your microphone and camera." + "title": "{{app}} needs to use your microphone and camera." }, "suspendedoverlay": { "rejoinKeyTitle": "Rejoin", @@ -618,33 +582,25 @@ "videoblur": "Toggle video blur" }, "addPeople": "Add people to your call", - "audioonly": "Enable / Disable audio only mode", "audioOnlyOff": "Disable audio only mode", "audioOnlyOn": "Enable audio only mode", "audioRoute": "Select the sound device", "authenticate": "Authenticate", "callQuality": "Manage video quality", - "cameraDisabled": "Camera is not available", "chat": "Open / Close chat", "closeChat": "Close chat", "documentClose": "Close shared document", "documentOpen": "Open shared document", "enterFullScreen": "View full screen", "enterTileView": "Enter tile view", - "etherpad": "Open / Close shared document", "exitFullScreen": "Exit full screen", "exitTileView": "Exit tile view", "feedback": "Leave feedback", - "filmstrip": "Show / Hide videos", - "fullscreen": "View / Exit full screen", "hangup": "Leave", "invite": "Invite people", - "lock": "Lock / Unlock room", "login": "Login", "logout": "Logout", "lowerYourHand": "Lower your hand", - "micDisabled": "Microphone is not available", - "micMutedPopup": "Your microphone has been muted so that you would fully enjoy your shared video.", "moreActions": "More actions", "mute": "Mute / Unmute", "openChat": "Open chat", @@ -654,10 +610,8 @@ "raiseYourHand": "Raise your hand", "Settings": "Settings", "sharedvideo": "Share a YouTube video", - "sharedVideoMutedPopup": "Your shared video has been muted so that you can talk to the other participants.", "shareRoom": "Invite someone", "shortcuts": "View shortcuts", - "sip": "Call SIP number", "speakerStats": "Speaker stats", "startScreenSharing": "Start screen sharing", "startSubtitles": "Start subtitles", @@ -667,7 +621,6 @@ "talkWhileMutedPopup": "Trying to speak? You are muted.", "tileViewToggle": "Toggle tile view", "toggleCamera": "Toggle camera", - "unableToUnmutePopup": "You cannot un-mute while the shared video is on.", "videomute": "Start / Stop camera", "startvideoblur": "Blur my background", "stopvideoblur": "Disable background blur" @@ -699,36 +652,29 @@ "videoSIPGW": { "busy": "We're working on freeing resources. Please try again in a few minutes.", "busyTitle": "The Room service is currently busy", - "errorAlreadyInvited": "__displayName__ already invited", + "errorAlreadyInvited": "{{displayName}} already invited", "errorInvite": "Conference not established yet. Please try again later.", "errorInviteFailed": "We're working on resolving the issue. Please try again later.", - "errorInviteFailedTitle": "Inviting __displayName__ failed", + "errorInviteFailedTitle": "Inviting {{displayName}} failed", "errorInviteTitle": "Error inviting room", - "pending": "__displayName__ has been invited", - "serviceName": "Room service", - "unavailableTitle": "Room service unavailable" + "pending": "{{displayName}} has been invited" }, "videoStatus": { "audioOnly": "AUD", "audioOnlyExpanded": "You are in audio only mode. This mode saves bandwidth but you won't see videos of others.", "callQuality": "Video Quality", "hd": "HD", - "hdTooltip": "Viewing high definition video", "highDefinition": "High definition", "labelTooiltipNoVideo": "No video", "labelTooltipAudioOnly": "Audio-only mode enabled", - "labelTooltipVideo": "Current video quality", "ld": "LD", - "ldTooltip": "Viewing low definition video", "lowDefinition": "Low definition", "onlyAudioAvailable": "Only audio is available", "onlyAudioSupported": "We only support audio in this browser.", "p2pEnabled": "Peer to Peer Enabled", "p2pVideoQualityDescription": "In peer to peer mode, received video quality can only be toggled between high and audio only. Other settings will not be honored until peer to peer is exited.", - "qualityButtonTip": "Change received video quality", "recHighDefinitionOnly": "Will prefer high definition.", "sd": "SD", - "sdTooltip": "Viewing standard definition video", "standardDefinition": "Standard definition" }, "videothumbnail": { @@ -747,14 +693,14 @@ "join": "Tap to join", "roomname": "Enter room name" }, - "appDescription": "Go ahead, video chat with the whole team. In fact, invite everyone you know. __app__ is a fully encrypted, 100% open source video conferencing solution that you can use all day, every day, for free — with no account needed.", + "appDescription": "Go ahead, video chat with the whole team. In fact, invite everyone you know. {{app}} is a fully encrypted, 100% open source video conferencing solution that you can use all day, every day, for free — with no account needed.", "audioVideoSwitch": { "audio": "Voice", "video": "Video" }, "calendar": "Calendar", "connectCalendarButton": "Connect your calendar", - "connectCalendarText": "Connect your calendar to view all your meetings in __app__. Plus, add __provider__ meetings to your calendar and start them with one click.", + "connectCalendarText": "Connect your calendar to view all your meetings in {{app}}. Plus, add {{provider}} meetings to your calendar and start them with one click.", "enterRoomTitle": "Start a new meeting", "go": "GO", "join": "JOIN", @@ -763,7 +709,7 @@ "recentList": "Recent", "recentListDelete": "Delete", "recentListEmpty": "Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.", - "reducedUIText": "Welcome to __app__!", + "reducedUIText": "Welcome to {{app}}!", "roomname": "Enter room name", "roomnameHint": "Enter the name or URL of the room you want to join. You may make a name up, just let the people you are meeting know it so that they enter the same name.", "sendFeedback": "Send feedback", diff --git a/package-lock.json b/package-lock.json index 8b3a41c23..88a5eee92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7643,11 +7643,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -8106,19 +8101,55 @@ "integrity": "sha512-NkT3lRiw7D4kKtSAVjVdHCvGlc2UOe0ALKa9IfEx0LkEDf0q3YgjP/veVk0d/OZ7yqUNzV8aJP4lJc6RPj++Gw==" }, "i18next": { - "version": "8.4.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-8.4.3.tgz", - "integrity": "sha1-Nrb/UWxPmSAQ7tzOJKNsRgnox9w=" + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-17.0.6.tgz", + "integrity": "sha512-bdNhzhcM6RG5m82RypVguCrAQNie/ycxW0Q5C6K9UDWD5hqApZfdJFbj4Ikz9jxIR+Ja1eg0yCQLhlCT+opwIg==", + "requires": { + "@babel/runtime": "^7.3.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", + "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } }, "i18next-browser-languagedetector": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-2.0.0.tgz", - "integrity": "sha1-TZ3yvRpd7aPIwKbT22LVA4i57t0=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-3.0.1.tgz", + "integrity": "sha512-WFjPLNPWl62uu07AHY2g+KsC9qz0tyMq+OZEB/H7N58YKL/JLiCz9U709gaR20Mule/Ppn+uyfVx5REJJjn1HA==" }, "i18next-xhr-backend": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-1.4.2.tgz", - "integrity": "sha1-eqdmKSxGyoP/ZHe7VQdLNjpkamI=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.0.0.tgz", + "integrity": "sha512-Pi/X91Zk2nEqdEHTV+FG6VeMHRcMcPKRsYW/A0wlaCfKsoJc3TI7A75Tqse/d5LVGN2Ymzx0FT+R+gLag9Eb2g==", + "requires": { + "@babel/runtime": "^7.4.5" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", + "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } }, "iconv-lite": { "version": "0.4.19", @@ -8807,9 +8838,9 @@ "integrity": "sha1-5lrOBg2M2tTQ5d94FdDXA55RdFA=" }, "jquery-i18next": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.0.tgz", - "integrity": "sha1-jQMDa7ip1v090MX7H+jK0jO94qM=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.1.tgz", + "integrity": "sha512-UNcw3rgxoKjGEg4w23FEn2h3OlPJU7rPzsgDuXDBZktIzeiVbJohs9Cv9hj8oP8KNfBRKOoErL/OVxg2FaAR4g==" }, "js-base64": { "version": "2.4.3", @@ -12138,13 +12169,27 @@ } }, "react-i18next": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-7.13.0.tgz", - "integrity": "sha512-35M+MZFPqHwVIas7tXWQKFrf+ozCJukNplUTiGqL8mczSk+VRBsHxxXuuQKRkz/4CcWkONGWbp/AzxfM6wZncg==", + "version": "10.11.4", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-10.11.4.tgz", + "integrity": "sha512-/CWXaf3a5BLNeVnBGxzWOIZLQgSNEc2LWHX4ZaJb7ww0xgY0S5K9HRAMzJIHeHGe7jfpSraprD66VDblWb4ZXA==", "requires": { - "hoist-non-react-statics": "^2.3.1", - "html-parse-stringify2": "2.0.1", - "prop-types": "^15.6.0" + "@babel/runtime": "^7.3.1", + "html-parse-stringify2": "2.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", + "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } } }, "react-is": { diff --git a/package.json b/package.json index 5cd65a456..61897eabd 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,14 @@ "bc-css-flags": "3.0.0", "dropbox": "4.0.9", "i18n-iso-countries": "3.7.8", - "i18next": "8.4.3", - "i18next-browser-languagedetector": "2.0.0", - "i18next-xhr-backend": "1.4.2", + "i18next": "17.0.6", + "i18next-browser-languagedetector": "3.0.1", + "i18next-xhr-backend": "3.0.0", "jQuery-Impromptu": "github:trentrichardson/jQuery-Impromptu#v6.0.0", "jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#6fff754a77a56ab52499f3559105a15886942a1e", "jquery": "3.3.1", "jquery-contextmenu": "2.4.5", - "jquery-i18next": "1.2.0", + "jquery-i18next": "1.2.1", "js-md5": "0.6.1", "js-utils": "github:jitsi/js-utils#192b1c996e8c05530eb1f19e82a31069c3021e31", "jsrsasign": "8.0.12", @@ -63,7 +63,7 @@ "react": "16.8.3", "react-dom": "16.8.3", "react-emoji-render": "0.4.6", - "react-i18next": "7.13.0", + "react-i18next": "10.11.4", "react-linkify": "0.2.2", "react-native": "0.59.8", "react-native-background-timer": "2.1.1", diff --git a/react/features/base/i18n/functions.js b/react/features/base/i18n/functions.js index 510ed6b82..9af593655 100644 --- a/react/features/base/i18n/functions.js +++ b/react/features/base/i18n/functions.js @@ -1,20 +1,16 @@ import React from 'react'; -import { translate as reactI18nextTranslate } from 'react-i18next'; +import { withTranslation } from 'react-i18next'; /** * Wraps a specific React Component in order to enable translations in it. * * @param {Component} component - The React Component to wrap. - * @param {Object} options - Additional options to pass into react-i18next's - * initialization. * @returns {Component} The React Component which wraps {@link component} and * enables translations in it. */ -export function translate(component, options = { wait: true }) { +export function translate(component) { // Use the default list of namespaces. - return ( - reactI18nextTranslate([ 'main', 'languages', 'countries' ], options)( - component)); + return withTranslation([ 'main', 'languages', 'countries' ])(component); } /** diff --git a/react/features/base/i18n/i18next.js b/react/features/base/i18n/i18next.js index 11ba78210..f2aaf34cf 100644 --- a/react/features/base/i18n/i18next.js +++ b/react/features/base/i18n/i18next.js @@ -40,22 +40,25 @@ const options = { app: (typeof interfaceConfig !== 'undefined' && interfaceConfig.APP_NAME) || 'Jitsi Meet', - compatibilityAPI: 'v1', - compatibilityJSON: 'v1', + backend: { + loadPath: 'lang/__ns__-__lng__.json' + }, + defaultNS: 'main', fallbackLng: DEFAULT_LANGUAGE, - fallbackOnEmpty: true, - fallbackOnNull: true, + interpolation: { + escapeValue: false // not needed for react as it escapes by default + }, + load: 'languageOnly', + ns: [ 'main', 'languages', 'countries' ], + react: { + useSuspense: false + }, + returnEmptyString: false, + returnNull: false, // XXX i18next modifies the array lngWhitelist so make sure to clone // LANGUAGES. - lngWhitelist: LANGUAGES.slice(), - load: 'unspecific', - ns: { - defaultNs: 'main', - namespaces: [ 'main', 'languages', 'countries' ] - }, - resGetPath: 'lang/__ns__-__lng__.json', - useDataAttrOptions: true + whitelist: LANGUAGES.slice() }; i18next diff --git a/react/features/chat/components/web/ChatMessage.js b/react/features/chat/components/web/ChatMessage.js index 5b1c8e001..4ff1f6e35 100644 --- a/react/features/chat/components/web/ChatMessage.js +++ b/react/features/chat/components/web/ChatMessage.js @@ -97,4 +97,4 @@ class ChatMessage extends AbstractChatMessage { } } -export default translate(ChatMessage, { wait: false }); +export default translate(ChatMessage); diff --git a/react/features/recording/middleware.js b/react/features/recording/middleware.js index 42a2c2a80..dae5036e5 100644 --- a/react/features/recording/middleware.js +++ b/react/features/recording/middleware.js @@ -182,8 +182,8 @@ function _showRecordingErrorNotification(recorderSession, dispatch) { descriptionKey: 'recording.unavailable', descriptionArguments: { serviceName: isStreamMode - ? 'Live Streaming service' - : 'Recording service' + ? '$t(liveStreaming.serviceName)' + : '$t(recording.serviceName)' }, titleKey: isStreamMode ? 'liveStreaming.unavailableTitle'