Skip to content

Commit 5d218ca

Browse files
authored
Merge pull request #15 from JoVictorNunes/internationalization
Add internationalization support
2 parents 46da1d7 + 52fdeba commit 5d218ca

File tree

22 files changed

+653
-148
lines changed

22 files changed

+653
-148
lines changed

manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
"requiredSdkVersion": "~0.0.95",
33
"name": "PluginPictureInPicture",
44
"javascriptEntrypointUrl": "PluginPictureInPicture.js",
5-
"version": "0.0.3"
5+
"version": "0.0.4",
6+
"localesBaseUrl": "locales"
67
}

package-lock.json

Lines changed: 135 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"react": "^18.2.0",
1616
"react-chat-elements": "^12.0.14",
1717
"react-dom": "^18.2.0",
18+
"react-intl": "^6.6.8",
1819
"react-modal": "^3.16.1",
1920
"styled-components": "^5.3.3"
2021
},

public/locales/en.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"plugin.pip.activate": "Activate PiP Window",
3+
"plugin.pip.deactivate": "Deactivate PiP Window",
4+
"plugin.warning.title": "Click anywhere in the document to reactivate focus.",
5+
"plugin.warning.message": "This ensures that Picture-in-Picture will be automatically reactivated when you leave this tab again.",
6+
"plugin.chat.unknownUser": "Unknown User",
7+
"plugin.users.tooltip.singular": "{count} user in the session",
8+
"plugin.users.tooltip.plural": "{count} users in the session",
9+
"plugin.raisedHands.tooltip.none": "No raised hand",
10+
"plugin.raisedHands.tooltip.count.singular": "{count} raise hand",
11+
"plugin.raisedHands.tooltip.count.plural": "{count} raised hands",
12+
"plugin.raisedHands.status": "raised hand",
13+
"plugin.raisedHands.lowerHand": "Lower User's Hand",
14+
"plugin.raisedHands.modal.title": "Lower Hand",
15+
"plugin.raisedHands.modal.confirm": "Are you sure you want to lower {name}'s hand?",
16+
"plugin.raisedHands.modal.confirmCurrent": "Are you sure you want to lower your hand?",
17+
"plugin.raisedHands.dropdown.title": "Raised Hands ({count})",
18+
"plugin.raisedHands.dropdown.you": "you",
19+
"plugin.raisedHands.dropdown.lower": "Lower",
20+
"plugin.layout.button.swap": "Swap layout",
21+
"plugin.unreadChat.tooltip.none": "No unread messages",
22+
"plugin.unreadChat.tooltip.count": "{count} unread messages",
23+
"plugin.webcam.tooltip.sharing": "Stop sharing webcams",
24+
"plugin.webcam.tooltip.notSharing": "You're not sharing webcam",
25+
"plugin.webcam.srOnly": "Stop webcams",
26+
"plugin.audio.tooltip.noAudio": "No audio",
27+
"plugin.audio.tooltip.unmute": "Unmute",
28+
"plugin.audio.tooltip.mute": "Mute",
29+
"plugin.audio.srOnly.unmute": "Unmute Me",
30+
"plugin.audio.srOnly.mute": "Mute Me",
31+
"plugin.modal.close": "Close modal",
32+
"plugin.toast.close": "Close notification",
33+
"plugin.common.cancel": "Cancel",
34+
"plugin.common.confirm": "Confirm"
35+
}

public/locales/pt-BR.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"plugin.pip.activate": "Ativar Janela PiP",
3+
"plugin.pip.deactivate": "Desativar Janela PiP",
4+
"plugin.warning.title": "Clique em qualquer lugar no documento para reativar o foco.",
5+
"plugin.warning.message": "Isso garante que o Picture-in-Picture será reativado automaticamente quando você sair desta aba novamente.",
6+
"plugin.chat.unknownUser": "Usuário Desconhecido",
7+
"plugin.users.tooltip.singular": "{count} usuário na sessão",
8+
"plugin.users.tooltip.plural": "{count} usuários na sessão",
9+
"plugin.raisedHands.tooltip.none": "Nenhuma mão levantada",
10+
"plugin.raisedHands.tooltip.count.singular": "{count} mão levantada",
11+
"plugin.raisedHands.tooltip.count.plural": "{count} mãos levantadas",
12+
"plugin.raisedHands.status": "levantou a mão",
13+
"plugin.raisedHands.lowerHand": "Abaixar Mão do Usuário",
14+
"plugin.raisedHands.modal.title": "Abaixar Mão",
15+
"plugin.raisedHands.modal.confirm": "Tem certeza que deseja abaixar a mão de {name}?",
16+
"plugin.raisedHands.modal.confirmCurrent": "Tem certeza que deseja abaixar sua mão?",
17+
"plugin.raisedHands.dropdown.title": "Mãos Levantadas ({count})",
18+
"plugin.raisedHands.dropdown.you": "você",
19+
"plugin.raisedHands.dropdown.lower": "Abaixar",
20+
"plugin.layout.button.swap": "Trocar layout",
21+
"plugin.unreadChat.tooltip.none": "Nenhuma mensagem não lida",
22+
"plugin.unreadChat.tooltip.count": "{count} mensagens não lidas",
23+
"plugin.webcam.tooltip.sharing": "Parar de compartilhar webcams",
24+
"plugin.webcam.tooltip.notSharing": "Você não está compartilhando webcam",
25+
"plugin.webcam.srOnly": "Parar webcams",
26+
"plugin.audio.tooltip.noAudio": "Sem áudio",
27+
"plugin.audio.tooltip.unmute": "Desmutar",
28+
"plugin.audio.tooltip.mute": "Mutar",
29+
"plugin.audio.srOnly.unmute": "Ativar meu microfone",
30+
"plugin.audio.srOnly.mute": "Desativar meu microfone",
31+
"plugin.modal.close": "Fechar modal",
32+
"plugin.toast.close": "Fechar notificação",
33+
"plugin.common.cancel": "Cancelar",
34+
"plugin.common.confirm": "Confirmar"
35+
}

src/common/hooks.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { createIntl, createIntlCache } from 'react-intl';
2+
import { PluginApi } from 'bigbluebutton-html-plugin-sdk';
3+
4+
const LOCALE_REQUEST_OBJECT = (!process.env.NODE_ENV || process.env.NODE_ENV === 'development')
5+
? {
6+
headers: {
7+
'ngrok-skip-browser-warning': 'any',
8+
},
9+
} : undefined;
10+
11+
export const useI18n = (pluginApi: PluginApi) => {
12+
const {
13+
messages: localeMessages,
14+
currentLocale,
15+
loading: localeMessagesLoading,
16+
} = pluginApi.useLocaleMessages!(LOCALE_REQUEST_OBJECT);
17+
18+
const cache = createIntlCache();
19+
const intl = (!localeMessagesLoading && localeMessages) ? createIntl({
20+
locale: currentLocale,
21+
messages: localeMessages,
22+
fallbackOnEmptyString: true,
23+
}, cache) : null;
24+
25+
return {
26+
intl,
27+
localeMessagesLoading,
28+
};
29+
};

src/main/component.tsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import * as React from 'react';
22
import * as ReactDOM from 'react-dom/client';
33
import { ActionButtonDropdownOption, BbbPluginSdk, FloatingWindow } from 'bigbluebutton-html-plugin-sdk';
4+
import { defineMessages } from 'react-intl';
5+
import { useI18n } from '../common/hooks';
46
import Pip from '../plugin-pip/component';
57
import { useVideoStreams } from '../plugin-pip/components/cameras/hooks';
68
import { useScreenshare } from '../plugin-pip/components/screenshare/hooks';
@@ -10,13 +12,25 @@ import styles from './stylesheet';
1012

1113
const isPipSupported = 'documentPictureInPicture' in window;
1214

15+
const intlMessages = defineMessages({
16+
activate: {
17+
id: 'plugin.pip.activate',
18+
defaultMessage: 'Activate PiP Window',
19+
},
20+
deactivate: {
21+
id: 'plugin.pip.deactivate',
22+
defaultMessage: 'Deactivate PiP Window',
23+
},
24+
});
25+
1326
interface MainComponentProps {
1427
pluginUuid: string;
1528
}
1629

1730
function MainComponent({ pluginUuid }: MainComponentProps): React.ReactNode {
1831
BbbPluginSdk.initialize(pluginUuid);
1932
const pluginApi = BbbPluginSdk.getPluginApi(pluginUuid);
33+
const { intl } = useI18n(pluginApi);
2034
const pipActiveRef = React.useRef(JSON.parse(localStorage.getItem('pip-plugin-active')));
2135
const pipWindowRef = React.useRef<Window | null>(null);
2236
const hasMediaRef = React.useRef(false);
@@ -33,17 +47,19 @@ function MainComponent({ pluginUuid }: MainComponentProps): React.ReactNode {
3347
const amISharingWebcam = Boolean(currentUser?.cameras?.length);
3448

3549
if (isPipSupported) {
50+
const activateLabel = intl?.formatMessage(intlMessages.activate) || 'Activate PiP Window';
51+
const deactivateLabel = intl?.formatMessage(intlMessages.deactivate) || 'Deactivate PiP Window';
3652
pluginApi.setActionButtonDropdownItems([
3753
new ActionButtonDropdownOption({
3854
allowed: true,
3955
icon: pipActive ? 'desktop_off' : 'desktop',
40-
label: pipActive ? 'Deactivate PiP Window' : 'Activate PiP Window',
56+
label: pipActive ? deactivateLabel : activateLabel,
4157
onClick: () => {
4258
pipActiveRef.current = !pipActiveRef.current;
4359
localStorage.setItem('pip-plugin-active', JSON.stringify(pipActiveRef.current));
4460
setPipActive(pipActiveRef.current);
4561
},
46-
tooltip: pipActive ? 'Deactivate PiP Window' : 'Activate PiP Window',
62+
tooltip: pipActive ? deactivateLabel : activateLabel,
4763
}),
4864
]);
4965
}
@@ -101,6 +117,7 @@ function MainComponent({ pluginUuid }: MainComponentProps): React.ReactNode {
101117
<Pip
102118
pluginApi={pluginApi}
103119
pipWindow={pipWindow}
120+
intl={intl}
104121
/>,
105122
);
106123

@@ -135,7 +152,7 @@ function MainComponent({ pluginUuid }: MainComponentProps): React.ReactNode {
135152
// @ts-expect-error This media action may not be supported by all major browsers.
136153
navigator.mediaSession.setActionHandler('enterpictureinpicture', null);
137154
};
138-
}, []);
155+
}, [intl, pluginApi]);
139156

140157
React.useEffect(() => {
141158
if (!isPipSupported || !pipActive) return undefined;
@@ -165,15 +182,15 @@ function MainComponent({ pluginUuid }: MainComponentProps): React.ReactNode {
165182
const rect = actionsButton.getBoundingClientRect();
166183
pluginApi.setFloatingWindows([
167184
new FloatingWindow({
168-
id: 'focus-warning',
185+
id: 'plugin-pip-focus-warning',
169186
top: rect.top - 90,
170187
left: rect.left + (rect.width / 2) - 181,
171188
movable: true,
172189
backgroundColor: 'transparent',
173190
boxShadow: 'none',
174191
contentFunction: (element: HTMLElement) => {
175192
const root = ReactDOM.createRoot(element);
176-
root.render(<FocusWarning />);
193+
root.render(<FocusWarning intl={intl} />);
177194
return root;
178195
},
179196
}),

0 commit comments

Comments
 (0)