Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

LanguageSelectorDialog.web.tsx 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /* eslint-disable lines-around-comment */
  2. import { Theme } from '@mui/material';
  3. import i18next from 'i18next';
  4. import React, { useCallback, useEffect, useState } from 'react';
  5. import { WithTranslation } from 'react-i18next';
  6. import { useDispatch } from 'react-redux';
  7. import { makeStyles } from 'tss-react/mui';
  8. import { IReduxState } from '../../app/types';
  9. // @ts-ignore
  10. import { TRANSLATION_LANGUAGES, TRANSLATION_LANGUAGES_HEAD } from '../../base/i18n';
  11. import { translate, translateToHTML } from '../../base/i18n/functions';
  12. import { connect } from '../../base/redux/functions';
  13. import Dialog from '../../base/ui/components/web/Dialog';
  14. // @ts-ignore
  15. import { openSettingsDialog } from '../../settings/actions';
  16. import { SETTINGS_TABS } from '../../settings/constants';
  17. // @ts-ignore
  18. import { setRequestingSubtitles, toggleLanguageSelectorDialog, updateTranslationLanguage } from '../actions';
  19. import LanguageList from './LanguageList.web';
  20. interface ILanguageSelectorDialogProps extends WithTranslation {
  21. _language: string;
  22. _translationLanguages: Array<string>;
  23. _translationLanguagesHead: Array<string>;
  24. }
  25. const useStyles = makeStyles()((theme: Theme) => {
  26. return {
  27. paragraphWrapper: {
  28. fontSize: 14,
  29. margin: '10px 0px',
  30. color: theme.palette.text01
  31. },
  32. spanWrapper: {
  33. fontWeight: 700,
  34. cursor: 'pointer',
  35. color: theme.palette.link01,
  36. '&:hover': {
  37. backgroundColor: theme.palette.ui04,
  38. color: theme.palette.link01Hover
  39. }
  40. }
  41. };
  42. });
  43. /**
  44. * Component that renders the subtitle language selector dialog.
  45. *
  46. * @returns {React$Element<any>}
  47. */
  48. const LanguageSelectorDialog = ({
  49. t,
  50. _language,
  51. _translationLanguages,
  52. _translationLanguagesHead
  53. }: ILanguageSelectorDialogProps) => {
  54. const { classes: styles } = useStyles();
  55. const dispatch = useDispatch();
  56. const off = 'transcribing.subtitlesOff';
  57. const [ language, setLanguage ] = useState(off);
  58. const languagesHead = _translationLanguagesHead.map((lang: string) => `translation-languages:${lang}`);
  59. // The off and the head languages are always on the top of the list. But once you are selecting
  60. // a language from the translationLanguages, that language is moved under the fixedItems list,
  61. // until a new languages is selected. FixedItems keep their positions.
  62. const fixedItems = [ off, ...languagesHead ];
  63. const languages = _translationLanguages
  64. .map((lang: string) => `translation-languages:${lang}`)
  65. .filter((lang: string) => !(lang === language || languagesHead.includes(lang)));
  66. const listItems = (fixedItems.includes(language)
  67. ? [ ...fixedItems, ...languages ]
  68. : [ ...fixedItems, language, ...languages ])
  69. .map((lang, index) => {
  70. return {
  71. id: lang + index,
  72. lang,
  73. selected: lang === language
  74. };
  75. });
  76. useEffect(() => {
  77. _language ? setLanguage(_language) : setLanguage(off);
  78. }, []);
  79. const onLanguageSelected = useCallback((e: string) => {
  80. setLanguage(e);
  81. dispatch(updateTranslationLanguage(e));
  82. dispatch(setRequestingSubtitles(e !== off));
  83. dispatch(toggleLanguageSelectorDialog());
  84. }, [ _language ]);
  85. const onSourceLanguageClick = useCallback(() => {
  86. dispatch(openSettingsDialog(SETTINGS_TABS.MORE, false));
  87. }, []);
  88. return (
  89. <Dialog
  90. cancel = {{ hidden: true }}
  91. ok = {{ hidden: true }}
  92. titleKey = 'transcribing.subtitles'>
  93. <p className = { styles.paragraphWrapper } >
  94. {
  95. translateToHTML(t, 'transcribing.sourceLanguageDesc', {
  96. 'sourceLanguage': t(`languages:${i18next.language}`).toLowerCase()
  97. })
  98. }<span
  99. className = { styles.spanWrapper }
  100. onClick = { onSourceLanguageClick }>{t('transcribing.sourceLanguageHere')}.</span>
  101. </p>
  102. <LanguageList
  103. items = { listItems }
  104. onLanguageSelected = { onLanguageSelected }
  105. selectedLanguage = { language } />
  106. </Dialog>
  107. );
  108. };
  109. /**
  110. * Maps (parts of) the Redux state to the associated props for the
  111. * {@code LanguageSelectorDialog} component.
  112. *
  113. * @param {Object} state - The Redux state.
  114. * @private
  115. * @returns {Props}
  116. */
  117. function mapStateToProps(state: IReduxState) {
  118. const { conference } = state['features/base/conference'];
  119. const { _language } = state['features/subtitles'];
  120. const { transcription } = state['features/base/config'];
  121. const languages = transcription?.translationLanguages ?? TRANSLATION_LANGUAGES;
  122. const languagesHead = transcription?.translationLanguagesHead ?? TRANSLATION_LANGUAGES_HEAD;
  123. return {
  124. _conference: conference,
  125. _language,
  126. _translationLanguages: languages,
  127. _translationLanguagesHead: languagesHead
  128. };
  129. }
  130. export default translate(connect(mapStateToProps)(LanguageSelectorDialog));