Make sure screen name is internationalized

This commit is contained in:
Fedor Indutny 2021-06-03 11:42:30 -07:00 committed by GitHub
parent 84aed82357
commit 56f0e1ba46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 8 deletions

View file

@ -3384,7 +3384,17 @@
}, },
"calling__SelectPresentingSourcesModal--entireScreen": { "calling__SelectPresentingSourcesModal--entireScreen": {
"message": "Entire screen", "message": "Entire screen",
"description": "Title for the select your screen sharing sources modal" "description": "Title for the select your screen sharing sources modal and 'Entire Screen' source"
},
"calling__SelectPresentingSourcesModal--screen": {
"message": "Screen $id$",
"description": "Title for `Screen #N` source in screen sharing sources modal and overlay",
"placeholders": {
"id": {
"content": "$1",
"example": "1"
}
}
}, },
"calling__SelectPresentingSourcesModal--window": { "calling__SelectPresentingSourcesModal--window": {
"message": "A window", "message": "A window",

View file

@ -9,6 +9,7 @@ import { LocalizerType } from '../types/Util';
import { Modal } from './Modal'; import { Modal } from './Modal';
import { PresentedSource, PresentableSource } from '../types/Calling'; import { PresentedSource, PresentableSource } from '../types/Calling';
import { Theme } from '../util/theme'; import { Theme } from '../util/theme';
import { isScreenSource, translateSourceName } from '../services/calling';
export type PropsType = { export type PropsType = {
i18n: LocalizerType; i18n: LocalizerType;
@ -17,14 +18,18 @@ export type PropsType = {
}; };
const Source = ({ const Source = ({
i18n,
onSourceClick, onSourceClick,
source, source,
sourceToPresent, sourceToPresent,
}: { }: {
i18n: LocalizerType;
onSourceClick: (source: PresentedSource) => void; onSourceClick: (source: PresentedSource) => void;
source: PresentableSource; source: PresentableSource;
sourceToPresent?: PresentedSource; sourceToPresent?: PresentedSource;
}): JSX.Element => { }): JSX.Element => {
const name = translateSourceName(i18n, source);
return ( return (
<button <button
className={classNames({ className={classNames({
@ -42,14 +47,14 @@ const Source = ({
type="button" type="button"
> >
<img <img
alt={source.name} alt={name}
className="module-CallingSelectPresentingSourcesModal__name--screenshot" className="module-CallingSelectPresentingSourcesModal__name--screenshot"
src={source.thumbnail} src={source.thumbnail}
/> />
<div className="module-CallingSelectPresentingSourcesModal__name--container"> <div className="module-CallingSelectPresentingSourcesModal__name--container">
{source.appIcon ? ( {source.appIcon ? (
<img <img
alt={source.name} alt={name}
className="module-CallingSelectPresentingSourcesModal__name--icon" className="module-CallingSelectPresentingSourcesModal__name--icon"
height={16} height={16}
src={source.appIcon} src={source.appIcon}
@ -57,7 +62,7 @@ const Source = ({
/> />
) : null} ) : null}
<span className="module-CallingSelectPresentingSourcesModal__name--text"> <span className="module-CallingSelectPresentingSourcesModal__name--text">
{source.name} {name}
</span> </span>
</div> </div>
</button> </button>
@ -77,9 +82,7 @@ export const CallingSelectPresentingSourcesModal = ({
throw new Error('No sources available for presenting'); throw new Error('No sources available for presenting');
} }
const sources = groupBy(presentingSourcesAvailable, source => const sources = groupBy(presentingSourcesAvailable, isScreenSource);
source.id.startsWith('screen')
);
return ( return (
<Modal <Modal
@ -98,6 +101,7 @@ export const CallingSelectPresentingSourcesModal = ({
<div className="module-CallingSelectPresentingSourcesModal__sources"> <div className="module-CallingSelectPresentingSourcesModal__sources">
{sources.true.map(source => ( {sources.true.map(source => (
<Source <Source
i18n={i18n}
key={source.id} key={source.id}
onSourceClick={selectedSource => setSourceToPresent(selectedSource)} onSourceClick={selectedSource => setSourceToPresent(selectedSource)}
source={source} source={source}
@ -111,6 +115,7 @@ export const CallingSelectPresentingSourcesModal = ({
<div className="module-CallingSelectPresentingSourcesModal__sources"> <div className="module-CallingSelectPresentingSourcesModal__sources">
{sources.false.map(source => ( {sources.false.map(source => (
<Source <Source
i18n={i18n}
key={source.id} key={source.id}
onSourceClick={selectedSource => setSourceToPresent(selectedSource)} onSourceClick={selectedSource => setSourceToPresent(selectedSource)}
source={source} source={source}

View file

@ -48,6 +48,7 @@ import {
PresentableSource, PresentableSource,
PresentedSource, PresentedSource,
} from '../types/Calling'; } from '../types/Calling';
import { LocalizerType } from '../types/Util';
import { ConversationModel } from '../models/conversations'; import { ConversationModel } from '../models/conversations';
import { import {
base64ToArrayBuffer, base64ToArrayBuffer,
@ -89,6 +90,33 @@ enum GroupCallUpdateMessageState {
SentLeft, SentLeft,
} }
export function isScreenSource(source: PresentedSource): boolean {
return source.id.startsWith('screen');
}
export function translateSourceName(
i18n: LocalizerType,
source: PresentedSource
): string {
const { name } = source;
if (!isScreenSource(source)) {
return name;
}
if (name === 'Entire Screen') {
return i18n('calling__SelectPresentingSourcesModal--entireScreen');
}
const match = name.match(/^Screen (\d+)$/);
if (match) {
return i18n('calling__SelectPresentingSourcesModal--screen', {
id: match[1],
});
}
return name;
}
export class CallingClass { export class CallingClass {
readonly videoCapturer: GumVideoCapturer; readonly videoCapturer: GumVideoCapturer;
@ -954,7 +982,10 @@ export class CallingClass {
this.setOutgoingVideoIsScreenShare(call, isPresenting); this.setOutgoingVideoIsScreenShare(call, isPresenting);
if (source) { if (source) {
ipcRenderer.send('show-screen-share', source.name); ipcRenderer.send(
'show-screen-share',
translateSourceName(window.i18n, source)
);
notify({ notify({
icon: 'images/icons/v2/video-solid-24.svg', icon: 'images/icons/v2/video-solid-24.svg',
message: window.i18n('calling__presenting--notification-body'), message: window.i18n('calling__presenting--notification-body'),