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'