From 01dc782b42343b323e77d141d3efcc9c68cabfa6 Mon Sep 17 00:00:00 2001 From: Mikel Larreategi Date: Thu, 7 Dec 2023 09:27:02 +0100 Subject: [PATCH] get multilingual settings from backend --- packages/volto/src/actions/content/content.js | 1 - .../volto/src/components/manage/Add/Add.jsx | 3 ++- .../src/components/manage/Add/Add.test.jsx | 3 ++- .../ContentsBreadcrumbs.Multilingual.test.jsx | 10 +++++---- .../manage/Contents/ContentsBreadcrumbs.jsx | 15 +++++++------ .../volto/src/components/manage/Edit/Edit.jsx | 3 ++- .../manage/Multilingual/CompareLanguages.jsx | 7 +++--- .../manage/Multilingual/CreateTranslation.jsx | 5 ++++- .../Multilingual/CreateTranslation.test.jsx | 11 +++++----- .../Multilingual/ManageTranslations.jsx | 5 ++++- .../Multilingual/ManageTranslations.test.jsx | 11 +++++----- .../manage/Multilingual/TranslationObject.jsx | 10 ++++++--- .../Preferences/PersonalPreferences.jsx | 2 +- .../src/components/manage/Toolbar/More.jsx | 3 ++- .../src/components/manage/Toolbar/Toolbar.jsx | 3 ++- .../src/components/manage/Toolbar/Types.jsx | 17 ++++++++++---- .../LanguageSelector/LanguageSelector.js | 8 +++++-- .../LanguageSelector.test.jsx | 12 +++++----- .../theme/Logo/Logo.Multilingual.test.jsx | 16 ++++++++++---- .../MultilingualRedirector.jsx | 19 ++++++++-------- .../MultilingualRedirector.test.jsx | 8 +++---- .../Navigation.Multilingual.test.jsx | 16 ++++++++++---- .../components/theme/NotFound/NotFound.jsx | 5 +++-- .../src/components/theme/Sitemap/Sitemap.jsx | 8 ++++--- packages/volto/src/config/index.js | 22 ++++++++++++++----- .../volto/src/helpers/Multilingual/index.js | 21 ++++++++++++++++++ packages/volto/src/helpers/index.js | 1 + packages/volto/src/middleware/api.js | 4 +++- packages/volto/src/reducers/addons/addons.js | 4 ++++ 29 files changed, 172 insertions(+), 81 deletions(-) create mode 100644 packages/volto/src/helpers/Multilingual/index.js diff --git a/packages/volto/src/actions/content/content.js b/packages/volto/src/actions/content/content.js index 145a3a031f..57d87f3fc2 100644 --- a/packages/volto/src/actions/content/content.js +++ b/packages/volto/src/actions/content/content.js @@ -150,7 +150,6 @@ export function getContent( b_size: settings.defaultPageSize, } : {}, - settings.isMultilingual ? { expand: 'translations' } : {}, ); let qs = Object.keys(query) diff --git a/packages/volto/src/components/manage/Add/Add.jsx b/packages/volto/src/components/manage/Add/Add.jsx index d39387cbee..fa6f6c92b3 100644 --- a/packages/volto/src/components/manage/Add/Add.jsx +++ b/packages/volto/src/components/manage/Add/Add.jsx @@ -203,7 +203,7 @@ class Add extends Component { ? keys(this.props.schema.definitions) : null, '@type': this.props.type, - ...(config.settings.isMultilingual && + ...(this.props.isMultilingual && this.props.location?.state?.translationOf && { translation_of: this.props.location.state.translationOf, language: this.props.location.state.language, @@ -459,6 +459,7 @@ export default compose( pathname: props.location.pathname, returnUrl: qs.parse(props.location.search).return_url, type: qs.parse(props.location.search).type, + isMultilingual: state.addons.isMultilingual, }), { createContent, getSchema, changeLanguage }, ), diff --git a/packages/volto/src/components/manage/Add/Add.test.jsx b/packages/volto/src/components/manage/Add/Add.test.jsx index 2a1ee56192..d7d40ae949 100644 --- a/packages/volto/src/components/manage/Add/Add.test.jsx +++ b/packages/volto/src/components/manage/Add/Add.test.jsx @@ -9,7 +9,6 @@ import Add from './Add'; const mockStore = configureStore(); beforeAll(() => { - config.settings.supportedLanguages = ['de']; config.settings.lazyBundles = { cms: [], }; @@ -38,6 +37,8 @@ describe('Add', () => { locale: 'en', messages: {}, }, + site: { + "plone.available_languages": ['de'] }); const component = renderer.create( diff --git a/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.Multilingual.test.jsx b/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.Multilingual.test.jsx index e9ac8d3385..38e54db864 100644 --- a/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.Multilingual.test.jsx +++ b/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.Multilingual.test.jsx @@ -7,10 +7,6 @@ import config from '@plone/volto/registry'; import ContentsBreadcrumbs from './ContentsBreadcrumbs'; -beforeAll(() => { - config.settings.isMultilingual = true; -}); - const mockStore = configureStore(); describe('ContentsBreadcrumbs Multilingual', () => { @@ -24,6 +20,9 @@ describe('ContentsBreadcrumbs Multilingual', () => { locale: 'en', messages: {}, }, + addons: { + isMultilingual: true, + }, }); const component = renderer.create( @@ -49,6 +48,9 @@ describe('ContentsBreadcrumbs Multilingual', () => { locale: 'en', messages: {}, }, + addons: { + isMultilingual: true, + }, }); const component = renderer.create( diff --git a/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.jsx b/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.jsx index 417d8338d7..774b2014e3 100644 --- a/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.jsx +++ b/packages/volto/src/components/manage/Contents/ContentsBreadcrumbs.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { Breadcrumb } from 'semantic-ui-react'; import { Link, useLocation } from 'react-router-dom'; import { defineMessages, useIntl } from 'react-intl'; +import { useSelector } from 'react-redux'; import { langmap } from '@plone/volto/helpers'; import ContentsBreadcrumbsRootItem from '@plone/volto/components/manage/Contents/ContentsBreadcrumbsRootItem'; import ContentsBreadcrumbsHomeItem from '@plone/volto/components/manage/Contents/ContentsBreadcrumbsHomeItem'; @@ -20,15 +21,15 @@ const messages = defineMessages({ }); const ContentsBreadcrumbs = (props) => { - const { settings } = config; const { items } = props; const intl = useIntl(); const pathname = useLocation().pathname; - const lang = pathname.split('/')[1]; + const isMultilingual = useSelector((state) => state.addons.isMultilingual); + const navroot = useSelector((state) => state.navroot.data.navroot); return ( - {settings.isMultilingual && ( + {isMultilingual && ( <> { )} - {settings.isMultilingual && pathname?.split('/')?.length > 2 && ( + {isMultilingual && pathname?.split('/')?.length > 2 && ( - {langmap?.[lang]?.nativeName ?? lang} + {navroot['title']} )} - {!settings.isMultilingual && ( + {!isMultilingual && ( - {config.settings.isMultilingual && ( + {this.props.isMultilingual && ( { const intl = useIntl(); const [viewMenu, setViewMenu] = useState(false); - const translations = config.settings.isMultilingual + const isMultilingual = useSelector((state) => state.addons.isMultilingual); + const translations = isMultilingual ? content?.['@components']?.translations?.items || [] : []; @@ -114,7 +115,7 @@ const CompareLanguages = React.forwardRef((props, ref) => { translationsObject[t.language] = t['@id']; }); - if (config.settings.isMultilingual && translations.length > 0) { + if (isMultilingual && translations.length > 0) { return (
diff --git a/packages/volto/src/components/manage/Multilingual/CreateTranslation.jsx b/packages/volto/src/components/manage/Multilingual/CreateTranslation.jsx index adc364f507..57351c975d 100644 --- a/packages/volto/src/components/manage/Multilingual/CreateTranslation.jsx +++ b/packages/volto/src/components/manage/Multilingual/CreateTranslation.jsx @@ -15,6 +15,9 @@ const CreateTranslation = (props) => { const [translationLocation, setTranslationLocation] = React.useState(null); const [translationObject, setTranslationObject] = React.useState(null); const languageFrom = useSelector((state) => state.intl.locale); + const availableLanguages = useSelector( + (state) => state.site.data['plone.available_languages'], + ); React.useEffect(() => { // Only on mount, we dispatch the locator query @@ -32,7 +35,7 @@ const CreateTranslation = (props) => { // On unmount we dispatch the language change return () => { // We change the interface language - if (config.settings.supportedLanguages.includes(language)) { + if (availableLanguages.includes(language)) { const langFileName = toGettextLang(language); import('@root/../locales/' + langFileName + '.json').then((locale) => { dispatch(changeLanguage(language, locale.default)); diff --git a/packages/volto/src/components/manage/Multilingual/CreateTranslation.test.jsx b/packages/volto/src/components/manage/Multilingual/CreateTranslation.test.jsx index 56ff1b32a1..9736d0d912 100644 --- a/packages/volto/src/components/manage/Multilingual/CreateTranslation.test.jsx +++ b/packages/volto/src/components/manage/Multilingual/CreateTranslation.test.jsx @@ -7,11 +7,6 @@ import config from '@plone/volto/registry'; import CreateTranslation from './CreateTranslation'; -beforeAll(() => { - config.settings.isMultilingual = true; - config.settings.supportedLanguages = ['de', 'es']; -}); - const mockStore = configureStore(); describe('CreateTranslation', () => { @@ -24,6 +19,12 @@ describe('CreateTranslation', () => { translations: { translationLocation: '/es', }, + site: { + 'plone.availableLanguages': ['de', 'es'], + }, + addons: { + isMultilingual: true, + }, }); const component = renderer.create( diff --git a/packages/volto/src/components/manage/Multilingual/ManageTranslations.jsx b/packages/volto/src/components/manage/Multilingual/ManageTranslations.jsx index a375b98e89..5a393b87df 100644 --- a/packages/volto/src/components/manage/Multilingual/ManageTranslations.jsx +++ b/packages/volto/src/components/manage/Multilingual/ManageTranslations.jsx @@ -67,6 +67,9 @@ const ManageTranslations = (props) => { const { isObjectBrowserOpen, openObjectBrowser } = props; const currentSelectedItem = React.useRef(null); + const availableLanguages = useSelector( + (state) => state.site.data['plone.available_languages'], + ); React.useEffect(() => { if (!content) { @@ -180,7 +183,7 @@ const ManageTranslations = (props) => { - {config.settings.supportedLanguages.map((lang) => ( + {availableLanguages.map((lang) => ( {lang === content.language.token ? ( diff --git a/packages/volto/src/components/manage/Multilingual/ManageTranslations.test.jsx b/packages/volto/src/components/manage/Multilingual/ManageTranslations.test.jsx index a8d51b4101..52df1c0191 100644 --- a/packages/volto/src/components/manage/Multilingual/ManageTranslations.test.jsx +++ b/packages/volto/src/components/manage/Multilingual/ManageTranslations.test.jsx @@ -7,11 +7,6 @@ import config from '@plone/volto/registry'; import ManageTranslations from './ManageTranslations'; -beforeAll(() => { - config.settings.isMultilingual = true; - config.settings.supportedLanguages = ['de', 'es']; -}); - jest.mock('react-portal', () => ({ Portal: jest.fn(() =>
), })); @@ -35,6 +30,12 @@ describe('ManageTranslations', () => { language: 'en', }, }, + site: { + 'plone.available_languages': ['de', 'es'], + }, + addons: { + isMultilingual: true, + }, }); const component = renderer.create( diff --git a/packages/volto/src/components/manage/Multilingual/TranslationObject.jsx b/packages/volto/src/components/manage/Multilingual/TranslationObject.jsx index 043e4fa8e0..c6c3fcfc6e 100644 --- a/packages/volto/src/components/manage/Multilingual/TranslationObject.jsx +++ b/packages/volto/src/components/manage/Multilingual/TranslationObject.jsx @@ -6,6 +6,7 @@ import { Provider } from 'react-intl-redux'; import { Form, Field } from '@plone/volto/components'; import config from '@plone/volto/registry'; import configureStore from '@plone/volto/store'; +import { useSelector } from 'react-redux'; import { Api, flattenToAppURL, @@ -38,21 +39,24 @@ const TranslationObject = ({ setActiveMenu(name); }; + const availableLanguages = useSelector( + (state) => state.site.data['plone.available_languages'], + ); + useEffect(() => { if ( !loadingLocale && Object.keys(locales).length < config.settings.supportedLanguages.length ) { setLoadingLocale(true); - let lang = - config.settings.supportedLanguages[Object.keys(locales).length]; + let lang = availableLanguages[Object.keys(locales).length]; const langFileName = toGettextLang(lang); import('@root/../locales/' + langFileName + '.json').then((locale) => { setLocales({ ...locales, [toReactIntlLang(lang)]: locale.default }); setLoadingLocale(false); }); } - }, [loadingLocale, locales]); + }, [loadingLocale, locales, availableLanguages]); const api = new Api(); const history = createBrowserHistory(); diff --git a/packages/volto/src/components/manage/Preferences/PersonalPreferences.jsx b/packages/volto/src/components/manage/Preferences/PersonalPreferences.jsx index cae87d2a04..c9b11ae980 100644 --- a/packages/volto/src/components/manage/Preferences/PersonalPreferences.jsx +++ b/packages/volto/src/components/manage/Preferences/PersonalPreferences.jsx @@ -85,7 +85,7 @@ class PersonalPreferences extends Component { */ onSubmit(data) { let language = data.language || 'en'; - if (config.settings.supportedLanguages.includes(language)) { + if (availableLanguages.includes(language)) { const langFileName = toGettextLang(language); import('@root/../locales/' + langFileName + '.json').then((locale) => { this.props.changeLanguage(language, locale.default); diff --git a/packages/volto/src/components/manage/Toolbar/More.jsx b/packages/volto/src/components/manage/Toolbar/More.jsx index 58e1644684..cf88f51f83 100644 --- a/packages/volto/src/components/manage/Toolbar/More.jsx +++ b/packages/volto/src/components/manage/Toolbar/More.jsx @@ -522,7 +522,7 @@ class More extends Component { )} )} - {editAction && config.settings.isMultilingual && ( + {editAction && this.props.isMultilingual && (
  • @@ -548,6 +548,7 @@ export default compose( content: state.content.data, lang: state.intl.locale, workingCopy: state.workingCopy, + isMultilingual: state.addons.isMultilingual, }), { applyWorkingCopy, createWorkingCopy, removeWorkingCopy }, ), diff --git a/packages/volto/src/components/manage/Toolbar/Toolbar.jsx b/packages/volto/src/components/manage/Toolbar/Toolbar.jsx index 133b44c98f..d0f475cc0a 100644 --- a/packages/volto/src/components/manage/Toolbar/Toolbar.jsx +++ b/packages/volto/src/components/manage/Toolbar/Toolbar.jsx @@ -509,7 +509,7 @@ class Toolbar extends Component { {this.props.content && ((this.props.content.is_folderish && this.props.types.length > 0) || - (config.settings.isMultilingual && + (this.props.isMultilingual && this.props.content['@components']?.translations)) && (