Parcourir la source

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.
j8
Дамян Минков il y a 6 ans
Parent
révision
9f4da84701
Aucun compte lié à l'adresse e-mail de l'auteur

+ 67
- 121
lang/main.json Voir le fichier

@@ -6,17 +6,15 @@
6 6
         "disabled": "You can't invite people.",
7 7
         "failedToAdd": "Failed to add participants",
8 8
         "footerText": "Dialing out is disabled.",
9
-        "invite": "Invite",
10 9
         "loading": "Searching for people and phone numbers",
11 10
         "loadingNumber": "Validating phone number",
12 11
         "loadingPeople": "Searching for people to invite",
13 12
         "noResults": "No matching search results",
14
-        "notAvailable": "You can't invite people.",
15 13
         "noValidNumbers": "Please enter a phone number",
16 14
         "searchNumbers": "Add phone numbers",
17 15
         "searchPeople": "Search for people",
18 16
         "searchPeopleAndNumbers": "Search for people or add their phone numbers",
19
-        "telephone": "Telephone: __number__",
17
+        "telephone": "Telephone: {{number}}",
20 18
         "title": "Invite people to this meeting"
21 19
     },
22 20
     "audioDevices": {
@@ -26,13 +24,11 @@
26 24
         "speaker": "Speaker"
27 25
     },
28 26
     "audioOnly": {
29
-        "audioOnly": "Audio only",
30
-        "featureToggleDisabled": "Toggling of __feature__ is disabled while in audio only mode"
27
+        "audioOnly": "Audio only"
31 28
     },
32 29
     "calendarSync": {
33 30
         "addMeetingURL": "Add a meeting link",
34 31
         "confirmAddLink": "Do you want to add a Jitsi link to this event?",
35
-        "confirmAddLinkTitle": "Calendar",
36 32
         "error": {
37 33
             "appConfiguration": "Calendar integration is not properly configured.",
38 34
             "generic": "An error has occurred. Please check your calendar settings or try refreshing the calendar.",
@@ -49,7 +45,7 @@
49 45
         "today": "Today"
50 46
     },
51 47
     "chat": {
52
-        "error": "Error: your message \"__originalText__\" was not sent. Reason: __error__",
48
+        "error": "Error: your message \"{{originalText}}\" was not sent. Reason: {{error}}",
53 49
         "messagebox": "Type a message",
54 50
         "nickname": {
55 51
             "popover": "Choose a nickname",
@@ -71,11 +67,11 @@
71 67
         "DISCONNECTING": "Disconnecting",
72 68
         "ERROR": "Error",
73 69
         "FETCH_SESSION_ID": "Obtaining session-id...",
74
-        "GET_SESSION_ID_ERROR": "Get session-id error: __code__",
70
+        "GET_SESSION_ID_ERROR": "Get session-id error: {{code}}",
75 71
         "GOT_SESSION_ID": "Obtaining session-id... Done",
76
-        "LOW_BANDWIDTH": "Video for __displayName__ has been turned off to save bandwidth",
72
+        "LOW_BANDWIDTH": "Video for {{displayName}} has been turned off to save bandwidth",
77 73
         "RECONNECTING": "A network problem occurred. Reconnecting...",
78
-        "USER_CONNECTION_INTERRUPTED": "__displayName__ is having connectivity issues..."
74
+        "USER_CONNECTION_INTERRUPTED": "{{displayName}} is having connectivity issues..."
79 75
     },
80 76
     "connectionindicator": {
81 77
         "address": "Address:",
@@ -85,14 +81,12 @@
85 81
         "connectedTo": "Connected to:",
86 82
         "e2e_rtt": "E2E RTT:",
87 83
         "framerate": "Frame rate:",
88
-        "header": "Connection data",
89 84
         "less": "Show less",
90 85
         "localaddress": "Local address:",
91 86
         "localaddress_plural": "Local addresses:",
92 87
         "localport": "Local port:",
93 88
         "localport_plural": "Local ports:",
94 89
         "more": "Show more",
95
-        "na": "Come back here for connection information once the conference starts",
96 90
         "packetloss": "Packet loss:",
97 91
         "peer_to_peer": " (p2p)",
98 92
         "quality": {
@@ -118,17 +112,16 @@
118 112
         "yesterday": "Yesterday"
119 113
     },
120 114
     "deepLinking": {
121
-        "appNotInstalled": "You need the __app__ mobile app to join this meeting on your phone.",
122
-        "description": "Nothing happened? We tried launching your meeting in the __app__ desktop app. Try again or launch it in the __app__ web app.",
123
-        "descriptionWithoutWeb": "Nothing happened? We tried launching your meeting in the __app__ desktop app.",
115
+        "appNotInstalled": "You need the {{app}} mobile app to join this meeting on your phone.",
116
+        "description": "Nothing happened? We tried launching your meeting in the {{app}} desktop app. Try again or launch it in the {{app}} web app.",
117
+        "descriptionWithoutWeb": "Nothing happened? We tried launching your meeting in the {{app}} desktop app.",
124 118
         "downloadApp": "Download the app",
125 119
         "launchWebButton": "Launch in web",
126 120
         "openApp": "Continue to the app",
127
-        "title": "Launching your meeting in __app__...",
121
+        "title": "Launching your meeting in {{app}}...",
128 122
         "tryAgainButton": "Try again in desktop"
129 123
     },
130
-    "defaultLink": "e.g. __url__",
131
-    "defaultNickname": "ex. Jane Pink",
124
+    "defaultLink": "e.g. {{url}}",
132 125
     "deviceError": {
133 126
         "cameraError": "Failed to access your camera",
134 127
         "cameraPermission": "Error obtaining camera permission",
@@ -136,7 +129,6 @@
136 129
         "microphonePermission": "Error obtaining microphone permission"
137 130
     },
138 131
     "deviceSelection": {
139
-        "deviceSettings": "Device settings",
140 132
         "noPermission": "Permission not granted",
141 133
         "previewUnavailable": "Preview unavailable",
142 134
         "selectADevice": "Select a device",
@@ -160,47 +152,39 @@
160 152
         "cameraUnsupportedResolutionError": "Your camera does not support required video resolution.",
161 153
         "Cancel": "Cancel",
162 154
         "close": "Close",
163
-        "conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in __seconds__ sec...",
155
+        "conferenceDisconnectMsg": "You may want to check your network connection. Reconnecting in {{seconds}} sec...",
164 156
         "conferenceDisconnectTitle": "You have been disconnected.",
165
-        "conferenceReloadMsg": "We're trying to fix this. Reconnecting in __seconds__ sec...",
157
+        "conferenceReloadMsg": "We're trying to fix this. Reconnecting in {{seconds}} sec...",
166 158
         "conferenceReloadTitle": "Unfortunately, something went wrong.",
167 159
         "confirm": "Confirm",
168 160
         "confirmNo": "No",
169 161
         "confirmYes": "Yes",
170 162
         "connectError": "Oops! Something went wrong and we couldn't connect to the conference.",
171
-        "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: __msg__",
163
+        "connectErrorWithMsg": "Oops! Something went wrong and we couldn't connect to the conference: {{msg}}",
172 164
         "connecting": "Connecting",
173 165
         "contactSupport": "Contact support",
174 166
         "copy": "Copy",
175
-        "defaultError": "There was some kind of error",
176
-        "detectext": "Error when trying to detect desktopsharing extension.",
177 167
         "dismiss": "Dismiss",
178 168
         "displayNameRequired": "Hi! What’s your name?",
179 169
         "done": "Done",
180
-        "doNotShowMessageAgain": "Don't show this message again",
181 170
         "enterDisplayName": "Please enter your name here",
182 171
         "error": "Error",
183 172
         "externalInstallationMsg": "You need to install our desktop sharing extension.",
184 173
         "externalInstallationTitle": "Extension required",
185
-        "failedpermissions": "Failed to obtain permissions to use the local microphone and/or camera.",
186
-        "feedbackHelp": "Your feedback will help us to improve our video experience.",
187
-        "feedbackQuestion": "Tell us about your call!",
188 174
         "goToStore": "Go to the webstore",
189 175
         "gracefulShutdown": "Our service is currently down for maintenance. Please try again later.",
190
-        "hungUp": "You hung up",
191 176
         "IamHost": "I am the host",
192 177
         "incorrectRoomLockPassword": "Incorrect password",
193 178
         "incorrectPassword": "Incorrect username or password",
194 179
         "inlineInstallationMsg": "You need to install our desktop sharing extension.",
195 180
         "inlineInstallExtension": "Install now",
196
-        "internalError": "Oops! Something went wrong. The following error occurred: __error__",
181
+        "internalError": "Oops! Something went wrong. The following error occurred: {{error}}",
197 182
         "internalErrorTitle": "Internal error",
198
-        "joinAgain": "Join again",
199
-        "kickMessage": "You can contact __participantDisplayName__ for more details.",
183
+        "kickMessage": "You can contact {{participantDisplayName}} for more details.",
200 184
         "kickParticipantButton": "Kick",
201 185
         "kickParticipantDialog": "Are you sure you want to kick this participant?",
202 186
         "kickParticipantTitle": "Kick this participant?",
203
-        "kickTitle": "Ouch! __participantDisplayName__ kicked you out of the meeting",
187
+        "kickTitle": "Ouch! {{participantDisplayName}} kicked you out of the meeting",
204 188
         "liveStreaming": "Live Streaming",
205 189
         "liveStreamingDisabledForGuestTooltip": "Guests can't start live streaming.",
206 190
         "liveStreamingDisabledTooltip": "Start live stream disabled.",
@@ -222,23 +206,20 @@
222 206
         "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.",
223 207
         "muteParticipantTitle": "Mute this participant?",
224 208
         "Ok": "Ok",
225
-        "oops": "Oops!",
226 209
         "passwordLabel": "$t(lockRoomPasswordUppercase)",
227 210
         "passwordNotSupported": "Setting a meeting $t(lockRoomPassword) is not supported.",
228 211
         "passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) not supported",
229 212
         "passwordRequired": "$t(lockRoomPasswordUppercase) required",
230
-        "permissionDenied": "Permission Denied",
231 213
         "popupError": "Your browser is blocking pop-up windows from this site. Please enable pop-ups in your browser's security settings and try again.",
232 214
         "popupErrorTitle": "Pop-up blocked",
233 215
         "recording": "Recording",
234 216
         "recordingDisabledForGuestTooltip": "Guests can't start recordings.",
235 217
         "recordingDisabledTooltip": "Start recording disabled.",
236
-        "recordingToken": "Enter recording token",
237 218
         "rejoinNow": "Rejoin now",
238
-        "remoteControlAllowedMessage": "__user__ accepted your remote control request!",
239
-        "remoteControlDeniedMessage": "__user__ rejected your remote control request!",
240
-        "remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from __user__!",
241
-        "remoteControlRequestMessage": "Will you allow __user__ to remotely control your desktop?",
219
+        "remoteControlAllowedMessage": "{{user}} accepted your remote control request!",
220
+        "remoteControlDeniedMessage": "{{user}} rejected your remote control request!",
221
+        "remoteControlErrorMessage": "An error occurred while trying to request remote control permissions from {{user}}!",
222
+        "remoteControlRequestMessage": "Will you allow {{user}} to remotely control your desktop?",
242 223
         "remoteControlShareScreenWarning": "Note that if you press \"Allow\" you will share your screen!",
243 224
         "remoteControlStopMessage": "The remote control session ended!",
244 225
         "remoteControlTitle": "Remote desktop control",
@@ -247,9 +228,8 @@
247 228
         "removeSharedVideoMsg": "Are you sure you would like to remove your shared video?",
248 229
         "removeSharedVideoTitle": "Remove shared video",
249 230
         "reservationError": "Reservation system error",
250
-        "reservationErrorMsg": "Error code: __code__, message: __msg__",
231
+        "reservationErrorMsg": "Error code: {{code}}, message: {{msg}}",
251 232
         "retry": "Retry",
252
-        "Save": "Save",
253 233
         "screenSharingFailedToInstall": "Oops! Your screen sharing extension failed to install.",
254 234
         "screenSharingFailedToInstallTitle": "Screen sharing extension failed to install",
255 235
         "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 @@
263 243
         "shareYourScreen": "Share your screen",
264 244
         "shareYourScreenDisabled": "Screen sharing disabled.",
265 245
         "shareYourScreenDisabledForGuest": "Guests can't screen share.",
266
-        "SLDFailure": "Oops! Something went wrong and we failed to mute! (SLD Failure)",
267
-        "sorryFeedback": "We're sorry to hear that. Would you like to tell us more?",
268
-        "SRDFailure": "Oops! Something went wrong and we failed to stop video! (SRD Failure)",
269 246
         "startLiveStreaming": "Start live stream",
270 247
         "startRecording": "Start recording",
271 248
         "startRemoteControlErrorMessage": "An error occurred while trying to start the remote control session!",
@@ -275,23 +252,21 @@
275 252
         "stopStreamingWarning": "Are you sure you would like to stop the live streaming?",
276 253
         "streamKey": "Live stream key",
277 254
         "Submit": "Submit",
278
-        "thankYou": "Thank you for using __appName__!",
255
+        "thankYou": "Thank you for using {{appName}}!",
279 256
         "token": "token",
280 257
         "tokenAuthFailed": "Sorry, you're not allowed to join this call.",
281 258
         "tokenAuthFailedTitle": "Authentication failed",
282 259
         "transcribing": "Transcribing",
283
-        "unableToSwitch": "Unable to switch video stream.",
284 260
         "unlockRoom": "Remove meeting $t(lockRoomPassword)",
285 261
         "userPassword": "user password",
286
-        "WaitForHostMsg": "The conference <b>__room__</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
287
-        "WaitForHostMsgWOk": "The conference <b>__room__</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
262
+        "WaitForHostMsg": "The conference <b>{{room}}</b> has not yet started. If you are the host then please authenticate. Otherwise, please wait for the host to arrive.",
263
+        "WaitForHostMsgWOk": "The conference <b>{{room}}</b> has not yet started. If you are the host then please press Ok to authenticate. Otherwise, please wait for the host to arrive.",
288 264
         "WaitingForHost": "Waiting for the host ...",
289
-        "warning": "Warning",
290 265
         "Yes": "Yes",
291 266
         "yourEntireScreen": "Your entire screen"
292 267
     },
293 268
     "dialOut": {
294
-        "statusMessage": "is now __status__"
269
+        "statusMessage": "is now {{status}}"
295 270
     },
296 271
     "feedback": {
297 272
         "average": "Average",
@@ -322,12 +297,12 @@
322 297
         "dialInSummaryError": "Error fetching dial-in info now. Please try again later.",
323 298
         "dialInTollFree": "Toll Free",
324 299
         "genericError": "Whoops, something went wrong.",
325
-        "inviteLiveStream": "To view the live stream of this meeting, click this link: __url__",
326
-        "invitePhone": "To join by phone instead, tap this: __number__,,__conferenceID__#\n",
327
-        "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__",
300
+        "inviteLiveStream": "To view the live stream of this meeting, click this link: {{url}}",
301
+        "invitePhone": "To join by phone instead, tap this: {{number}},,{{conferenceID}}#\n",
302
+        "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}}",
328 303
         "inviteURLFirstPartGeneral": "You are invited to join a meeting.",
329
-        "inviteURLFirstPartPersonal": "__name__ is inviting you to a meeting.\n",
330
-        "inviteURLSecondPart": "\nJoin the meeting:\n__url__\n",
304
+        "inviteURLFirstPartPersonal": "{{name}} is inviting you to a meeting.\n",
305
+        "inviteURLSecondPart": "\nJoin the meeting:\n{{url}}\n",
331 306
         "liveStreamURL": "Live stream:",
332 307
         "moreNumbers": "More numbers",
333 308
         "noNumbers": "No dial-in numbers.",
@@ -353,7 +328,6 @@
353 328
         "support": "Support",
354 329
         "supportMsg": "If this keeps happening, reach out to"
355 330
     },
356
-    "inviteUrlDefaultMsg": "Your conference is currently being created...",
357 331
     "keyboardShortcuts": {
358 332
         "focusLocal": "Focus on your video",
359 333
         "focusRemote": "Focus on another person's video",
@@ -373,14 +347,13 @@
373 347
     "liveStreaming": {
374 348
         "busy": "We're working on freeing streaming resources. Please try again in a few minutes.",
375 349
         "busyTitle": "All streamers are currently busy",
376
-        "buttonTooltip": "Start / Stop Live Stream",
377 350
         "changeSignIn": "Switch accounts.",
378 351
         "choose": "Choose a live stream",
379
-        "chooseCTA": "Choose a streaming option. You're currently logged in as __email__.",
352
+        "chooseCTA": "Choose a streaming option. You're currently logged in as {{email}}.",
380 353
         "enterStreamKey": "Enter your YouTube live stream key here.",
381 354
         "error": "Live Streaming failed. Please try again.",
382 355
         "errorAPI": "An error occurred while accessing your YouTube broadcasts. Please try logging in again.",
383
-        "errorLiveStreamNotEnabled": "Live Streaming is not enabled on __email__. Please enable live streaming or log into an account with live streaming enabled.",
356
+        "errorLiveStreamNotEnabled": "Live Streaming is not enabled on {{email}}. Please enable live streaming or log into an account with live streaming enabled.",
384 357
         "expandedOff": "The live streaming has stopped",
385 358
         "expandedOn": "The meeting is currently being streamed to YouTube.",
386 359
         "expandedPending": "The live streaming is being started...",
@@ -415,8 +388,8 @@
415 388
         "me": "Me",
416 389
         "messages": {
417 390
             "engaged": "Local recording engaged.",
418
-            "finished": "Recording session __token__ finished. Please send the recorded file to the moderator.",
419
-            "finishedModerator": "Recording session __token__ finished. The recording of the local track has been saved. Please ask the other participants to submit their recordings.",
391
+            "finished": "Recording session {{token}} finished. Please send the recorded file to the moderator.",
392
+            "finishedModerator": "Recording session {{token}} finished. The recording of the local track has been saved. Please ask the other participants to submit their recordings.",
420 393
             "notModerator": "You are not the moderator. You cannot start or stop local recording."
421 394
         },
422 395
         "moderator": "Moderator",
@@ -432,30 +405,30 @@
432 405
     "lockRoomPasswordUppercase": "Password",
433 406
     "me": "me",
434 407
     "notify": {
435
-        "connectedOneMember": "__name__ joined the meeting",
436
-        "connectedThreePlusMembers": "__name__ and __count__ others joined the meeting",
437
-        "connectedTwoMembers": "__first__ and __second__ joined the meeting",
408
+        "connectedOneMember": "{{name}} joined the meeting",
409
+        "connectedThreePlusMembers": "{{name}} and {{count}} others joined the meeting",
410
+        "connectedTwoMembers": "{{first}} and {{second}} joined the meeting",
438 411
         "disconnected": "disconnected",
439 412
         "focus": "Conference focus",
440
-        "focusFail": "__component__ not available - retry in __ms__ sec",
441
-        "grantedTo": "Moderator rights granted to __to__!",
442
-        "invitedOneMember": "__name__ has been invited",
443
-        "invitedThreePlusMembers": "__name__ and __count__ others have been invited",
444
-        "invitedTwoMembers": "__first__ and __second__ have been invited",
445
-        "kickParticipant": "__kicked__ was kicked by __kicker__",
413
+        "focusFail": "{{component}} not available - retry in {{ms}} sec",
414
+        "grantedTo": "Moderator rights granted to {{to}}!",
415
+        "invitedOneMember": "{{name}} has been invited",
416
+        "invitedThreePlusMembers": "{{name}} and {{count}} others have been invited",
417
+        "invitedTwoMembers": "{{first}} and {{second}} have been invited",
418
+        "kickParticipant": "{{kicked}} was kicked by {{kicker}}",
446 419
         "me": "Me",
447 420
         "moderator": "Moderator rights granted!",
448 421
         "muted": "You have started the conversation muted.",
449 422
         "mutedTitle": "You're muted!",
450
-        "mutedRemotelyTitle": "You have been muted by __participantDisplayName__!",
423
+        "mutedRemotelyTitle": "You have been muted by {{participantDisplayName}}!",
451 424
         "mutedRemotelyDescription": "You can always unmute when you're ready to speak. Mute back when you're done to keep noise away from the meeting.",
452 425
         "passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) removed by another participant",
453 426
         "passwordSetRemotely": "$t(lockRoomPasswordUppercase) set by another participant",
454
-        "raisedHand": "__name__ would like to speak.",
427
+        "raisedHand": "{{name}} would like to speak.",
455 428
         "somebody": "Somebody",
456 429
         "startSilentTitle": "You joined with no audio output!",
457 430
         "startSilentDescription": "Rejoin the meeting to enable audio",
458
-        "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 <a href='static/recommendedBrowsers.html' target='_blank'>fully supported browsers</a>.",
431
+        "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 <a href='static/recommendedBrowsers.html' target='_blank'>fully supported browsers</a>.",
459 432
         "suboptimalExperienceTitle": "Browser Warning",
460 433
         "unmute": "Unmute",
461 434
         "newDeviceCameraTitle": "New camera detected",
@@ -463,7 +436,7 @@
463 436
         "newDeviceAction": "Use"
464 437
     },
465 438
     "passwordSetRemotely": "set by another participant",
466
-    "passwordDigitsOnly": "Up to __number__ digits",
439
+    "passwordDigitsOnly": "Up to {{number}} digits",
467 440
     "poweredby": "powered by",
468 441
     "presenceStatus": {
469 442
         "busy": "Busy",
@@ -485,17 +458,12 @@
485 458
         "setEmailLabel": "Set your gravatar email",
486 459
         "title": "Profile"
487 460
     },
488
-    "raisedHand": "Would like to speak",
489
-    "recentList": {
490
-        "joinPastMeeting": "Join a past meeting"
491
-    },
492 461
     "recording": {
493 462
         "authDropboxText": "Upload to Dropbox",
494
-        "availableSpace": "Available space: __spaceLeft__ MB (approximately __duration__ minutes of recording)",
463
+        "availableSpace": "Available space: {{spaceLeft}} MB (approximately {{duration}} minutes of recording)",
495 464
         "beta": "BETA",
496 465
         "busy": "We're working on freeing recording resources. Please try again in a few minutes.",
497 466
         "busyTitle": "All recorders are currently busy",
498
-        "buttonTooltip": "Start / Stop recording",
499 467
         "error": "Recording failed. Please try again.",
500 468
         "expandedOff": "Recording has stopped",
501 469
         "expandedOn": "The meeting is currently being recorded.",
@@ -503,7 +471,7 @@
503 471
         "failedToStart": "Recording failed to start",
504 472
         "fileSharingdescription": "Share recording with meeting participants",
505 473
         "live": "LIVE",
506
-        "loggedIn": "Logged in as __userName__",
474
+        "loggedIn": "Logged in as {{userName}}",
507 475
         "off": "Recording stopped",
508 476
         "on": "Recording",
509 477
         "pending": "Preparing to record the meeting...",
@@ -512,27 +480,24 @@
512 480
         "serviceName": "Recording service",
513 481
         "signIn": "Sign in",
514 482
         "signOut": "Sign out",
515
-        "startRecordingBody": "Are you sure you would like to start recording?",
516
-        "unavailable": "Oops! The __serviceName__ is currently unavailable. We're working on resolving the issue. Please try again later.",
483
+        "unavailable": "Oops! The {{serviceName}} is currently unavailable. We're working on resolving the issue. Please try again later.",
517 484
         "unavailableTitle": "Recording unavailable"
518 485
     },
519 486
     "sectionList": {
520 487
         "pullToRefresh": "Pull to refresh"
521 488
     },
522 489
     "settings": {
523
-        "audioVideo": "AUDIO AND VIDEO",
524 490
         "calendar": {
525
-            "about": "The __appName__ calendar integration is used to securely access your calendar so it can read upcoming events.",
491
+            "about": "The {{appName}} calendar integration is used to securely access your calendar so it can read upcoming events.",
526 492
             "disconnect": "Disconnect",
527 493
             "microsoftSignIn": "Sign in with Microsoft",
528
-            "signedIn": "Currently accessing calendar events for __email__. Click the Disconnect button below to stop accessing calendar events.",
494
+            "signedIn": "Currently accessing calendar events for {{email}}. Click the Disconnect button below to stop accessing calendar events.",
529 495
             "title": "Calendar"
530 496
         },
531
-        "cameraAndMic": "Camera and microphone",
532 497
         "devices": "Devices",
533 498
         "followMe": "Everyone follows me",
534 499
         "language": "Language",
535
-        "loggedIn": "Logged in as __name__",
500
+        "loggedIn": "Logged in as {{name}}",
536 501
         "moderator": "Moderator",
537 502
         "more": "More",
538 503
         "name": "Name",
@@ -542,8 +507,7 @@
542 507
         "selectMic": "Microphone",
543 508
         "startAudioMuted": "Everyone starts muted",
544 509
         "startVideoMuted": "Everyone starts hidden",
545
-        "title": "Settings",
546
-        "update": "Update"
510
+        "title": "Settings"
547 511
     },
548 512
     "settingsView": {
549 513
         "alertOk": "OK",
@@ -561,21 +525,21 @@
561 525
         "version": "Version"
562 526
     },
563 527
     "share": {
564
-        "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__",
565
-        "mainText": "Click the following link to join the meeting:\n__roomUrl__"
528
+        "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}}",
529
+        "mainText": "Click the following link to join the meeting:\n{{roomUrl}}"
566 530
     },
567 531
     "speaker": "Speaker",
568 532
     "speakerStats": {
569
-        "hours": "__count__h",
570
-        "minutes": "__count__m",
533
+        "hours": "{{count}}h",
534
+        "minutes": "{{count}}m",
571 535
         "name": "Name",
572
-        "seconds": "__count__s",
536
+        "seconds": "{{count}}s",
573 537
         "speakerStats": "Speaker Stats",
574 538
         "speakerTime": "Speaker Time"
575 539
     },
576 540
     "startupoverlay": {
577 541
         "policyText": " ",
578
-        "title": "__app__ needs to use your microphone and camera."
542
+        "title": "{{app}} needs to use your microphone and camera."
579 543
     },
580 544
     "suspendedoverlay": {
581 545
         "rejoinKeyTitle": "Rejoin",
@@ -618,33 +582,25 @@
618 582
             "videoblur": "Toggle video blur"
619 583
         },
620 584
         "addPeople": "Add people to your call",
621
-        "audioonly": "Enable / Disable audio only mode",
622 585
         "audioOnlyOff": "Disable audio only mode",
623 586
         "audioOnlyOn": "Enable audio only mode",
624 587
         "audioRoute": "Select the sound device",
625 588
         "authenticate": "Authenticate",
626 589
         "callQuality": "Manage video quality",
627
-        "cameraDisabled": "Camera is not available",
628 590
         "chat": "Open / Close chat",
629 591
         "closeChat": "Close chat",
630 592
         "documentClose": "Close shared document",
631 593
         "documentOpen": "Open shared document",
632 594
         "enterFullScreen": "View full screen",
633 595
         "enterTileView": "Enter tile view",
634
-        "etherpad": "Open / Close shared document",
635 596
         "exitFullScreen": "Exit full screen",
636 597
         "exitTileView": "Exit tile view",
637 598
         "feedback": "Leave feedback",
638
-        "filmstrip": "Show / Hide videos",
639
-        "fullscreen": "View / Exit full screen",
640 599
         "hangup": "Leave",
641 600
         "invite": "Invite people",
642
-        "lock": "Lock / Unlock room",
643 601
         "login": "Login",
644 602
         "logout": "Logout",
645 603
         "lowerYourHand": "Lower your hand",
646
-        "micDisabled": "Microphone is not available",
647
-        "micMutedPopup": "Your microphone has been muted so that you would fully enjoy your shared video.",
648 604
         "moreActions": "More actions",
649 605
         "mute": "Mute / Unmute",
650 606
         "openChat": "Open chat",
@@ -654,10 +610,8 @@
654 610
         "raiseYourHand": "Raise your hand",
655 611
         "Settings": "Settings",
656 612
         "sharedvideo": "Share a YouTube video",
657
-        "sharedVideoMutedPopup": "Your shared video has been muted so that you can talk to the other participants.",
658 613
         "shareRoom": "Invite someone",
659 614
         "shortcuts": "View shortcuts",
660
-        "sip": "Call SIP number",
661 615
         "speakerStats": "Speaker stats",
662 616
         "startScreenSharing": "Start screen sharing",
663 617
         "startSubtitles": "Start subtitles",
@@ -667,7 +621,6 @@
667 621
         "talkWhileMutedPopup": "Trying to speak? You are muted.",
668 622
         "tileViewToggle": "Toggle tile view",
669 623
         "toggleCamera": "Toggle camera",
670
-        "unableToUnmutePopup": "You cannot un-mute while the shared video is on.",
671 624
         "videomute": "Start / Stop camera",
672 625
         "startvideoblur": "Blur my background",
673 626
         "stopvideoblur": "Disable background blur"
@@ -699,36 +652,29 @@
699 652
     "videoSIPGW": {
700 653
         "busy": "We're working on freeing resources. Please try again in a few minutes.",
701 654
         "busyTitle": "The Room service is currently busy",
702
-        "errorAlreadyInvited": "__displayName__ already invited",
655
+        "errorAlreadyInvited": "{{displayName}} already invited",
703 656
         "errorInvite": "Conference not established yet. Please try again later.",
704 657
         "errorInviteFailed": "We're working on resolving the issue. Please try again later.",
705
-        "errorInviteFailedTitle": "Inviting __displayName__ failed",
658
+        "errorInviteFailedTitle": "Inviting {{displayName}} failed",
706 659
         "errorInviteTitle": "Error inviting room",
707
-        "pending": "__displayName__ has been invited",
708
-        "serviceName": "Room service",
709
-        "unavailableTitle": "Room service unavailable"
660
+        "pending": "{{displayName}} has been invited"
710 661
     },
711 662
     "videoStatus": {
712 663
         "audioOnly": "AUD",
713 664
         "audioOnlyExpanded": "You are in audio only mode. This mode saves bandwidth but you won't see videos of others.",
714 665
         "callQuality": "Video Quality",
715 666
         "hd": "HD",
716
-        "hdTooltip": "Viewing high definition video",
717 667
         "highDefinition": "High definition",
718 668
         "labelTooiltipNoVideo": "No video",
719 669
         "labelTooltipAudioOnly": "Audio-only mode enabled",
720
-        "labelTooltipVideo": "Current video quality",
721 670
         "ld": "LD",
722
-        "ldTooltip": "Viewing low definition video",
723 671
         "lowDefinition": "Low definition",
724 672
         "onlyAudioAvailable": "Only audio is available",
725 673
         "onlyAudioSupported": "We only support audio in this browser.",
726 674
         "p2pEnabled": "Peer to Peer Enabled",
727 675
         "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.",
728
-        "qualityButtonTip": "Change received video quality",
729 676
         "recHighDefinitionOnly": "Will prefer high definition.",
730 677
         "sd": "SD",
731
-        "sdTooltip": "Viewing standard definition video",
732 678
         "standardDefinition": "Standard definition"
733 679
     },
734 680
     "videothumbnail": {
@@ -747,14 +693,14 @@
747 693
             "join": "Tap to join",
748 694
             "roomname": "Enter room name"
749 695
         },
750
-        "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.",
696
+        "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.",
751 697
         "audioVideoSwitch": {
752 698
             "audio": "Voice",
753 699
             "video": "Video"
754 700
         },
755 701
         "calendar": "Calendar",
756 702
         "connectCalendarButton": "Connect your calendar",
757
-        "connectCalendarText": "Connect your calendar to view all your meetings in __app__. Plus, add __provider__ meetings to your calendar and start them with one click.",
703
+        "connectCalendarText": "Connect your calendar to view all your meetings in {{app}}. Plus, add {{provider}} meetings to your calendar and start them with one click.",
758 704
         "enterRoomTitle": "Start a new meeting",
759 705
         "go": "GO",
760 706
         "join": "JOIN",
@@ -763,7 +709,7 @@
763 709
         "recentList": "Recent",
764 710
         "recentListDelete": "Delete",
765 711
         "recentListEmpty": "Your recent list is currently empty. Chat with your team and you will find all your recent meetings here.",
766
-        "reducedUIText": "Welcome to __app__!",
712
+        "reducedUIText": "Welcome to {{app}}!",
767 713
         "roomname": "Enter room name",
768 714
         "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.",
769 715
         "sendFeedback": "Send feedback",

+ 68
- 23
package-lock.json Voir le fichier

@@ -7643,11 +7643,6 @@
7643 7643
         "minimalistic-crypto-utils": "^1.0.1"
7644 7644
       }
7645 7645
     },
7646
-    "hoist-non-react-statics": {
7647
-      "version": "2.5.5",
7648
-      "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
7649
-      "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
7650
-    },
7651 7646
     "hosted-git-info": {
7652 7647
       "version": "2.5.0",
7653 7648
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
@@ -8106,19 +8101,55 @@
8106 8101
       "integrity": "sha512-NkT3lRiw7D4kKtSAVjVdHCvGlc2UOe0ALKa9IfEx0LkEDf0q3YgjP/veVk0d/OZ7yqUNzV8aJP4lJc6RPj++Gw=="
8107 8102
     },
8108 8103
     "i18next": {
8109
-      "version": "8.4.3",
8110
-      "resolved": "https://registry.npmjs.org/i18next/-/i18next-8.4.3.tgz",
8111
-      "integrity": "sha1-Nrb/UWxPmSAQ7tzOJKNsRgnox9w="
8104
+      "version": "17.0.6",
8105
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-17.0.6.tgz",
8106
+      "integrity": "sha512-bdNhzhcM6RG5m82RypVguCrAQNie/ycxW0Q5C6K9UDWD5hqApZfdJFbj4Ikz9jxIR+Ja1eg0yCQLhlCT+opwIg==",
8107
+      "requires": {
8108
+        "@babel/runtime": "^7.3.1"
8109
+      },
8110
+      "dependencies": {
8111
+        "@babel/runtime": {
8112
+          "version": "7.5.4",
8113
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz",
8114
+          "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==",
8115
+          "requires": {
8116
+            "regenerator-runtime": "^0.13.2"
8117
+          }
8118
+        },
8119
+        "regenerator-runtime": {
8120
+          "version": "0.13.2",
8121
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
8122
+          "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
8123
+        }
8124
+      }
8112 8125
     },
8113 8126
     "i18next-browser-languagedetector": {
8114
-      "version": "2.0.0",
8115
-      "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-2.0.0.tgz",
8116
-      "integrity": "sha1-TZ3yvRpd7aPIwKbT22LVA4i57t0="
8127
+      "version": "3.0.1",
8128
+      "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-3.0.1.tgz",
8129
+      "integrity": "sha512-WFjPLNPWl62uu07AHY2g+KsC9qz0tyMq+OZEB/H7N58YKL/JLiCz9U709gaR20Mule/Ppn+uyfVx5REJJjn1HA=="
8117 8130
     },
8118 8131
     "i18next-xhr-backend": {
8119
-      "version": "1.4.2",
8120
-      "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-1.4.2.tgz",
8121
-      "integrity": "sha1-eqdmKSxGyoP/ZHe7VQdLNjpkamI="
8132
+      "version": "3.0.0",
8133
+      "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.0.0.tgz",
8134
+      "integrity": "sha512-Pi/X91Zk2nEqdEHTV+FG6VeMHRcMcPKRsYW/A0wlaCfKsoJc3TI7A75Tqse/d5LVGN2Ymzx0FT+R+gLag9Eb2g==",
8135
+      "requires": {
8136
+        "@babel/runtime": "^7.4.5"
8137
+      },
8138
+      "dependencies": {
8139
+        "@babel/runtime": {
8140
+          "version": "7.5.4",
8141
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz",
8142
+          "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==",
8143
+          "requires": {
8144
+            "regenerator-runtime": "^0.13.2"
8145
+          }
8146
+        },
8147
+        "regenerator-runtime": {
8148
+          "version": "0.13.2",
8149
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
8150
+          "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
8151
+        }
8152
+      }
8122 8153
     },
8123 8154
     "iconv-lite": {
8124 8155
       "version": "0.4.19",
@@ -8807,9 +8838,9 @@
8807 8838
       "integrity": "sha1-5lrOBg2M2tTQ5d94FdDXA55RdFA="
8808 8839
     },
8809 8840
     "jquery-i18next": {
8810
-      "version": "1.2.0",
8811
-      "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.0.tgz",
8812
-      "integrity": "sha1-jQMDa7ip1v090MX7H+jK0jO94qM="
8841
+      "version": "1.2.1",
8842
+      "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.1.tgz",
8843
+      "integrity": "sha512-UNcw3rgxoKjGEg4w23FEn2h3OlPJU7rPzsgDuXDBZktIzeiVbJohs9Cv9hj8oP8KNfBRKOoErL/OVxg2FaAR4g=="
8813 8844
     },
8814 8845
     "js-base64": {
8815 8846
       "version": "2.4.3",
@@ -12138,13 +12169,27 @@
12138 12169
       }
12139 12170
     },
12140 12171
     "react-i18next": {
12141
-      "version": "7.13.0",
12142
-      "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-7.13.0.tgz",
12143
-      "integrity": "sha512-35M+MZFPqHwVIas7tXWQKFrf+ozCJukNplUTiGqL8mczSk+VRBsHxxXuuQKRkz/4CcWkONGWbp/AzxfM6wZncg==",
12172
+      "version": "10.11.4",
12173
+      "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-10.11.4.tgz",
12174
+      "integrity": "sha512-/CWXaf3a5BLNeVnBGxzWOIZLQgSNEc2LWHX4ZaJb7ww0xgY0S5K9HRAMzJIHeHGe7jfpSraprD66VDblWb4ZXA==",
12144 12175
       "requires": {
12145
-        "hoist-non-react-statics": "^2.3.1",
12146
-        "html-parse-stringify2": "2.0.1",
12147
-        "prop-types": "^15.6.0"
12176
+        "@babel/runtime": "^7.3.1",
12177
+        "html-parse-stringify2": "2.0.1"
12178
+      },
12179
+      "dependencies": {
12180
+        "@babel/runtime": {
12181
+          "version": "7.5.4",
12182
+          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz",
12183
+          "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==",
12184
+          "requires": {
12185
+            "regenerator-runtime": "^0.13.2"
12186
+          }
12187
+        },
12188
+        "regenerator-runtime": {
12189
+          "version": "0.13.2",
12190
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
12191
+          "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
12192
+        }
12148 12193
       }
12149 12194
     },
12150 12195
     "react-is": {

+ 5
- 5
package.json Voir le fichier

@@ -42,14 +42,14 @@
42 42
     "bc-css-flags": "3.0.0",
43 43
     "dropbox": "4.0.9",
44 44
     "i18n-iso-countries": "3.7.8",
45
-    "i18next": "8.4.3",
46
-    "i18next-browser-languagedetector": "2.0.0",
47
-    "i18next-xhr-backend": "1.4.2",
45
+    "i18next": "17.0.6",
46
+    "i18next-browser-languagedetector": "3.0.1",
47
+    "i18next-xhr-backend": "3.0.0",
48 48
     "jQuery-Impromptu": "github:trentrichardson/jQuery-Impromptu#v6.0.0",
49 49
     "jitsi-meet-logger": "github:jitsi/jitsi-meet-logger#6fff754a77a56ab52499f3559105a15886942a1e",
50 50
     "jquery": "3.3.1",
51 51
     "jquery-contextmenu": "2.4.5",
52
-    "jquery-i18next": "1.2.0",
52
+    "jquery-i18next": "1.2.1",
53 53
     "js-md5": "0.6.1",
54 54
     "js-utils": "github:jitsi/js-utils#192b1c996e8c05530eb1f19e82a31069c3021e31",
55 55
     "jsrsasign": "8.0.12",
@@ -63,7 +63,7 @@
63 63
     "react": "16.8.3",
64 64
     "react-dom": "16.8.3",
65 65
     "react-emoji-render": "0.4.6",
66
-    "react-i18next": "7.13.0",
66
+    "react-i18next": "10.11.4",
67 67
     "react-linkify": "0.2.2",
68 68
     "react-native": "0.59.8",
69 69
     "react-native-background-timer": "2.1.1",

+ 3
- 7
react/features/base/i18n/functions.js Voir le fichier

@@ -1,20 +1,16 @@
1 1
 import React from 'react';
2
-import { translate as reactI18nextTranslate } from 'react-i18next';
2
+import { withTranslation } from 'react-i18next';
3 3
 
4 4
 /**
5 5
  * Wraps a specific React Component in order to enable translations in it.
6 6
  *
7 7
  * @param {Component} component - The React Component to wrap.
8
- * @param {Object} options - Additional options to pass into react-i18next's
9
- * initialization.
10 8
  * @returns {Component} The React Component which wraps {@link component} and
11 9
  * enables translations in it.
12 10
  */
13
-export function translate(component, options = { wait: true }) {
11
+export function translate(component) {
14 12
     // Use the default list of namespaces.
15
-    return (
16
-        reactI18nextTranslate([ 'main', 'languages', 'countries' ], options)(
17
-            component));
13
+    return withTranslation([ 'main', 'languages', 'countries' ])(component);
18 14
 }
19 15
 
20 16
 /**

+ 15
- 12
react/features/base/i18n/i18next.js Voir le fichier

@@ -40,22 +40,25 @@ const options = {
40 40
     app:
41 41
         (typeof interfaceConfig !== 'undefined' && interfaceConfig.APP_NAME)
42 42
             || 'Jitsi Meet',
43
-    compatibilityAPI: 'v1',
44
-    compatibilityJSON: 'v1',
43
+    backend: {
44
+        loadPath: 'lang/__ns__-__lng__.json'
45
+    },
46
+    defaultNS: 'main',
45 47
     fallbackLng: DEFAULT_LANGUAGE,
46
-    fallbackOnEmpty: true,
47
-    fallbackOnNull: true,
48
+    interpolation: {
49
+        escapeValue: false // not needed for react as it escapes by default
50
+    },
51
+    load: 'languageOnly',
52
+    ns: [ 'main', 'languages', 'countries' ],
53
+    react: {
54
+        useSuspense: false
55
+    },
56
+    returnEmptyString: false,
57
+    returnNull: false,
48 58
 
49 59
     // XXX i18next modifies the array lngWhitelist so make sure to clone
50 60
     // LANGUAGES.
51
-    lngWhitelist: LANGUAGES.slice(),
52
-    load: 'unspecific',
53
-    ns: {
54
-        defaultNs: 'main',
55
-        namespaces: [ 'main', 'languages', 'countries' ]
56
-    },
57
-    resGetPath: 'lang/__ns__-__lng__.json',
58
-    useDataAttrOptions: true
61
+    whitelist: LANGUAGES.slice()
59 62
 };
60 63
 
61 64
 i18next

+ 1
- 1
react/features/chat/components/web/ChatMessage.js Voir le fichier

@@ -97,4 +97,4 @@ class ChatMessage extends AbstractChatMessage<Props> {
97 97
     }
98 98
 }
99 99
 
100
-export default translate(ChatMessage, { wait: false });
100
+export default translate(ChatMessage);

+ 2
- 2
react/features/recording/middleware.js Voir le fichier

@@ -182,8 +182,8 @@ function _showRecordingErrorNotification(recorderSession, dispatch) {
182 182
             descriptionKey: 'recording.unavailable',
183 183
             descriptionArguments: {
184 184
                 serviceName: isStreamMode
185
-                    ? 'Live Streaming service'
186
-                    : 'Recording service'
185
+                    ? '$t(liveStreaming.serviceName)'
186
+                    : '$t(recording.serviceName)'
187 187
             },
188 188
             titleKey: isStreamMode
189 189
                 ? 'liveStreaming.unavailableTitle'

Chargement…
Annuler
Enregistrer