diff --git a/modules/apps/commerce/commerce-api/bnd.bnd b/modules/apps/commerce/commerce-api/bnd.bnd index 78c8d9b515694e..ca6d463a59f329 100644 --- a/modules/apps/commerce/commerce-api/bnd.bnd +++ b/modules/apps/commerce/commerce-api/bnd.bnd @@ -1,6 +1,6 @@ Bundle-Name: Liferay Commerce API Bundle-SymbolicName: com.liferay.commerce.api -Bundle-Version: 94.1.2 +Bundle-Version: 95.0.0 Export-Package:\ com.liferay.commerce.address,\ com.liferay.commerce.checkout.helper,\ diff --git a/modules/apps/commerce/commerce-api/src/main/java/com/liferay/commerce/order/CommerceOrderHttpHelper.java b/modules/apps/commerce/commerce-api/src/main/java/com/liferay/commerce/order/CommerceOrderHttpHelper.java index 312e7d0e6af6ad..7485ae7c3ef0ba 100644 --- a/modules/apps/commerce/commerce-api/src/main/java/com/liferay/commerce/order/CommerceOrderHttpHelper.java +++ b/modules/apps/commerce/commerce-api/src/main/java/com/liferay/commerce/order/CommerceOrderHttpHelper.java @@ -32,6 +32,9 @@ public CommerceOrder fetchCommerceOrderByUuidAndGroupId( String uuid, long groupId) throws PortalException; + public String getCommerceCartBaseURL(HttpServletRequest httpServletRequest) + throws PortalException; + public String getCommerceCartPortletURL( HttpServletRequest httpServletRequest) throws PortalException; @@ -59,6 +62,10 @@ public CommerceOrder getCurrentCommerceOrder( HttpServletRequest httpServletRequest) throws PortalException; + public boolean hasCommerceOrderPortlet( + HttpServletRequest httpServletRequest, String portletKey) + throws PortalException; + public boolean isGuestCheckoutEnabled(HttpServletRequest httpServletRequest) throws PortalException; diff --git a/modules/apps/commerce/commerce-api/src/main/resources/com/liferay/commerce/order/packageinfo b/modules/apps/commerce/commerce-api/src/main/resources/com/liferay/commerce/order/packageinfo index bbb9c2183f6501..80e43ecfa86a54 100644 --- a/modules/apps/commerce/commerce-api/src/main/resources/com/liferay/commerce/order/packageinfo +++ b/modules/apps/commerce/commerce-api/src/main/resources/com/liferay/commerce/order/packageinfo @@ -1 +1 @@ -version 10.0.0 \ No newline at end of file +version 11.0.0 \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelFDSNames.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelFDSNames.java index 3688f896f856b7..621d1090dc1a29 100644 --- a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelFDSNames.java +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelFDSNames.java @@ -24,6 +24,9 @@ public class CommerceChannelFDSNames { public static final String CHANNEL_QUALIFIER_ACCOUNTS = CPPortletKeys.COMMERCE_CHANNELS + "-channelQualifierAccounts"; + public static final String COMMERCE_CURRENCIES = + CPPortletKeys.COMMERCE_CHANNELS + "-commerceCurrencies"; + public static final String PAYMENT_METHOD = CPPortletKeys.COMMERCE_CHANNELS + "-paymentMethod"; diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelScreenNavigationConstants.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelScreenNavigationConstants.java index 7aee67a29799ad..b5bdf888a90999 100644 --- a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelScreenNavigationConstants.java +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/constants/CommerceChannelScreenNavigationConstants.java @@ -10,6 +10,9 @@ */ public class CommerceChannelScreenNavigationConstants { + public static final String + CATEGORY_KEY_COMMERCE_CHANNEL_COMMERCE_CURRENCIES = "currencies"; + public static final String CATEGORY_KEY_COMMERCE_CHANNEL_COUNTRIES = "countries"; diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/display/context/CommerceChannelCommerceCurrencyDisplayContext.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/display/context/CommerceChannelCommerceCurrencyDisplayContext.java new file mode 100644 index 00000000000000..c8ed88147f3c67 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/display/context/CommerceChannelCommerceCurrencyDisplayContext.java @@ -0,0 +1,164 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.display.context; + +import com.liferay.commerce.channel.web.internal.item.selector.criterion.CommerceCurrencyItemSelectorCriterion; +import com.liferay.commerce.product.display.context.helper.CPRequestHelper; +import com.liferay.commerce.product.model.CommerceChannel; +import com.liferay.commerce.product.model.CommerceChannelRelModel; +import com.liferay.commerce.product.service.CommerceChannelRelService; +import com.liferay.commerce.product.service.CommerceChannelService; +import com.liferay.frontend.taglib.clay.servlet.taglib.util.CreationMenu; +import com.liferay.item.selector.ItemSelector; +import com.liferay.item.selector.ItemSelectorCriterion; +import com.liferay.item.selector.criteria.UUIDItemSelectorReturnType; +import com.liferay.petra.function.transform.TransformUtil; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.kernel.dao.orm.QueryUtil; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; +import com.liferay.portal.kernel.portlet.LiferayPortletResponse; +import com.liferay.portal.kernel.portlet.RequestBackedPortletURLFactory; +import com.liferay.portal.kernel.portlet.RequestBackedPortletURLFactoryUtil; +import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder; +import com.liferay.portal.kernel.security.permission.ActionKeys; +import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission; +import com.liferay.portal.kernel.util.HashMapBuilder; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.kernel.util.StringUtil; + +import java.util.HashMap; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author Fabio Monaco + */ +public class CommerceChannelCommerceCurrencyDisplayContext { + + public CommerceChannelCommerceCurrencyDisplayContext( + ModelResourcePermission + commerceChannelModelResourcePermission, + CommerceChannelRelService commerceChannelRelService, + CommerceChannelService commerceChannelService, + HttpServletRequest httpServletRequest, ItemSelector itemSelector) { + + _commerceChannelModelResourcePermission = + commerceChannelModelResourcePermission; + _commerceChannelRelService = commerceChannelRelService; + _commerceChannelService = commerceChannelService; + _itemSelector = itemSelector; + + _cpRequestHelper = new CPRequestHelper(httpServletRequest); + } + + public CommerceChannel getCommerceChannel() throws PortalException { + if (_commerceChannel != null) { + return _commerceChannel; + } + + long commerceChannelId = ParamUtil.getLong( + _cpRequestHelper.getRenderRequest(), "commerceChannelId"); + + if (commerceChannelId > 0) { + _commerceChannel = _commerceChannelService.getCommerceChannel( + commerceChannelId); + } + + return _commerceChannel; + } + + public long getCommerceChannelId() throws PortalException { + CommerceChannel commerceChannel = getCommerceChannel(); + + if (commerceChannel == null) { + return 0; + } + + return commerceChannel.getCommerceChannelId(); + } + + public CreationMenu getCreationMenu() throws Exception { + CreationMenu creationMenu = new CreationMenu(); + + if (hasPermission(getCommerceChannelId(), ActionKeys.UPDATE)) { + creationMenu.addDropdownItem( + dropdownItem -> { + LiferayPortletResponse liferayPortletResponse = + _cpRequestHelper.getLiferayPortletResponse(); + + dropdownItem.setHref( + liferayPortletResponse.getNamespace() + + "addCommerceChannelCommerceCurrency"); + + dropdownItem.setLabel( + LanguageUtil.get( + _cpRequestHelper.getRequest(), "add-currency")); + dropdownItem.setTarget("event"); + }); + } + + return creationMenu; + } + + public HashMap getJSContext() { + return HashMapBuilder.put( + "url", + () -> { + RequestBackedPortletURLFactory requestBackedPortletURLFactory = + RequestBackedPortletURLFactoryUtil.create( + _cpRequestHelper.getRenderRequest()); + + ItemSelectorCriterion itemSelectorCriterion = + new CommerceCurrencyItemSelectorCriterion(); + + itemSelectorCriterion.setDesiredItemSelectorReturnTypes( + new UUIDItemSelectorReturnType()); + + long commerceChannelId = getCommerceChannelId(); + + return PortletURLBuilder.create( + _itemSelector.getItemSelectorURL( + requestBackedPortletURLFactory, "currencySelectItem", + itemSelectorCriterion) + ).setParameter( + "checkedCommerceCurrencyIds", + StringUtil.merge( + _getCheckedCommerceCurrencyIds(commerceChannelId)) + ).setParameter( + "commerceChannelId", commerceChannelId + ).buildString(); + } + ).build(); + } + + public boolean hasPermission(long commerceChannelId, String actionId) + throws PortalException { + + return _commerceChannelModelResourcePermission.contains( + _cpRequestHelper.getPermissionChecker(), commerceChannelId, + actionId); + } + + private long[] _getCheckedCommerceCurrencyIds(long commerceChannelId) + throws PortalException { + + return TransformUtil.transformToLongArray( + _commerceChannelRelService.getCommerceCurrencyCommerceChannelRels( + commerceChannelId, StringPool.BLANK, QueryUtil.ALL_POS, + QueryUtil.ALL_POS), + CommerceChannelRelModel::getClassPK); + } + + private CommerceChannel _commerceChannel; + private final ModelResourcePermission + _commerceChannelModelResourcePermission; + private final CommerceChannelRelService _commerceChannelRelService; + private final CommerceChannelService _commerceChannelService; + private final CPRequestHelper _cpRequestHelper; + private final ItemSelector _itemSelector; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSActionProvider.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSActionProvider.java new file mode 100644 index 00000000000000..98ba1c854e187d --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSActionProvider.java @@ -0,0 +1,103 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.frontend.data.set.provider; + +import com.liferay.commerce.channel.web.internal.constants.CommerceChannelFDSNames; +import com.liferay.commerce.channel.web.internal.model.CommerceChannelCommerceCurrency; +import com.liferay.commerce.product.constants.CPPortletKeys; +import com.liferay.commerce.product.model.CommerceChannel; +import com.liferay.frontend.data.set.provider.FDSActionProvider; +import com.liferay.frontend.taglib.clay.servlet.taglib.util.DropdownItem; +import com.liferay.frontend.taglib.clay.servlet.taglib.util.DropdownItemListBuilder; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.Language; +import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder; +import com.liferay.portal.kernel.security.permission.ActionKeys; +import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; +import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission; +import com.liferay.portal.kernel.util.Constants; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.kernel.util.Portal; + +import java.util.List; + +import javax.portlet.PortletRequest; +import javax.portlet.PortletURL; + +import javax.servlet.http.HttpServletRequest; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = "fds.data.provider.key=" + CommerceChannelFDSNames.COMMERCE_CURRENCIES, + service = FDSActionProvider.class +) +public class CommerceChannelCommerceCurrencyFDSActionProvider + implements FDSActionProvider { + + @Override + public List getDropdownItems( + long groupId, HttpServletRequest httpServletRequest, Object model) + throws PortalException { + + CommerceChannelCommerceCurrency commerceChannelCommerceCurrency = + (CommerceChannelCommerceCurrency)model; + + return DropdownItemListBuilder.add( + () -> _commerceChannelModelResourcePermission.contains( + PermissionThreadLocal.getPermissionChecker(), + commerceChannelCommerceCurrency.getCommerceChannelId(), + ActionKeys.UPDATE), + dropdownItem -> { + dropdownItem.setHref( + _getCommerceChannelCommerceCurrencyDeleteURL( + commerceChannelCommerceCurrency. + getCommerceChannelRelId(), + httpServletRequest)); + dropdownItem.setIcon("trash"); + dropdownItem.setLabel( + _language.get(httpServletRequest, "remove")); + } + ).build(); + } + + private PortletURL _getCommerceChannelCommerceCurrencyDeleteURL( + long commerceChannelRelId, HttpServletRequest httpServletRequest) { + + return PortletURLBuilder.create( + _portal.getControlPanelPortletURL( + httpServletRequest, CPPortletKeys.COMMERCE_CHANNELS, + PortletRequest.ACTION_PHASE) + ).setActionName( + "/commerce_channels/edit_commerce_channel_commerce_currency" + ).setCMD( + Constants.DELETE + ).setRedirect( + ParamUtil.getString( + httpServletRequest, "currentUrl", + _portal.getCurrentURL(httpServletRequest)) + ).setParameter( + "commerceChannelRelId", commerceChannelRelId + ).buildPortletURL(); + } + + @Reference( + target = "(model.class.name=com.liferay.commerce.product.model.CommerceChannel)" + ) + private ModelResourcePermission + _commerceChannelModelResourcePermission; + + @Reference + private Language _language; + + @Reference + private Portal _portal; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSDataProvider.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSDataProvider.java new file mode 100644 index 00000000000000..7e075901b89568 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/provider/CommerceChannelCommerceCurrencyFDSDataProvider.java @@ -0,0 +1,96 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.frontend.data.set.provider; + +import com.liferay.commerce.channel.web.internal.constants.CommerceChannelFDSNames; +import com.liferay.commerce.channel.web.internal.model.CommerceChannelCommerceCurrency; +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.service.CommerceCurrencyService; +import com.liferay.commerce.product.service.CommerceChannelRelService; +import com.liferay.frontend.data.set.provider.FDSDataProvider; +import com.liferay.frontend.data.set.provider.search.FDSKeywords; +import com.liferay.frontend.data.set.provider.search.FDSPagination; +import com.liferay.petra.function.transform.TransformUtil; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.search.Sort; +import com.liferay.portal.kernel.theme.ThemeDisplay; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.kernel.util.WebKeys; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = "fds.data.provider.key=" + CommerceChannelFDSNames.COMMERCE_CURRENCIES, + service = FDSDataProvider.class +) +public class CommerceChannelCommerceCurrencyFDSDataProvider + implements FDSDataProvider { + + @Override + public List getItems( + FDSKeywords fdsKeywords, FDSPagination fdsPagination, + HttpServletRequest httpServletRequest, Sort sort) + throws PortalException { + + long commerceChannelId = ParamUtil.getLong( + httpServletRequest, "commerceChannelId"); + + return TransformUtil.transform( + _commerceChannelRelService.getCommerceCurrencyCommerceChannelRels( + commerceChannelId, fdsKeywords.getKeywords(), + fdsPagination.getStartPosition(), + fdsPagination.getEndPosition()), + commerceChannelRel -> { + CommerceCurrency commerceCurrency = + _commerceCurrencyService.getCommerceCurrency( + commerceChannelRel.getClassPK()); + + if (commerceCurrency == null) { + return null; + } + + ThemeDisplay themeDisplay = + (ThemeDisplay)httpServletRequest.getAttribute( + WebKeys.THEME_DISPLAY); + + return new CommerceChannelCommerceCurrency( + commerceChannelId, + commerceChannelRel.getCommerceChannelRelId(), + commerceCurrency.getCode(), + commerceCurrency.getCommerceCurrencyId(), + commerceCurrency.getName(themeDisplay.getLocale()), + commerceCurrency.getSymbol()); + }); + } + + @Override + public int getItemsCount( + FDSKeywords fdsKeywords, HttpServletRequest httpServletRequest) + throws PortalException { + + long commerceChannelId = ParamUtil.getLong( + httpServletRequest, "commerceChannelId"); + + return _commerceChannelRelService. + getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, fdsKeywords.getKeywords()); + } + + @Reference + private CommerceChannelRelService _commerceChannelRelService; + + @Reference + private CommerceCurrencyService _commerceCurrencyService; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/view/table/CommerceChannelCommerceCurrencyTableFDSView.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/view/table/CommerceChannelCommerceCurrencyTableFDSView.java new file mode 100644 index 00000000000000..5491bd458161ab --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/data/set/view/table/CommerceChannelCommerceCurrencyTableFDSView.java @@ -0,0 +1,47 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.frontend.data.set.view.table; + +import com.liferay.commerce.channel.web.internal.constants.CommerceChannelFDSNames; +import com.liferay.frontend.data.set.view.FDSView; +import com.liferay.frontend.data.set.view.table.BaseTableFDSView; +import com.liferay.frontend.data.set.view.table.FDSTableSchema; +import com.liferay.frontend.data.set.view.table.FDSTableSchemaBuilder; +import com.liferay.frontend.data.set.view.table.FDSTableSchemaBuilderFactory; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = "frontend.data.set.name=" + CommerceChannelFDSNames.COMMERCE_CURRENCIES, + service = FDSView.class +) +public class CommerceChannelCommerceCurrencyTableFDSView + extends BaseTableFDSView { + + @Override + public FDSTableSchema getFDSTableSchema(Locale locale) { + FDSTableSchemaBuilder fdsTableSchemaBuilder = + _fdsTableSchemaBuilderFactory.create(); + + return fdsTableSchemaBuilder.add( + "name", "name" + ).add( + "code", "code" + ).add( + "symbol", "symbol" + ).build(); + } + + @Reference + private FDSTableSchemaBuilderFactory _fdsTableSchemaBuilderFactory; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelAccountEntryQualifiersScreenNavigationCategory.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelAccountEntryQualifiersScreenNavigationCategory.java index 303b285379b1eb..0bfbffca0aff4a 100644 --- a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelAccountEntryQualifiersScreenNavigationCategory.java +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelAccountEntryQualifiersScreenNavigationCategory.java @@ -20,7 +20,7 @@ * @author Danny Situ */ @Component( - property = "screen.navigation.category.order:Integer=90", + property = "screen.navigation.category.order:Integer=100", service = ScreenNavigationCategory.class ) public class CommerceChannelAccountEntryQualifiersScreenNavigationCategory diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationCategory.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationCategory.java new file mode 100644 index 00000000000000..8b193726d4c869 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationCategory.java @@ -0,0 +1,52 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.frontend.taglib.servlet.taglib; + +import com.liferay.commerce.channel.web.internal.constants.CommerceChannelScreenNavigationConstants; +import com.liferay.frontend.taglib.servlet.taglib.ScreenNavigationCategory; +import com.liferay.portal.kernel.language.Language; +import com.liferay.portal.kernel.util.ResourceBundleUtil; + +import java.util.Locale; +import java.util.ResourceBundle; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = "screen.navigation.category.order:Integer=90", + service = ScreenNavigationCategory.class +) +public class CommerceChannelCommerceCurrencyScreenNavigationCategory + implements ScreenNavigationCategory { + + @Override + public String getCategoryKey() { + return CommerceChannelScreenNavigationConstants. + CATEGORY_KEY_COMMERCE_CHANNEL_COMMERCE_CURRENCIES; + } + + @Override + public String getLabel(Locale locale) { + ResourceBundle resourceBundle = ResourceBundleUtil.getBundle( + "content.Language", locale, getClass()); + + return language.get(resourceBundle, getCategoryKey()); + } + + @Override + public String getScreenNavigationKey() { + return CommerceChannelScreenNavigationConstants. + SCREEN_NAVIGATION_KEY_COMMERCE_CHANNEL_GENERAL; + } + + @Reference + protected Language language; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationEntry.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationEntry.java new file mode 100644 index 00000000000000..ba5b28de83983c --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/frontend/taglib/servlet/taglib/CommerceChannelCommerceCurrencyScreenNavigationEntry.java @@ -0,0 +1,85 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.frontend.taglib.servlet.taglib; + +import com.liferay.commerce.channel.web.internal.display.context.CommerceChannelCommerceCurrencyDisplayContext; +import com.liferay.commerce.product.model.CommerceChannel; +import com.liferay.commerce.product.service.CommerceChannelRelService; +import com.liferay.commerce.product.service.CommerceChannelService; +import com.liferay.frontend.taglib.servlet.taglib.ScreenNavigationEntry; +import com.liferay.frontend.taglib.servlet.taglib.util.JSPRenderer; +import com.liferay.item.selector.ItemSelector; +import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil; +import com.liferay.portal.kernel.model.User; +import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission; +import com.liferay.portal.kernel.util.WebKeys; + +import java.io.IOException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = "screen.navigation.category.order:Integer=10", + service = ScreenNavigationEntry.class +) +public class CommerceChannelCommerceCurrencyScreenNavigationEntry + extends CommerceChannelCommerceCurrencyScreenNavigationCategory + implements ScreenNavigationEntry { + + @Override + public String getEntryKey() { + return getCategoryKey(); + } + + @Override + public boolean isVisible(User user, CommerceChannel context) { + return FeatureFlagManagerUtil.isEnabled("LPD-34908"); + } + + @Override + public void render( + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) + throws IOException { + + httpServletRequest.setAttribute( + WebKeys.PORTLET_DISPLAY_CONTEXT, + new CommerceChannelCommerceCurrencyDisplayContext( + _commerceChannelModelResourcePermission, + _commerceChannelRelService, _commerceChannelService, + httpServletRequest, _itemSelector)); + + _jspRenderer.renderJSP( + httpServletRequest, httpServletResponse, + "/commerce_channel/currencies.jsp"); + } + + @Reference( + target = "(model.class.name=com.liferay.commerce.product.model.CommerceChannel)" + ) + private ModelResourcePermission + _commerceChannelModelResourcePermission; + + @Reference + private CommerceChannelRelService _commerceChannelRelService; + + @Reference + private CommerceChannelService _commerceChannelService; + + @Reference + private ItemSelector _itemSelector; + + @Reference + private JSPRenderer _jspRenderer; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/CommerceCurrencyItemSelectorCriterionHandler.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/CommerceCurrencyItemSelectorCriterionHandler.java new file mode 100644 index 00000000000000..cda6c96d3e81e7 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/CommerceCurrencyItemSelectorCriterionHandler.java @@ -0,0 +1,29 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.item.selector; + +import com.liferay.commerce.channel.web.internal.item.selector.criterion.CommerceCurrencyItemSelectorCriterion; +import com.liferay.item.selector.BaseItemSelectorCriterionHandler; +import com.liferay.item.selector.ItemSelectorCriterionHandler; + +import org.osgi.service.component.annotations.Component; + +/** + * @author Fabio Monaco + */ +@Component(service = ItemSelectorCriterionHandler.class) +public class CommerceCurrencyItemSelectorCriterionHandler + extends BaseItemSelectorCriterionHandler + { + + @Override + public Class + getItemSelectorCriterionClass() { + + return CommerceCurrencyItemSelectorCriterion.class; + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorCriterion.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorCriterion.java new file mode 100644 index 00000000000000..af08c1fd32bc84 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorCriterion.java @@ -0,0 +1,15 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.item.selector.criterion; + +import com.liferay.item.selector.BaseItemSelectorCriterion; + +/** + * @author Fabio Monaco + */ +public class CommerceCurrencyItemSelectorCriterion + extends BaseItemSelectorCriterion { +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorView.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorView.java new file mode 100644 index 00000000000000..970d82c7b57644 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/item/selector/criterion/CommerceCurrencyItemSelectorView.java @@ -0,0 +1,267 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.item.selector.criterion; + +import com.liferay.commerce.channel.web.internal.search.CommerceCurrencyItemSelectorChecker; +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.service.CommerceCurrencyService; +import com.liferay.info.item.selector.InfoItemSelectorView; +import com.liferay.item.selector.ItemSelectorReturnType; +import com.liferay.item.selector.ItemSelectorView; +import com.liferay.item.selector.ItemSelectorViewDescriptor; +import com.liferay.item.selector.ItemSelectorViewDescriptorRenderer; +import com.liferay.item.selector.criteria.InfoItemItemSelectorReturnType; +import com.liferay.item.selector.criteria.UUIDItemSelectorReturnType; +import com.liferay.portal.kernel.dao.search.SearchContainer; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.json.JSONUtil; +import com.liferay.portal.kernel.language.Language; +import com.liferay.portal.kernel.security.permission.ResourceActionsUtil; +import com.liferay.portal.kernel.theme.ThemeDisplay; +import com.liferay.portal.kernel.util.JavaConstants; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.kernel.util.Portal; +import com.liferay.portal.kernel.util.WebKeys; + +import java.io.IOException; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import javax.portlet.PortletRequest; +import javax.portlet.PortletURL; +import javax.portlet.RenderResponse; + +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component(service = ItemSelectorView.class) +public class CommerceCurrencyItemSelectorView + implements InfoItemSelectorView, + ItemSelectorView { + + @Override + public String getClassName() { + return CommerceCurrency.class.getName(); + } + + @Override + public Class + getItemSelectorCriterionClass() { + + return CommerceCurrencyItemSelectorCriterion.class; + } + + @Override + public List getSupportedItemSelectorReturnTypes() { + return _supportedItemSelectorReturnTypes; + } + + @Override + public String getTitle(Locale locale) { + return _language.get(locale, "currencies"); + } + + @Override + public void renderHTML( + ServletRequest servletRequest, ServletResponse servletResponse, + CommerceCurrencyItemSelectorCriterion + commerceCurrencyItemSelectorCriterion, + PortletURL portletURL, String itemSelectedEventName, boolean search) + throws IOException, ServletException { + + _itemSelectorViewDescriptorRenderer.renderHTML( + servletRequest, servletResponse, + commerceCurrencyItemSelectorCriterion, portletURL, + itemSelectedEventName, search, + new CommerceCurrencyItemSelectorViewDescriptor( + (HttpServletRequest)servletRequest, portletURL)); + } + + private static final List + _supportedItemSelectorReturnTypes = Collections.singletonList( + new UUIDItemSelectorReturnType()); + + @Reference + private CommerceCurrencyService _commerceCurrencyService; + + @Reference + private ItemSelectorViewDescriptorRenderer + + _itemSelectorViewDescriptorRenderer; + + @Reference + private Language _language; + + @Reference + private Portal _portal; + + private class CommerceCurrencyItemDescriptor + implements ItemSelectorViewDescriptor.ItemDescriptor { + + public CommerceCurrencyItemDescriptor( + CommerceCurrency commerceCurrency, + HttpServletRequest httpServletRequest) { + + _commerceCurrency = commerceCurrency; + _httpServletRequest = httpServletRequest; + } + + @Override + public String getIcon() { + return null; + } + + @Override + public String getImageURL() { + return null; + } + + @Override + public Date getModifiedDate() { + return _commerceCurrency.getModifiedDate(); + } + + @Override + public String getPayload() { + ThemeDisplay themeDisplay = + (ThemeDisplay)_httpServletRequest.getAttribute( + WebKeys.THEME_DISPLAY); + + return JSONUtil.put( + "className", CommerceCurrency.class.getName() + ).put( + "classNameId", + _portal.getClassNameId(CommerceCurrency.class.getName()) + ).put( + "classPK", _commerceCurrency.getCommerceCurrencyId() + ).put( + "title", _commerceCurrency.getName(themeDisplay.getLocale()) + ).put( + "type", + ResourceActionsUtil.getModelResource( + themeDisplay.getLocale(), CommerceCurrency.class.getName()) + ).toString(); + } + + @Override + public String getSubtitle(Locale locale) { + return null; + } + + @Override + public String getTitle(Locale locale) { + return _commerceCurrency.getName(locale); + } + + @Override + public long getUserId() { + return _commerceCurrency.getUserId(); + } + + @Override + public String getUserName() { + return _commerceCurrency.getUserName(); + } + + private final CommerceCurrency _commerceCurrency; + private final HttpServletRequest _httpServletRequest; + + } + + private class CommerceCurrencyItemSelectorViewDescriptor + implements ItemSelectorViewDescriptor { + + public CommerceCurrencyItemSelectorViewDescriptor( + HttpServletRequest httpServletRequest, PortletURL portletURL) { + + _httpServletRequest = httpServletRequest; + _portletURL = portletURL; + + _portletRequest = (PortletRequest)httpServletRequest.getAttribute( + JavaConstants.JAVAX_PORTLET_REQUEST); + _renderResponse = (RenderResponse)httpServletRequest.getAttribute( + JavaConstants.JAVAX_PORTLET_RESPONSE); + } + + @Override + public String getDefaultDisplayStyle() { + return "list"; + } + + @Override + public ItemSelectorViewDescriptor.ItemDescriptor getItemDescriptor( + CommerceCurrency commerceCurrency) { + + return new CommerceCurrencyItemDescriptor( + commerceCurrency, _httpServletRequest); + } + + @Override + public ItemSelectorReturnType getItemSelectorReturnType() { + return new InfoItemItemSelectorReturnType(); + } + + @Override + public SearchContainer getSearchContainer() + throws PortalException { + + ThemeDisplay themeDisplay = + (ThemeDisplay)_httpServletRequest.getAttribute( + WebKeys.THEME_DISPLAY); + + SearchContainer entriesSearchContainer = + new SearchContainer<>( + (PortletRequest)_httpServletRequest.getAttribute( + JavaConstants.JAVAX_PORTLET_REQUEST), + _portletURL, null, "no-entries-were-found"); + + entriesSearchContainer.setResultsAndTotal( + () -> _commerceCurrencyService.getCommerceCurrencies( + themeDisplay.getCompanyId(), + entriesSearchContainer.getStart(), + entriesSearchContainer.getEnd(), + entriesSearchContainer.getOrderByComparator()), + _commerceCurrencyService.getCommerceCurrenciesCount( + themeDisplay.getCompanyId())); + + entriesSearchContainer.setRowChecker( + new CommerceCurrencyItemSelectorChecker( + _renderResponse, + ParamUtil.getLongValues( + _portletRequest, "checkedCommerceCurrencyIds"))); + + return entriesSearchContainer; + } + + @Override + public boolean isMultipleSelection() { + return true; + } + + @Override + public boolean isShowBreadcrumb() { + return false; + } + + private final HttpServletRequest _httpServletRequest; + private final PortletRequest _portletRequest; + private final PortletURL _portletURL; + private final RenderResponse _renderResponse; + + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/model/CommerceChannelCommerceCurrency.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/model/CommerceChannelCommerceCurrency.java new file mode 100644 index 00000000000000..8679434224957d --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/model/CommerceChannelCommerceCurrency.java @@ -0,0 +1,58 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.model; + +/** + * @author Fabio Monaco + */ +public class CommerceChannelCommerceCurrency { + + public CommerceChannelCommerceCurrency( + long commerceChannelId, long commerceChannelRelId, + String commerceCurrencyCode, long commerceCurrencyId, + String commerceCurrencyName, String commerceCurrencySymbol) { + + _commerceChannelId = commerceChannelId; + _commerceChannelRelId = commerceChannelRelId; + + _code = commerceCurrencyCode; + _id = commerceCurrencyId; + _name = commerceCurrencyName; + _symbol = commerceCurrencySymbol; + } + + public String getCode() { + return _code; + } + + public long getCommerceChannelId() { + return _commerceChannelId; + } + + public long getCommerceChannelRelId() { + return _commerceChannelRelId; + } + + public long getId() { + return _id; + } + + public String getName() { + return _name; + } + + public String getSymbol() { + return _symbol; + } + + private final String _code; + private final long _commerceChannelId; + private final long _commerceChannelRelId; + private final long _id; + private final String _name; + private final String _symbol; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/portlet/action/EditCommerceChannelCommerceCurrencyMVCActionCommand.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/portlet/action/EditCommerceChannelCommerceCurrencyMVCActionCommand.java new file mode 100644 index 00000000000000..df71b1c8ec2fc7 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/portlet/action/EditCommerceChannelCommerceCurrencyMVCActionCommand.java @@ -0,0 +1,85 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.portlet.action; + +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.product.constants.CPPortletKeys; +import com.liferay.commerce.product.exception.NoSuchChannelException; +import com.liferay.commerce.product.service.CommerceChannelRelService; +import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCActionCommand; +import com.liferay.portal.kernel.portlet.bridges.mvc.MVCActionCommand; +import com.liferay.portal.kernel.security.auth.PrincipalException; +import com.liferay.portal.kernel.service.ServiceContextFactory; +import com.liferay.portal.kernel.servlet.SessionErrors; +import com.liferay.portal.kernel.util.Constants; +import com.liferay.portal.kernel.util.ParamUtil; + +import javax.portlet.ActionRequest; +import javax.portlet.ActionResponse; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Fabio Monaco + */ +@Component( + property = { + "javax.portlet.name=" + CPPortletKeys.COMMERCE_CHANNELS, + "mvc.command.name=/commerce_channels/edit_commerce_channel_commerce_currency" + }, + service = MVCActionCommand.class +) +public class EditCommerceChannelCommerceCurrencyMVCActionCommand + extends BaseMVCActionCommand { + + @Override + protected void doProcessAction( + ActionRequest actionRequest, ActionResponse actionResponse) + throws Exception { + + String cmd = ParamUtil.getString(actionRequest, Constants.CMD); + + try { + if (cmd.equals(Constants.DELETE)) { + _commerceChannelRelService.deleteCommerceChannelRel( + ParamUtil.getLong(actionRequest, "commerceChannelRelId")); + } + else if (cmd.equals(Constants.ADD_MULTIPLE)) { + _addCommerceChannelRels( + actionRequest, + ParamUtil.getLong(actionRequest, "commerceChannelId"), + ParamUtil.getLongValues(actionRequest, "currencyIds")); + } + } + catch (Exception exception) { + if (exception instanceof NoSuchChannelException || + exception instanceof PrincipalException) { + + SessionErrors.add(actionRequest, exception.getClass()); + + actionResponse.setRenderParameter("mvcPath", "/error.jsp"); + } + else { + throw exception; + } + } + } + + private void _addCommerceChannelRels( + ActionRequest actionRequest, long commerceChannelId, + long[] currencyIds) + throws Exception { + + _commerceChannelRelService.addCommerceChannelRels( + CommerceCurrency.class.getName(), currencyIds, commerceChannelId, + ServiceContextFactory.getInstance(actionRequest)); + } + + @Reference + private CommerceChannelRelService _commerceChannelRelService; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/search/CommerceCurrencyItemSelectorChecker.java b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/search/CommerceCurrencyItemSelectorChecker.java new file mode 100644 index 00000000000000..0c38dce0ff6393 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/java/com/liferay/commerce/channel/web/internal/search/CommerceCurrencyItemSelectorChecker.java @@ -0,0 +1,48 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.channel.web.internal.search; + +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.portal.kernel.dao.search.EmptyOnClickRowChecker; +import com.liferay.portal.kernel.util.ArrayUtil; + +import javax.portlet.RenderResponse; + +/** + * @author Fabio Monaco + */ +public class CommerceCurrencyItemSelectorChecker + extends EmptyOnClickRowChecker { + + public CommerceCurrencyItemSelectorChecker( + RenderResponse renderResponse, long[] checkedCommerceCurrencyIds) { + + super(renderResponse); + + _checkedCommerceCurrencyIds = checkedCommerceCurrencyIds; + } + + @Override + public boolean isChecked(Object object) { + CommerceCurrency commerceCurrency = (CommerceCurrency)object; + + return ArrayUtil.contains( + _checkedCommerceCurrencyIds, + commerceCurrency.getCommerceCurrencyId()); + } + + @Override + public boolean isDisabled(Object object) { + CommerceCurrency commerceCurrency = (CommerceCurrency)object; + + return ArrayUtil.contains( + _checkedCommerceCurrencyIds, + commerceCurrency.getCommerceCurrencyId()); + } + + private final long[] _checkedCommerceCurrencyIds; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/commerce_channel/currencies.jsp b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/commerce_channel/currencies.jsp new file mode 100644 index 00000000000000..be1cb293be66f7 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/commerce_channel/currencies.jsp @@ -0,0 +1,39 @@ +<%-- +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ +--%> + +<%@ include file="/init.jsp" %> + +<% +CommerceChannelCommerceCurrencyDisplayContext commerceChannelCommerceCurrenciesDisplayContext = (CommerceChannelCommerceCurrencyDisplayContext)request.getAttribute(WebKeys.PORTLET_DISPLAY_CONTEXT); +%> + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/init.jsp b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/init.jsp index 4523a7bda6bed3..c27265cb0e856e 100644 --- a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/init.jsp +++ b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/init.jsp @@ -27,6 +27,7 @@ page import="com.liferay.account.model.AccountEntry" %><%@ page import="com.liferay.commerce.channel.web.internal.constants.CommerceChannelFDSNames" %><%@ page import="com.liferay.commerce.channel.web.internal.constants.CommerceChannelScreenNavigationConstants" %><%@ page import="com.liferay.commerce.channel.web.internal.display.context.CommerceChannelAccountEntryQualifiersDisplayContext" %><%@ +page import="com.liferay.commerce.channel.web.internal.display.context.CommerceChannelCommerceCurrencyDisplayContext" %><%@ page import="com.liferay.commerce.channel.web.internal.display.context.CommerceChannelCountryDisplayContext" %><%@ page import="com.liferay.commerce.channel.web.internal.display.context.CommerceChannelDisplayContext" %><%@ page import="com.liferay.commerce.channel.web.internal.display.context.SiteCommerceChannelTypeDisplayContext" %><%@ diff --git a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/commerce_channel/commerceChannelCommerceCurrency.js b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/commerce_channel/commerceChannelCommerceCurrency.js new file mode 100644 index 00000000000000..befeb41c0cb1a2 --- /dev/null +++ b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/commerce_channel/commerceChannelCommerceCurrency.js @@ -0,0 +1,64 @@ +/** + * SPDX-FileCopyrightText: (c) 2023 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +function addOpenSelectionModalEvent({namespace, url}) { + Liferay.on(namespace + 'addCommerceChannelCommerceCurrency', () => { + openSelectionModal({ + namespace, + url, + }); + }); + + Liferay.on('destroyPortlet', () => { + Liferay.detach(namespace + 'addCommerceChannelCommerceCurrency'); + }); +} + +function openSelectionModal({namespace, url}) { + const openerWindow = Liferay.Util.getOpener(); + + const addCommerceChannelCommerceCurrencyFm = document.getElementById( + namespace + 'addCommerceChannelCommerceCurrencyFm' + ); + const currencyIds = document.getElementById(namespace + 'currencyIds'); + + openerWindow.Liferay.Util.openSelectionModal({ + multiple: true, + onSelect: (selectedItems) => { + selectedItems = selectedItems.value || []; + + if (!selectedItems || !selectedItems.length) { + return; + } + + if (!Array.isArray(selectedItems)) { + selectedItems = [selectedItems]; + } + + const currencies = []; + + for (let selectedItem of selectedItems) { + selectedItem = JSON.parse(selectedItem); + + currencies.push(selectedItem.classPK); + } + + if (currencies.length && currencyIds) { + currencyIds.value = currencies.join(','); + } + + if (addCommerceChannelCommerceCurrencyFm) { + submitForm(addCommerceChannelCommerceCurrencyFm); + } + }, + selectEventName: 'currencySelectItem', + title: Liferay.Language.get('add-currency'), + url, + }); +} + +export default function (context) { + addOpenSelectionModalEvent(context); +} diff --git a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/index.js b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/index.js index 9fc83bc1ca1ffd..80554459abd6b5 100644 --- a/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/index.js +++ b/modules/apps/commerce/commerce-channel-web/src/main/resources/META-INF/resources/js/index.js @@ -7,6 +7,7 @@ export {default as CommerceChannelGeneral} from './CommerceChannelGeneral'; export {default as CommerceChannelSite} from './CommerceChannelSite'; export {default as accountEntries} from './accountEntries'; export {default as addCommerceChannel} from './addCommerceChannel'; +export {default as commerceChannelCommerceCurrency} from './commerce_channel/commerceChannelCommerceCurrency'; export {default as commerceChannelCountry} from './commerce_channel/commerceChannelCountry'; export {default as CommerceChannelAddPaymentMethod} from './commerce_marketplace_payment_method'; export {default as qualifiers} from './qualifiers'; diff --git a/modules/apps/commerce/commerce-currency-service/build.gradle b/modules/apps/commerce/commerce-currency-service/build.gradle index b75c86d4bb1d2c..32141fe29a473a 100644 --- a/modules/apps/commerce/commerce-currency-service/build.gradle +++ b/modules/apps/commerce/commerce-currency-service/build.gradle @@ -19,7 +19,6 @@ dependencies { compileOnly project(":apps:commerce:commerce-price-list-api") compileOnly project(":apps:commerce:commerce-pricing-api") compileOnly project(":apps:commerce:commerce-product-api") - compileOnly project(":apps:commerce:commerce-product-service") compileOnly project(":apps:commerce:commerce-shipping-engine-fixed-api") compileOnly project(":apps:configuration-admin:configuration-admin-api") compileOnly project(":apps:portal-configuration:portal-configuration-module-configuration-api") diff --git a/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/index/contributor/CommerceCurrencyModelDocumentContributor.java b/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/index/contributor/CommerceCurrencyModelDocumentContributor.java index 45ffe25096e9c9..c31e6ddc9e9e13 100644 --- a/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/index/contributor/CommerceCurrencyModelDocumentContributor.java +++ b/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/index/contributor/CommerceCurrencyModelDocumentContributor.java @@ -7,8 +7,12 @@ import com.liferay.commerce.currency.model.CommerceCurrency; import com.liferay.commerce.product.constants.CPField; +import com.liferay.commerce.product.model.CommerceChannelRel; +import com.liferay.commerce.product.service.CommerceChannelRelLocalService; +import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.search.Document; import com.liferay.portal.kernel.search.Field; +import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.Localization; import com.liferay.portal.search.spi.model.index.contributor.ModelDocumentContributor; @@ -30,6 +34,14 @@ public void contribute( Document document, CommerceCurrency commerceCurrency) { document.addKeyword(CPField.ACTIVE, commerceCurrency.isActive()); + document.addKeyword( + CPField.CHANNEL_IDS, + ListUtil.toLongArray( + _commerceChannelRelLocalService.getCommerceChannelRels( + CommerceCurrency.class.getName(), + commerceCurrency.getCommerceCurrencyId(), QueryUtil.ALL_POS, + QueryUtil.ALL_POS, null), + CommerceChannelRel::getCommerceChannelId)); document.addText(CPField.CODE, commerceCurrency.getCode()); document.addNumberSortable( Field.PRIORITY, commerceCurrency.getPriority()); @@ -54,6 +66,9 @@ public void contribute( } } + @Reference + private CommerceChannelRelLocalService _commerceChannelRelLocalService; + @Reference private Localization _localization; diff --git a/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/query/contributor/CommerceCurrencyModelPreFilterContributor.java b/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/query/contributor/CommerceCurrencyModelPreFilterContributor.java index 6e1d503d79274b..b8beae9e7ffa74 100644 --- a/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/query/contributor/CommerceCurrencyModelPreFilterContributor.java +++ b/modules/apps/commerce/commerce-currency-service/src/main/java/com/liferay/commerce/currency/internal/search/spi/model/query/contributor/CommerceCurrencyModelPreFilterContributor.java @@ -6,8 +6,11 @@ package com.liferay.commerce.currency.internal.search.spi.model.query.contributor; import com.liferay.commerce.product.constants.CPField; +import com.liferay.portal.kernel.search.BooleanClauseOccur; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.filter.BooleanFilter; +import com.liferay.portal.kernel.search.filter.TermsFilter; +import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.search.spi.model.query.contributor.ModelPreFilterContributor; import com.liferay.portal.search.spi.model.registrar.ModelSearchSettings; @@ -30,6 +33,7 @@ public void contribute( SearchContext searchContext) { _filterByActive(booleanFilter, searchContext); + _filterByChannelIds(booleanFilter, searchContext); } private void _filterByActive( @@ -43,4 +47,19 @@ private void _filterByActive( } } + private void _filterByChannelIds( + BooleanFilter booleanFilter, SearchContext searchContext) { + + long[] channelIds = (long[])searchContext.getAttribute( + CPField.CHANNEL_IDS); + + if (ArrayUtil.isNotEmpty(channelIds)) { + TermsFilter termsFilter = new TermsFilter(CPField.CHANNEL_IDS); + + termsFilter.addValues(ArrayUtil.toStringArray(channelIds)); + + booleanFilter.add(termsFilter, BooleanClauseOccur.MUST); + } + } + } \ No newline at end of file diff --git a/modules/apps/commerce/commerce-currency-web/build.gradle b/modules/apps/commerce/commerce-currency-web/build.gradle index 740c7c0b901ddf..70d912a4b129d0 100644 --- a/modules/apps/commerce/commerce-currency-web/build.gradle +++ b/modules/apps/commerce/commerce-currency-web/build.gradle @@ -12,10 +12,14 @@ dependencies { compileOnly project(":apps:commerce:commerce-frontend-api") compileOnly project(":apps:commerce:commerce-frontend-taglib") compileOnly project(":apps:commerce:commerce-product-api") + compileOnly project(":apps:fragment:fragment-api") compileOnly project(":apps:frontend-data-set:frontend-data-set-api") compileOnly project(":apps:frontend-data-set:frontend-data-set-taglib") compileOnly project(":apps:frontend-taglib:frontend-taglib") compileOnly project(":apps:frontend-taglib:frontend-taglib-clay") + compileOnly project(":apps:frontend-taglib:frontend-taglib-react") + compileOnly project(":apps:info:info-api") + compileOnly project(":apps:info:info-taglib") compileOnly project(":apps:portal-configuration:portal-configuration-module-configuration-api") compileOnly project(":apps:static:portal-configuration:portal-configuration-metatype-api") compileOnly project(":core:petra:petra-function") diff --git a/modules/apps/commerce/commerce-currency-web/src/main/java/com/liferay/commerce/currency/web/internal/fragment/renderer/CurrencySelectorFragmentRenderer.java b/modules/apps/commerce/commerce-currency-web/src/main/java/com/liferay/commerce/currency/web/internal/fragment/renderer/CurrencySelectorFragmentRenderer.java new file mode 100644 index 00000000000000..72aa93903c25a7 --- /dev/null +++ b/modules/apps/commerce/commerce-currency-web/src/main/java/com/liferay/commerce/currency/web/internal/fragment/renderer/CurrencySelectorFragmentRenderer.java @@ -0,0 +1,228 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.commerce.currency.web.internal.fragment.renderer; + +import com.liferay.commerce.constants.CommerceWebKeys; +import com.liferay.commerce.context.CommerceContext; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.model.CommerceOrderType; +import com.liferay.commerce.order.CommerceOrderHttpHelper; +import com.liferay.commerce.product.model.CommerceChannel; +import com.liferay.commerce.service.CommerceOrderTypeLocalService; +import com.liferay.fragment.renderer.FragmentRenderer; +import com.liferay.fragment.renderer.FragmentRendererContext; +import com.liferay.petra.string.StringBundler; +import com.liferay.portal.kernel.dao.orm.QueryUtil; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil; +import com.liferay.portal.kernel.json.JSONArray; +import com.liferay.portal.kernel.json.JSONFactory; +import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.portal.kernel.language.Language; +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.theme.ThemeDisplay; +import com.liferay.portal.kernel.util.Constants; +import com.liferay.portal.kernel.util.ParamUtil; +import com.liferay.portal.kernel.util.Portal; +import com.liferay.portal.kernel.util.WebKeys; + +import java.io.IOException; +import java.io.PrintWriter; + +import java.util.List; +import java.util.Locale; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Michele Vigilante + */ +@Component(service = FragmentRenderer.class) +public class CurrencySelectorFragmentRenderer implements FragmentRenderer { + + @Override + public String getCollectionKey() { + return "commerce-order"; + } + + @Override + public String getLabel(Locale locale) { + return _language.get(locale, "currency-selector"); + } + + @Override + public String getIcon() { + return "catalog"; + } + + @Override + public boolean isSelectable(HttpServletRequest httpServletRequest) { + return FeatureFlagManagerUtil.isEnabled("LPD-34908"); + } + + @Override + public void render( + FragmentRendererContext fragmentRendererContext, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) { + + CommerceContext commerceContext = + (CommerceContext)httpServletRequest.getAttribute( + CommerceWebKeys.COMMERCE_CONTEXT); + + if (commerceContext == null) { + if (_isEditMode(httpServletRequest)) { + _printPortletMessageInfo( + httpServletRequest, httpServletResponse, + "the-currency-selector-component-will-be-shown-here"); + } + + return; + } + + + try { + RequestDispatcher requestDispatcher = + _servletContext.getRequestDispatcher( + "/fragment/renderer/currency_selector/page.jsp"); + + long commerceChannelId = commerceContext.getCommerceChannelId(); + + httpServletRequest.setAttribute( + "liferay-commerce:currency-selector:commerceChannelId", + commerceChannelId); + + httpServletRequest.setAttribute( + "liferay-commerce:currency-selector:commerceOrderDetailBaseURL", + _commerceOrderHttpHelper.getCommerceCartBaseURL( + httpServletRequest)); + + CommerceOrder currentCommerceOrder = + _commerceOrderHttpHelper.getCurrentCommerceOrder( + httpServletRequest); + + long commerceOrderId = 0; + + if (currentCommerceOrder != null) { + commerceOrderId = currentCommerceOrder.getCommerceOrderId(); + } + + httpServletRequest.setAttribute( + "liferay-commerce:currency-selector:commerceOrderId", + commerceOrderId); + + httpServletRequest.setAttribute( + "liferay-commerce:currency-selector:commerceOrderTypes", + _getCommerceOrderTypesJSONArray( + commerceChannelId, httpServletRequest)); + + requestDispatcher.include(httpServletRequest, httpServletResponse); + } + catch (Exception exception) { + _log.error(exception); + + throw new RuntimeException(exception); + } + } + + private JSONArray _getCommerceOrderTypesJSONArray( + long commerceChannelId, HttpServletRequest httpServletRequest) + throws PortalException { + + List commerceOrderTypes = + _commerceOrderTypeLocalService.getCommerceOrderTypes( + _portal.getCompanyId(httpServletRequest), + CommerceChannel.class.getName(), commerceChannelId, true, + QueryUtil.ALL_POS, QueryUtil.ALL_POS); + + JSONArray commerceOrderTypesJSONArray = _jsonFactory.createJSONArray(); + + for (CommerceOrderType commerceOrderType : commerceOrderTypes) { + JSONObject commerceOrderTypeJSONObject = + _jsonFactory.createJSONObject(); + + commerceOrderTypeJSONObject.put( + "name_i18n", + commerceOrderType.getName(_portal.getLocale(httpServletRequest)) + ).put( + "orderTypeId", commerceOrderType.getCommerceOrderTypeId() + ); + + commerceOrderTypesJSONArray.put(commerceOrderTypeJSONObject); + } + + return commerceOrderTypesJSONArray; + } + + private boolean _isEditMode(HttpServletRequest httpServletRequest) { + HttpServletRequest originalHttpServletRequest = + _portal.getOriginalServletRequest(httpServletRequest); + + String layoutMode = ParamUtil.getString( + originalHttpServletRequest, "p_l_mode", Constants.VIEW); + + return layoutMode.equals(Constants.EDIT); + } + + private void _printPortletMessageInfo( + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, String message) { + + try { + PrintWriter printWriter = httpServletResponse.getWriter(); + + StringBundler sb = new StringBundler(3); + + sb.append("
"); + + ThemeDisplay themeDisplay = + (ThemeDisplay)httpServletRequest.getAttribute( + WebKeys.THEME_DISPLAY); + + sb.append(themeDisplay.translate(message)); + + sb.append("
"); + + printWriter.write(sb.toString()); + } + catch (IOException ioException) { + if (_log.isDebugEnabled()) { + _log.debug(ioException); + } + } + } + + private static final Log _log = LogFactoryUtil.getLog( + CurrencySelectorFragmentRenderer.class); + + @Reference + private CommerceOrderHttpHelper _commerceOrderHttpHelper; + + @Reference + private CommerceOrderTypeLocalService _commerceOrderTypeLocalService; + + @Reference + private JSONFactory _jsonFactory; + + @Reference + private Language _language; + + @Reference + private Portal _portal; + + @Reference( + target = "(osgi.web.symbolicname=com.liferay.commerce.currency.web)" + ) + private ServletContext _servletContext; + +} \ No newline at end of file diff --git a/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/init.jsp b/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/init.jsp new file mode 100644 index 00000000000000..0940d19066edfe --- /dev/null +++ b/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/init.jsp @@ -0,0 +1,21 @@ +<%-- +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ +--%> + +<%@ taglib uri="http://liferay.com/tld/react" prefix="react" %><%@ +taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %> + +<%@ page import="com.liferay.portal.kernel.json.JSONArray" %><%@ +page import="com.liferay.portal.kernel.util.HashMapBuilder" %> + + + +<% +long commerceChannelId = (long)request.getAttribute("liferay-commerce:currency-selector:commerceChannelId"); +String commerceOrderDetailBaseURL = (String)request.getAttribute("liferay-commerce:currency-selector:commerceOrderDetailBaseURL"); +long commerceOrderId = (long)request.getAttribute("liferay-commerce:currency-selector:commerceOrderId"); +JSONArray commerceOrderTypesJSONArray = (JSONArray)request.getAttribute("liferay-commerce:currency-selector:commerceOrderTypes"); +%> \ No newline at end of file diff --git a/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/page.jsp b/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/page.jsp new file mode 100644 index 00000000000000..1c6a93af64f366 --- /dev/null +++ b/modules/apps/commerce/commerce-currency-web/src/main/resources/META-INF/resources/fragment/renderer/currency_selector/page.jsp @@ -0,0 +1,23 @@ +<%-- +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ +--%> + +<%@ include file="/fragment/renderer/currency_selector/init.jsp" %> + + \ No newline at end of file diff --git a/modules/apps/commerce/commerce-frontend-js/package.json b/modules/apps/commerce/commerce-frontend-js/package.json index 0ddb7051938a80..83e16793dedee8 100644 --- a/modules/apps/commerce/commerce-frontend-js/package.json +++ b/modules/apps/commerce/commerce-frontend-js/package.json @@ -64,7 +64,8 @@ "checkFormat": "node-scripts format --check", "coverage": "node-scripts test --coverage --silent --verbose", "format": "node-scripts format", - "test": "USE_REACT_16=true node-scripts test" + "test": "USE_REACT_16=true node-scripts test", + "test:watch": "USE_REACT_16=true node-scripts test --watch" }, "version": "4.0.129" } diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/Currency.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/Currency.js new file mode 100644 index 00000000000000..4c07e590fef996 --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/Currency.js @@ -0,0 +1,20 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import AJAX from '../../../utilities/AJAX/index'; + +const VERSION = 'v1.0'; + +function resolvePath(basePath, channelId) { + return `${basePath}${VERSION}/channels/${channelId}/currencies`; +} + +export default function Currency(basePath) { + return { + getBaseURL: (channelId) => resolvePath(basePath, channelId), + getCurrenciesByChannelId: (channelId, ...params) => + AJAX.GET(resolvePath(basePath, channelId), ...params), + }; +} diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/index.js index ef3d761d46c892..0df4156f2c790f 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/index.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/ServiceProvider/commerce-delivery-catalog/v1.0/index.js @@ -4,6 +4,7 @@ */ export {default as accountAPI} from './Account'; +export {default as currencyAPI} from './Currency'; export {default as productAPI} from './Product'; export {default as productOptionValueAPI} from './ProductOptionValue'; export {default as skuAPI} from './Sku'; diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/AccountSelector.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/AccountSelector.js index b0b5e54aded01b..3cc6af1087d53e 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/AccountSelector.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/AccountSelector.js @@ -34,7 +34,6 @@ function AccountSelector({ currentCommerceAccount: account, currentCommerceOrder: order, hasAddCommerceOrderPermission, - hasCommerceOpenOrderContentPortlet, hasManageAccountsPermission, orderTypes, refreshPageOnAccountSelected: forceRefresh, @@ -155,9 +154,6 @@ function AccountSelector({ hasAddCommerceOrderPermission={ hasAddCommerceOrderPermission } - hasCommerceOpenOrderContentPortlet={ - hasCommerceOpenOrderContentPortlet - } orderTypes={orderTypes} selectOrderURL={selectOrderURL} setCurrentView={setCurrentView} @@ -203,7 +199,6 @@ AccountSelector.propTypes = { }), }), hasAddCommerceOrderPermission: PropTypes.bool, - hasCommerceOpenOrderContentPortlet: PropTypes.bool, hasManageAccountsPermission: PropTypes.bool, orderTypes: PropTypes.array, refreshPageOnAccountSelected: PropTypes.bool, diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/views/OrdersListView.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/views/OrdersListView.js index e682c2a0b9c54b..d8b3d6622175f1 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/views/OrdersListView.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/account_selector/views/OrdersListView.js @@ -21,7 +21,6 @@ function OrdersListView({ currentAccount, disabled, hasAddCommerceOrderPermission, - hasCommerceOpenOrderContentPortlet, orderTypes, selectOrderURL, setCurrentView, @@ -99,7 +98,6 @@ function OrdersListView({ accountId: currentAccount.id, commerceChannelId, currencyCode, - hasCommerceOpenOrderContentPortlet, orderDetailURL: createOrderURL, orderTypes, }); diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/add_to_cart/data.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/add_to_cart/data.js index 78cc04f8227908..5b55c35af62400 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/add_to_cart/data.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/add_to_cart/data.js @@ -79,6 +79,8 @@ export async function addToCart( orderTypeId, }); + newCart.currencyCode = channel.currencyCode; + Liferay.fire(CURRENT_ORDER_UPDATED, {order: newCart}); return newCart; @@ -97,6 +99,8 @@ export async function addToCart( const fetchedCart = await CartResource.getCartByIdWithItems(cartId); + fetchedCart.currencyCode = channel.currencyCode; + Liferay.fire(CURRENT_ORDER_UPDATED, {order: fetchedCart}); return fetchedCart; diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/CurrencySelector.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/CurrencySelector.js new file mode 100644 index 00000000000000..12a239fcbc13dd --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/CurrencySelector.js @@ -0,0 +1,166 @@ +/** + * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import ClayButton from '@clayui/button'; +import DropDown from '@clayui/drop-down'; +import {openToast} from 'frontend-js-web'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; + +import ServiceProvider from '../../ServiceProvider'; +import {CURRENT_ORDER_UPDATED} from '../../utilities/eventsDefinitions'; +import {confirmCurrencyChange} from '../../utilities/modals/confirmCurrencyChange'; +import {retrieveCommerceCurrency, storeCommerceCurrency} from './util'; + +function CurrencySelector({ + commerceChannelId, + commerceOrderDetailBaseURL, + commerceOrderId, + commerceOrderTypes, +}) { + const DeliveryCatalogResource = useMemo( + () => ServiceProvider.DeliveryCatalogAPI('v1'), + [] + ); + + const [activeOrderId, setActiveOrderId] = useState( + parseInt(commerceOrderId, 10) + ); + const [availableCurrencies, setAvailableCurrencies] = useState(null); + const [selectedCurrency, setSelectedCurrency] = useState(null); + + const setCurrencyCookie = useCallback(() => { + const currentCommerceCurrencyCode = retrieveCommerceCurrency(); + + if (!currentCommerceCurrencyCode) { + storeCommerceCurrency(selectedCurrency.code); + + return; + } + + const hasCurrencyChanged = + currentCommerceCurrencyCode !== selectedCurrency.code; + + if (hasCurrencyChanged && activeOrderId) { + const {accountId} = Liferay.CommerceContext.account; + + confirmCurrencyChange({ + accountId, + commerceChannelId, + currencyCode: selectedCurrency.code, + onCancel: () => + setSelectedCurrency( + availableCurrencies.find( + ({code}) => code === currentCommerceCurrencyCode + ) + ), + onCreate: () => storeCommerceCurrency(selectedCurrency.code), + orderDetailURL: commerceOrderDetailBaseURL, + orderTypes: commerceOrderTypes, + }); + } + else if (hasCurrencyChanged && !activeOrderId) { + storeCommerceCurrency(selectedCurrency.code); + + window.location.reload(); + } + }, [ + activeOrderId, + availableCurrencies, + commerceChannelId, + commerceOrderDetailBaseURL, + commerceOrderTypes, + selectedCurrency, + ]); + + useEffect(() => { + if (availableCurrencies === null) { + DeliveryCatalogResource.getCurrenciesByChannelId(commerceChannelId) + .then(({items: currencies}) => { + if (currencies.length) { + const currencyCode = + retrieveCommerceCurrency() || + Liferay.CommerceContext.currency.currencyCode; + + setSelectedCurrency( + currencies.find(({code}) => code === currencyCode) + ); + setAvailableCurrencies(currencies); + } + }) + .catch((error) => { + openToast({ + message: + error.message || + Liferay.Language.get( + 'an-unexpected-error-occurred' + ), + type: 'danger', + }); + }); + } + + return () => {}; + }, [availableCurrencies, commerceChannelId, DeliveryCatalogResource]); + + useEffect(() => { + if (selectedCurrency?.id) { + setCurrencyCookie(); + } + + return () => {}; + }, [selectedCurrency, setCurrencyCookie]); + + useEffect(() => { + function onOrderUpdate({order: {currencyCode, id}}) { + if (id !== activeOrderId) { + setActiveOrderId(id); + + setSelectedCurrency( + availableCurrencies.find(({code}) => code === currencyCode) + ); + } + } + + Liferay.on(CURRENT_ORDER_UPDATED, onOrderUpdate); + + return () => { + Liferay.detach(CURRENT_ORDER_UPDATED, onOrderUpdate); + }; + }, [ + activeOrderId, + availableCurrencies, + setActiveOrderId, + setSelectedCurrency, + ]); + + return availableCurrencies?.length ? ( + <> + active)} + trigger={ + + {selectedCurrency.symbol} {selectedCurrency.code} + + } + > + {(currency) => ( + setSelectedCurrency(currency)} + > + {currency.symbol} {currency.code} + + )} + + + ) : null; +} + +export default CurrencySelector; diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/util/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/util/index.js new file mode 100644 index 00000000000000..a981c35994cac4 --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/currency_selector/util/index.js @@ -0,0 +1,30 @@ +/** + * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {COOKIE_TYPES, getCookie} from 'frontend-js-web'; + +import CommerceCookie from '../../../utilities/cookies'; + +const CURRENCY_CODE_COOKIE_IDENTIFIER = + 'com.liferay.commerce.currency.model.CommerceCurrency#'; + +export function retrieveCommerceCurrency() { + const {commerceChannelGroupId: groupId} = Liferay.CommerceContext; + + const cookieKey = `${CURRENCY_CODE_COOKIE_IDENTIFIER}${groupId}`; + + return getCookie(cookieKey, COOKIE_TYPES.NECESSARY); +} + +export function storeCommerceCurrency(currencyCode) { + const {commerceChannelGroupId: groupId} = Liferay.CommerceContext; + + const cookie = new CommerceCookie( + CURRENCY_CODE_COOKIE_IDENTIFIER, + COOKIE_TYPES.NECESSARY + ); + + cookie.setValue(groupId, currencyCode); +} diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/index.js index e5603ee2c56deb..e2ab5a5275928b 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/index.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/index.js @@ -15,6 +15,7 @@ export {default as AddToWishList} from './add_to_wish_list/entry'; export {default as AutocompleteComponent} from './autocomplete/Autocomplete'; export {default as Autocomplete} from './autocomplete/entry'; export {default as compareCheckbox} from './compare_checkbox/entry'; +export {default as CurrencySelector} from './currency_selector/CurrencySelector'; export {default as DropdownMenuComponent} from './dropdown/Dropdown'; export {default as DropdownMenu} from './dropdown/entry'; export {default as GalleryComponent} from './gallery/Gallery'; diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/MiniCart.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/MiniCart.js index f6c1cb0e7fa583..c84db5db42d6ab 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/MiniCart.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/MiniCart.js @@ -51,7 +51,6 @@ function MiniCart({ displayDiscountLevels, displayTotalItemsQuantity, guestOrderEnabled, - hasCommerceOpenOrderContentPortlet, itemsQuantity, labels, onAddToCart, @@ -131,7 +130,6 @@ function MiniCart({ orderDetailURL: !orderDetailURL ? regenerateOrderDetailURL( currentURLs.baseOrderDetailURL, - hasCommerceOpenOrderContentPortlet, updatedCart.id, updatedCart.orderUUID ) @@ -158,7 +156,7 @@ function MiniCart({ showErrorNotification(error); } }, - [hasCommerceOpenOrderContentPortlet, onAddToCart] + [onAddToCart] ); const updateReplacedSKUList = useCallback( diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/constants.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/constants.js index 145dd29cdbf6f2..bc83c811e15527 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/constants.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/constants.js @@ -9,6 +9,7 @@ export const DEFAULT_ORDER_DETAILS_PORTLET_ID = 'com_liferay_commerce_order_content_web_internal_portlet_' + 'CommerceOpenOrderContentPortlet'; +export const ORDER_ID_PARAMETER = 'commerceOrderId'; export const ORDER_UUID_PARAMETER = 'commerceOrderUuid'; export const WORKFLOW_STATUS_APPROVED = 0; export const PRODUCT_QUANTITY_NOT_VALID_ERROR = Liferay.Language.get( diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/index.js index 891a8c7137c044..c33ba75690dfab 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/index.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/components/mini_cart/util/index.js @@ -246,7 +246,6 @@ export function hasPriceOnApplication(cartItems) { export function regenerateOrderDetailURL( baseOrderDetailURL, - hasCommerceOpenOrderContentPortlet, orderId, orderUUID ) { @@ -256,7 +255,7 @@ export function regenerateOrderDetailURL( ); } - if (hasCommerceOpenOrderContentPortlet) { + if (baseOrderDetailURL.includes(DEFAULT_ORDER_DETAILS_PORTLET_ID)) { if (!orderUUID) { throw new Error( 'Cannot generate a new Order Detail URL. Invalid "orderUUID"' diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/index.js index 99428daa261860..22af1cc26ccf37 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/index.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/index.js @@ -17,6 +17,7 @@ export { AddToWishList, Autocomplete, AutocompleteComponent, + CurrencySelector, compareCheckbox, DropdownMenu, DropdownMenuComponent, diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/createCommerceCart.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/createCommerceCart.js index 566e4e29675151..cd2e7ccf94802a 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/createCommerceCart.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/createCommerceCart.js @@ -3,139 +3,75 @@ * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 */ -import {openModal, openToast} from 'frontend-js-web'; +import {createPortletURL, openToast} from 'frontend-js-web'; import ServiceProvider from '../ServiceProvider/index'; -import {DEFAULT_ORDER_DETAILS_PORTLET_ID} from '../components/mini_cart/util/constants'; +import { + DEFAULT_ORDER_DETAILS_PORTLET_ID, + ORDER_ID_PARAMETER, +} from '../components/mini_cart/util/constants'; import {liferayNavigate} from './index'; +import {selectOrderType} from './modals/selectOrderType'; const DeliveryCartAPI = ServiceProvider.DeliveryCartAPI('v1'); -const openOrderTypeSelectionModal = (orderTypes) => - new Promise((proceed, stop) => { - openModal({ - bodyHTML: ` -
- - - -
- `, - buttons: [ - { - displayType: 'secondary', - label: Liferay.Language.get('cancel'), - onClick: ({processClose}) => { - processClose(); - stop(new Error('cancel')); - }, - type: 'button', - }, - { - displayType: 'primary', - label: Liferay.Language.get('submit'), - onClick: ({processClose}) => { - let orderTypeId = null; - - const orderTypeSelect = - document.querySelector('#orderTypeSelect'); - - if (orderTypeSelect) { - orderTypeId = parseInt( - orderTypeSelect.selectedOptions[0]?.value, - 10 - ); - } - - proceed(orderTypeId); - processClose(); - }, - type: 'button', - }, - ], - onClose: () => { - stop(new Error('cancel')); - }, - title: Liferay.Language.get('select-order-type'), - }); - }); - export function createCommerceCart({ accountId, - commerceChannelId, currencyCode, - hasCommerceOpenOrderContentPortlet, + commerceChannelId, + onCancel = () => {}, + onCreate = () => {}, orderDetailURL, - orderTypes, + orderTypes = [], }) { const onBeforeCreate = - orderTypes.length > 1 - ? openOrderTypeSelectionModal - : () => Promise.resolve(null); - - const createOrder = hasCommerceOpenOrderContentPortlet - ? (orderTypeId) => { - const createOrderActionURL = new URL(orderDetailURL); - - if (orderTypeId) { - createOrderActionURL.searchParams.set( - `_${DEFAULT_ORDER_DETAILS_PORTLET_ID}_commerceOrderTypeId`, - String(orderTypeId) - ); - } - - return liferayNavigate(createOrderActionURL); - } - : (orderTypeId) => { - const commerceCart = {accountId, currencyCode}; - - if (orderTypeId) { - commerceCart.orderTypeId = orderTypeId; - } - - return DeliveryCartAPI.createCartByChannelId( - commerceChannelId, - commerceCart + orderTypes.length > 1 ? selectOrderType : () => Promise.resolve(null); + + return onBeforeCreate(orderTypes) + .then((orderTypeId = null) => + DeliveryCartAPI.createCartByChannelId(commerceChannelId, { + accountId, + currencyCode, + ...(orderTypeId ? {orderTypeId} : {}), + }) + ) + .then(({id: cartId = null}) => { + if (cartId) { + onCreate(); + + const redirectURL = orderDetailURL.includes( + DEFAULT_ORDER_DETAILS_PORTLET_ID ) - .then(({id: cartId = null}) => { - if (cartId && !hasCommerceOpenOrderContentPortlet) { - window.location.href = `${orderDetailURL}${cartId}`; - } - }) - .catch(({message}) => { - if (message !== 'cancel') { - openToast({ - message: - message || - Liferay.Language.get( - 'an-unexpected-error-occurred' - ), - type: 'danger', - }); - } - }); - }; + ? createPortletURL(orderDetailURL, { + [ORDER_ID_PARAMETER]: cartId, + }) + : `${orderDetailURL}${cartId}`; - onBeforeCreate(orderTypes).then(createOrder); + return liferayNavigate(redirectURL); + } + }) + .catch(({message}) => { + onCancel(); + + if (message !== 'cancel') { + openToast({ + message: + message || + Liferay.Language.get('an-unexpected-error-occurred'), + type: 'danger', + }); + } + }); } -export default function ({additionalProps, orderTypes}) { +export default function onCreateCommerceCart({additionalProps, orderTypes}) { const handler = () => createCommerceCart({...additionalProps, orderTypes}); - Liferay.on('addCommerceOrder', handler); + Liferay.on('createCommerceCart', handler); return { dispose: () => { - Liferay.detach('addCommerceOrder', handler); + Liferay.detach('createCommerceCart', handler); }, }; } diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/interface/index.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/interface/index.js index 060a14385f0956..6ab06187f72a20 100644 --- a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/interface/index.js +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/interface/index.js @@ -5,6 +5,7 @@ import AJAX from '../AJAX/index'; import CommerceCookie from '../cookies'; +import {createCommerceCart} from '../createCommerceCart'; import * as Events from '../eventsDefinitions'; import * as FormUtils from '../forms/index'; import * as BaseUtils from '../index'; @@ -15,4 +16,5 @@ export default { CommerceCookie, Events, FormUtils, + createCommerceCart, }; diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/confirmCurrencyChange.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/confirmCurrencyChange.js new file mode 100644 index 00000000000000..7cd580fca6016a --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/confirmCurrencyChange.js @@ -0,0 +1,63 @@ +/** + * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {openModal} from 'frontend-js-web'; + +import {createCommerceCart as createCartAndRedirect} from '../createCommerceCart'; + +export function confirmCurrencyChange({ + currencyCode, + onCancel, + orderDetailURL, + ...payload +}) { + return new Promise((proceed) => { + openModal({ + bodyHTML: ` +
+

+ ${Liferay.Language.get( + 'changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed' + )} +

+
+ `, + buttons: [ + { + displayType: 'secondary', + label: Liferay.Language.get('cancel'), + onClick: ({processClose}) => { + onCancel(); + proceed(); + processClose(); + }, + type: 'button', + }, + { + displayType: 'warning', + label: Liferay.Language.get('proceed'), + onClick: ({processClose}) => { + processClose(); + + createCartAndRedirect({ + ...payload, + currencyCode, + onCancel, + orderDetailURL, + }); + }, + type: 'button', + }, + ], + center: true, + onClose: () => { + onCancel(); + proceed(); + }, + status: 'warning', + title: Liferay.Language.get('change-active-currency'), + }); + }); +} diff --git a/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/selectOrderType.js b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/selectOrderType.js new file mode 100644 index 00000000000000..c495a31805c69b --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/src/main/resources/META-INF/resources/utilities/modals/selectOrderType.js @@ -0,0 +1,67 @@ +/** + * SPDX-FileCopyrightText: (c) 2024 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {openModal} from 'frontend-js-web'; + +export function selectOrderType(orderTypes) { + return new Promise((proceed, stop) => { + openModal({ + bodyHTML: ` +
+ + + +
+ `, + buttons: [ + { + displayType: 'secondary', + label: Liferay.Language.get('cancel'), + onClick: ({processClose}) => { + processClose(); + + stop(new Error('cancel')); + }, + type: 'button', + }, + { + displayType: 'primary', + label: Liferay.Language.get('submit'), + onClick: ({processClose}) => { + let orderTypeId = null; + + const orderTypeSelect = + document.querySelector('#orderTypeSelect'); + + if (orderTypeSelect) { + orderTypeId = parseInt( + orderTypeSelect.selectedOptions[0]?.value, + 10 + ); + } + + proceed(orderTypeId); + + processClose(); + }, + type: 'button', + }, + ], + onClose: () => { + stop(new Error('cancel')); + }, + title: Liferay.Language.get('select-order-type'), + }); + }); +} diff --git a/modules/apps/commerce/commerce-frontend-js/test/components/CurrencySelector/CurrencySelector.js b/modules/apps/commerce/commerce-frontend-js/test/components/CurrencySelector/CurrencySelector.js new file mode 100644 index 00000000000000..19878cd8a5d033 --- /dev/null +++ b/modules/apps/commerce/commerce-frontend-js/test/components/CurrencySelector/CurrencySelector.js @@ -0,0 +1,332 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import '../../tests_utilities/polyfills'; + +import '@testing-library/jest-dom/extend-expect'; +import {cleanup, fireEvent, render, waitFor} from '@testing-library/react'; +import React from 'react'; + +import CurrencySelector from '../../../src/main/resources/META-INF/resources/components/currency_selector/CurrencySelector'; +import * as CurrencySelectorUtils from '../../../src/main/resources/META-INF/resources/components/currency_selector/util'; +import * as CurrencyChangeModal from '../../../src/main/resources/META-INF/resources/utilities/modals/confirmCurrencyChange'; + +const mockCURRENCIES = [ + { + active: true, + code: 'USD', + externalReferenceCode: '1772bef2-8512-b8a3-067c-0e5462a6e454', + formatPattern: { + en_US: '$ ###,##0.00', + }, + id: 30128, + maxFractionDigits: 2, + minFractionDigits: 2, + name: { + en_US: 'US Dollar', + }, + primary: true, + priority: 1, + rate: 1, + roundingMode: 'HALF_EVEN', + symbol: '$', + }, + { + active: true, + code: 'GBP', + externalReferenceCode: '1ca319a1-3fa5-b341-1ae7-15858064a23b', + formatPattern: { + en_US: '£ ###,##0.00', + }, + id: 30130, + maxFractionDigits: 2, + minFractionDigits: 2, + name: { + en_US: 'British Pound', + }, + primary: false, + priority: 3, + rate: 0.7914, + roundingMode: 'HALF_EVEN', + symbol: '£', + }, + { + active: true, + code: 'CNY', + externalReferenceCode: 'b007208b-2dfd-e79e-8b75-95837869c5af', + formatPattern: { + en_US: '¥ ###,##0.00', + }, + id: 30132, + maxFractionDigits: 2, + minFractionDigits: 2, + name: { + en_US: 'Chinese Yuan Renminbi', + }, + primary: false, + priority: 5, + rate: 7.25, + roundingMode: 'HALF_EVEN', + symbol: '¥', + }, +]; + +jest.mock( + '../../../src/main/resources/META-INF/resources/ServiceProvider', + () => ({ + ...jest.requireActual( + '../../../src/main/resources/META-INF/resources/ServiceProvider' + ), + DeliveryCatalogAPI: () => ({ + getCurrenciesByChannelId: jest.fn(() => + Promise.resolve({ + items: mockCURRENCIES, + }) + ), + }), + }) +); + +jest.mock('frontend-js-web', () => { + return { + ...jest.requireActual('frontend-js-web'), + openToast: jest.fn(), + }; +}); + +jest.mock( + '../../../src/main/resources/META-INF/resources/utilities/modals/confirmCurrencyChange', + () => ({ + confirmCurrencyChange: jest.fn(), + }) +); + +jest.mock( + '../../../src/main/resources/META-INF/resources/components/currency_selector/util' +); + +describe('CurrencySelector', () => { + const BASE_PROPS = { + commerceChannelId: 24324, + commerceOrderDetailBaseURL: 'http://order-detail.url', + commerceOrderId: 0, + commerceOrderTypes: [], + }; + + const {Liferay: originalLiferay, location: originalLocation} = window; + + beforeEach(() => { + window['Liferay'] = { + ...originalLiferay, + CommerceContext: { + account: { + accountId: 12345, + }, + currency: { + currencyCode: 'USD', + }, + }, + detach: jest.fn(), + on: jest.fn(), + }; + + Object.defineProperty(window, 'location', { + configurable: true, + value: {reload: jest.fn()}, + }); + }); + + afterEach(() => { + cleanup(); + + Object.defineProperty(window, 'location', { + configurable: true, + value: {reload: originalLocation}, + }); + + window.Liferay = originalLiferay; + + jest.resetAllMocks(); + }); + + describe('Default', () => { + it('shows the currently active currency', async () => { + jest.spyOn( + CurrencySelectorUtils, + 'retrieveCommerceCurrency' + ).mockImplementation(() => undefined); + + const {getByText} = render(); + + await waitFor(() => { + const currencySelectorElement = getByText('$ USD'); + + expect(currencySelectorElement).toBeInTheDocument(); + expect(currencySelectorElement.type).toEqual('button'); + expect( + CurrencySelectorUtils.retrieveCommerceCurrency + ).toHaveBeenCalled(); + }); + }); + + it('shows the list of available currencies', async () => { + mockCURRENCIES.push({ + active: false, + code: 'NOPE', + externalReferenceCode: 'no-pe', + formatPattern: { + en_US: '$ ###,##0.00', + }, + id: 30128, + maxFractionDigits: 2, + minFractionDigits: 2, + name: { + en_US: 'NO pe', + }, + primary: true, + priority: 1, + rate: 1, + roundingMode: 'HALF_EVEN', + symbol: '$', + }); + + jest.spyOn( + CurrencySelectorUtils, + 'retrieveCommerceCurrency' + ).mockImplementation(() => undefined); + + const {getByText} = render(); + + await waitFor(() => { + const currencySelectorElement = getByText('$ USD'); + + fireEvent.click(currencySelectorElement); + }); + + await waitFor(() => { + const dropdownItems = Array.from( + document.querySelectorAll('.dropdown-item') + ); + + expect(dropdownItems.length).toEqual(3); + + dropdownItems.forEach((dropdownItem, index) => { + expect(dropdownItem.innerHTML).toEqual( + `${mockCURRENCIES[index].symbol} ${mockCURRENCIES[index].code}` + ); + + if (mockCURRENCIES[index].code === 'USD') { + expect(dropdownItem.classList.contains('active')).toBe( + true + ); + } + }); + }); + }); + + it('stores as a cookie the default selected currency code if not present', async () => { + jest.spyOn( + CurrencySelectorUtils, + 'retrieveCommerceCurrency' + ).mockImplementation(() => undefined); + + jest.spyOn(CurrencySelectorUtils, 'storeCommerceCurrency'); + + render(); + + await waitFor(() => { + expect( + CurrencySelectorUtils.storeCommerceCurrency + ).toHaveBeenCalled(); + }); + }); + }); + + describe('Interaction', () => { + it('allows to select a different currency', async () => { + jest.spyOn( + CurrencySelectorUtils, + 'retrieveCommerceCurrency' + ).mockImplementation(() => 'USD'); + + jest.spyOn(CurrencySelectorUtils, 'storeCommerceCurrency'); + + const {container, getByText} = render( + + ); + + await waitFor(() => { + const currencySelectorButton = getByText('$ USD'); + + fireEvent.click(currencySelectorButton); + }); + + await waitFor(() => { + const currencySelectionItem = document.querySelector( + '[data-testid="GBP"]' + ); + + fireEvent.click(currencySelectionItem); + }); + + await waitFor(() => { + expect(container.querySelector('button').innerHTML).toEqual( + '£ GBP' + ); + expect( + CurrencySelectorUtils.retrieveCommerceCurrency + ).toHaveBeenCalled(); + expect( + CurrencySelectorUtils.storeCommerceCurrency + ).toHaveBeenCalledWith('GBP'); + expect(window.location.reload).toHaveBeenCalled(); + }); + }); + + it('allows to change to a different currency with an active order', async () => { + jest.spyOn( + CurrencySelectorUtils, + 'retrieveCommerceCurrency' + ).mockImplementation(() => 'USD'); + + jest.spyOn(CurrencySelectorUtils, 'storeCommerceCurrency'); + + const {getByText} = render( + + ); + + await waitFor(() => { + const currencySelectorButton = getByText('$ USD'); + + fireEvent.click(currencySelectorButton); + }); + + await waitFor(() => { + const currencySelectionItem = document.querySelector( + '[data-testid="CNY"]' + ); + + fireEvent.click(currencySelectionItem); + }); + + await waitFor(() => { + expect( + CurrencyChangeModal.confirmCurrencyChange + ).toHaveBeenCalledTimes(1); + expect( + CurrencyChangeModal.confirmCurrencyChange + ).toHaveBeenCalledWith({ + accountId: window.Liferay.CommerceContext.account.accountId, + commerceChannelId: BASE_PROPS.commerceChannelId, + currencyCode: 'CNY', + onCancel: expect.any(Function), + onCreate: expect.any(Function), + orderDetailURL: BASE_PROPS.commerceOrderDetailBaseURL, + orderTypes: BASE_PROPS.commerceOrderTypes, + }); + }); + }); + }); +}); diff --git a/modules/apps/commerce/commerce-frontend-js/test/components/MiniCart/util/index.js b/modules/apps/commerce/commerce-frontend-js/test/components/MiniCart/util/index.js index f4efa44418b0ac..7e9125d9991968 100644 --- a/modules/apps/commerce/commerce-frontend-js/test/components/MiniCart/util/index.js +++ b/modules/apps/commerce/commerce-frontend-js/test/components/MiniCart/util/index.js @@ -62,36 +62,33 @@ describe('MiniCart tests_utilities', () => { }); describe('regenerateOrderDetailURL', () => { + const VALID_BASE_ORDER_DETAIL_PORTLET_URL = `http://localhost:3333/group/name/?p_p_id=${DEFAULT_ORDER_DETAILS_PORTLET_ID}`; const VALID_BASE_ORDER_DETAIL_URL = 'http://localhost:3333/group/name/'; const VALID_ORDER_UUID = '00000-00000-22222-213jd-qwerty'; const errorMessage = (argName) => `Cannot generate a new Order Detail URL. Invalid "${argName}"`; - it('returns a new valid Order Detail URL string', () => { + it('returns a new valid Order Detail Portlet URL string', () => { expect( regenerateOrderDetailURL( - VALID_BASE_ORDER_DETAIL_URL, - false, + VALID_BASE_ORDER_DETAIL_PORTLET_URL, 12345, VALID_ORDER_UUID ) - ).toEqual(VALID_BASE_ORDER_DETAIL_URL + 12345); + ).toEqual( + `${VALID_BASE_ORDER_DETAIL_PORTLET_URL}&_${DEFAULT_ORDER_DETAILS_PORTLET_ID}_${ORDER_UUID_PARAMETER}=${VALID_ORDER_UUID}` + ); }); it('returns a new valid Order Detail URL string', () => { expect( regenerateOrderDetailURL( VALID_BASE_ORDER_DETAIL_URL, - true, 12345, VALID_ORDER_UUID ) - ).toEqual( - VALID_BASE_ORDER_DETAIL_URL + - `?_${DEFAULT_ORDER_DETAILS_PORTLET_ID}_${ORDER_UUID_PARAMETER}=` + - VALID_ORDER_UUID - ); + ).toEqual(VALID_BASE_ORDER_DETAIL_URL + 12345); }); it('throws if the "orderId" string argument is empty or null', () => { @@ -99,7 +96,6 @@ describe('MiniCart tests_utilities', () => { expect( regenerateOrderDetailURL( VALID_BASE_ORDER_DETAIL_URL, - false, '', VALID_ORDER_UUID ) @@ -107,7 +103,6 @@ describe('MiniCart tests_utilities', () => { expect( regenerateOrderDetailURL( VALID_BASE_ORDER_DETAIL_URL, - false, null, VALID_ORDER_UUID ) @@ -122,16 +117,15 @@ describe('MiniCart tests_utilities', () => { try { expect( regenerateOrderDetailURL( - VALID_BASE_ORDER_DETAIL_URL, - true, + VALID_BASE_ORDER_DETAIL_PORTLET_URL, 12345, '' ) ).toThrow(); + expect( regenerateOrderDetailURL( - VALID_BASE_ORDER_DETAIL_URL, - true, + VALID_BASE_ORDER_DETAIL_PORTLET_URL, 12345, null ) @@ -145,50 +139,25 @@ describe('MiniCart tests_utilities', () => { it('throws if the "baseOrderDetailURL" string argument is empty or null', () => { try { expect( - regenerateOrderDetailURL('', false, 12345, VALID_ORDER_UUID) + regenerateOrderDetailURL('', 12345, VALID_ORDER_UUID) ).toThrow(); + expect( - regenerateOrderDetailURL( - null, - false, - 12345, - VALID_ORDER_UUID - ) + regenerateOrderDetailURL(null, 12345, VALID_ORDER_UUID) ).toThrow(); + expect( - regenerateOrderDetailURL('', true, 12345, VALID_ORDER_UUID) + regenerateOrderDetailURL('', 12345, VALID_ORDER_UUID) ).toThrow(); + expect( - regenerateOrderDetailURL( - null, - true, - 12345, - VALID_ORDER_UUID - ) + regenerateOrderDetailURL(null, 12345, VALID_ORDER_UUID) ).toThrow(); } catch (error) { expect(error.message).toEqual(errorMessage`baseOrderDetailURL`); } }); - - it('throws if the "baseOrderDetailURL" string argument is a malformed URL', () => { - const MALFORMED_ORDER_DETAIL_URL = 'malformed'; - - try { - expect( - regenerateOrderDetailURL( - MALFORMED_ORDER_DETAIL_URL, - true, - 12345, - VALID_ORDER_UUID - ) - ).toThrow(TypeError); - } - catch (error) { - expect(error.message.includes('Invalid URL')).toBe(true); - } - }); }); describe('summaryDataMapper', () => { diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/AccountSelectorTag.java b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/AccountSelectorTag.java index 8db24e43fd78ea..d3dbea94858acd 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/AccountSelectorTag.java +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/AccountSelectorTag.java @@ -21,10 +21,9 @@ import com.liferay.commerce.frontend.taglib.internal.servlet.ServletContextUtil; import com.liferay.commerce.model.CommerceOrder; import com.liferay.commerce.model.CommerceOrderType; +import com.liferay.commerce.order.CommerceOrderHttpHelper; import com.liferay.commerce.product.model.CommerceChannel; import com.liferay.commerce.service.CommerceOrderTypeLocalService; -import com.liferay.commerce.util.CommerceOrderInfoItemUtil; -import com.liferay.friendly.url.provider.FriendlyURLSeparatorProvider; import com.liferay.petra.string.StringBundler; import com.liferay.petra.string.StringPool; import com.liferay.portal.configuration.module.configuration.ConfigurationProvider; @@ -47,7 +46,6 @@ import com.liferay.portal.kernel.security.permission.resource.PortletResourcePermission; import com.liferay.portal.kernel.settings.GroupServiceSettingsLocator; import com.liferay.portal.kernel.theme.ThemeDisplay; -import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.WebKeys; @@ -96,7 +94,9 @@ public int doStartTag() throws JspException { _accountEntry = commerceContext.getAccountEntry(); _accountEntryAllowedTypes = commerceContext.getAccountEntryAllowedTypes(); - _addCommerceOrderURL = _getAddCommerceOrderURL(httpServletRequest); + _addCommerceOrderURL = + _commerceOrderHttpHelper.getCommerceCartBaseURL( + httpServletRequest); _checkoutURL = _getCheckoutURL(httpServletRequest); _commerceOrder = commerceContext.getCommerceOrder(); @@ -155,6 +155,8 @@ public void setPageContext(PageContext pageContext) { setServletContext(ServletContextUtil.getServletContext()); + _commerceOrderHttpHelper = + ServletContextUtil.getCommerceOrderHttpHelper(); _commerceOrderPortletResourcePermission = ServletContextUtil.getCommerceOrderPortletResourcePermission(); _commerceOrderTypeLocalService = @@ -177,6 +179,7 @@ protected void cleanUp() { _commerceChannelGroupId = 0; _commerceChannelId = 0; _commerceOrder = null; + _commerceOrderHttpHelper = null; _commerceOrderPortletResourcePermission = null; _commerceOrderTypeLocalService = null; _configurationProvider = null; @@ -258,10 +261,6 @@ protected void setAttributes(HttpServletRequest httpServletRequest) { httpServletRequest.setAttribute( "liferay-commerce:account-selector:hasAddCommerceOrderPermission", _hasAddCommerceOrderPermission()); - httpServletRequest.setAttribute( - "liferay-commerce:account-selector:" + - "hasCommerceOpenOrderContentPortlet", - _hasCommerceOpenOrderContentPortlet(httpServletRequest)); httpServletRequest.setAttribute( "liferay-commerce:account-selector:hasManageAccountsPermission", _hasManageAccountsPermission()); @@ -278,26 +277,6 @@ protected void setAttributes(HttpServletRequest httpServletRequest) { "liferay-commerce:account-selector:spritemap", _spritemap); } - private String _getAddCommerceOrderURL( - HttpServletRequest httpServletRequest) - throws PortalException { - - if (_hasCommerceOpenOrderContentPortlet(httpServletRequest)) { - return PortletURLBuilder.create( - _getPortletURL( - httpServletRequest, - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT) - ).setActionName( - "/commerce_open_order_content/edit_commerce_order" - ).setCMD( - Constants.ADD - ).buildString(); - } - - return CommerceOrderInfoItemUtil.getCommerceOrderFriendlyURL( - _friendlyURLSeparatorProviderSnapshot.get(), httpServletRequest); - } - private String _getCheckoutURL(HttpServletRequest httpServletRequest) throws PortalException { @@ -441,25 +420,6 @@ private boolean _hasAddCommerceOrderPermission() { CommerceOrderActionKeys.ADD_COMMERCE_ORDER); } - private boolean _hasCommerceOpenOrderContentPortlet( - HttpServletRequest httpServletRequest) { - - try { - long plid = PortalUtil.getPlidFromPortletId( - PortalUtil.getScopeGroupId(httpServletRequest), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT); - - if (plid > 0) { - return true; - } - } - catch (PortalException portalException) { - _log.error(portalException); - } - - return false; - } - private boolean _hasManageAccountsPermission() { if (_themeDisplay == null) { return false; @@ -485,9 +445,6 @@ private boolean _hasManageAccountsPermission() { private static final Log _log = LogFactoryUtil.getLog( AccountSelectorTag.class); - private static final Snapshot - _friendlyURLSeparatorProviderSnapshot = new Snapshot<>( - AccountSelectorTag.class, FriendlyURLSeparatorProvider.class); private static final Snapshot> _userModelResourcePermissionSnapshot = new Snapshot<>( ServletContextUtil.class, @@ -501,6 +458,7 @@ private boolean _hasManageAccountsPermission() { private long _commerceChannelGroupId; private long _commerceChannelId; private CommerceOrder _commerceOrder; + private CommerceOrderHttpHelper _commerceOrderHttpHelper; private PortletResourcePermission _commerceOrderPortletResourcePermission; private CommerceOrderTypeLocalService _commerceOrderTypeLocalService; private ConfigurationProvider _configurationProvider; diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/MiniCartTag.java b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/MiniCartTag.java index a4897d0cc8a2d8..1f6f4cdbf615cc 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/MiniCartTag.java +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/MiniCartTag.java @@ -20,8 +20,6 @@ import com.liferay.commerce.model.CommerceOrderItem; import com.liferay.commerce.order.CommerceOrderHttpHelper; import com.liferay.commerce.product.url.CPFriendlyURL; -import com.liferay.commerce.util.CommerceOrderInfoItemUtil; -import com.liferay.friendly.url.provider.FriendlyURLSeparatorProvider; import com.liferay.petra.string.StringPool; import com.liferay.portal.configuration.module.configuration.ConfigurationProvider; import com.liferay.portal.kernel.exception.PortalException; @@ -31,17 +29,13 @@ import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.module.configuration.ConfigurationException; -import com.liferay.portal.kernel.module.service.Snapshot; import com.liferay.portal.kernel.portlet.PortletProvider; import com.liferay.portal.kernel.portlet.PortletProviderUtil; -import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil; import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder; import com.liferay.portal.kernel.settings.GroupServiceSettingsLocator; import com.liferay.portal.kernel.settings.SystemSettingsLocator; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.HtmlUtil; -import com.liferay.portal.kernel.util.ParamUtil; -import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.taglib.util.IncludeTag; @@ -51,7 +45,6 @@ import java.util.List; import java.util.Map; -import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.servlet.http.HttpServletRequest; @@ -93,7 +86,9 @@ public int doStartTag() throws JspException { _accountEntryId = accountEntry.getAccountEntryId(); } - _baseOrderDetailURL = _getBaseOrderDetailURL(themeDisplay); + _baseOrderDetailURL = + _commerceOrderHttpHelper.getCommerceCartBaseURL( + httpServletRequest); PortletURL commerceCheckoutPortletURL = PortletProviderUtil.getPortletURL( @@ -278,9 +273,6 @@ protected void setAttributes(HttpServletRequest httpServletRequest) { _displayTotalItemsQuantity); httpServletRequest.setAttribute( "liferay-commerce:cart:guestOrderEnabled", _guestOrderEnabled); - httpServletRequest.setAttribute( - "liferay-commerce:cart:hasCommerceOpenOrderContentPortlet", - _hasCommerceOpenOrderContentPortlet(httpServletRequest)); httpServletRequest.setAttribute( "liferay-commerce:cart:itemsQuantity", _itemsQuantity); httpServletRequest.setAttribute( @@ -301,45 +293,6 @@ protected void setAttributes(HttpServletRequest httpServletRequest) { "liferay-commerce:cart:toggleable", _toggleable); } - private String _getBaseOrderDetailURL(ThemeDisplay themeDisplay) - throws PortalException { - - if (_hasCommerceOpenOrderContentPortlet(themeDisplay.getRequest())) { - PortletURL portletURL = null; - - long plid = PortalUtil.getPlidFromPortletId( - themeDisplay.getScopeGroupId(), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT); - - if (plid > 0) { - portletURL = PortletURLFactoryUtil.create( - themeDisplay.getRequest(), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT, plid, - PortletRequest.RENDER_PHASE); - } - else { - portletURL = PortletURLFactoryUtil.create( - themeDisplay.getRequest(), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT, - PortletRequest.RENDER_PHASE); - } - - portletURL.setParameter( - "mvcRenderCommandName", - "/commerce_open_order_content/edit_commerce_order"); - portletURL.setParameter( - "backURL", - ParamUtil.getString(themeDisplay.getRequest(), "backURL")); - - return portletURL.toString(); - } - - return HtmlUtil.escape( - CommerceOrderInfoItemUtil.getCommerceOrderFriendlyURL( - _friendlyURLSeparatorProviderSnapshot.get(), - themeDisplay.getRequest())); - } - private int _getItemsQuantity( CommerceOrder commerceOrder, HttpServletRequest httpServletRequest) throws PortalException { @@ -367,25 +320,6 @@ private String _getSiteDefaultURL(ThemeDisplay themeDisplay) { group.getDisplayURL(themeDisplay, layout.isPrivateLayout())); } - private boolean _hasCommerceOpenOrderContentPortlet( - HttpServletRequest httpServletRequest) { - - try { - long plid = PortalUtil.getPlidFromPortletId( - PortalUtil.getScopeGroupId(httpServletRequest), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT); - - if (plid > 0) { - return true; - } - } - catch (PortalException portalException) { - _log.error(portalException); - } - - return false; - } - private boolean _isDisplayDiscountLevels() { try { CommercePriceConfiguration commercePriceConfiguration = @@ -438,10 +372,6 @@ private boolean _isRequestQuoteEnabled() throws PortalException { private static final Log _log = LogFactoryUtil.getLog(MiniCartTag.class); - private static final Snapshot - _friendlyURLSeparatorProviderSnapshot = new Snapshot<>( - MiniCartTag.class, FriendlyURLSeparatorProvider.class); - private long _accountEntryId = AccountConstants.ACCOUNT_ENTRY_ID_ANY; private String _baseOrderDetailURL = StringPool.BLANK; private String _checkoutURL = StringPool.BLANK; diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/RequestQuoteTag.java b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/RequestQuoteTag.java index 3c63762852eb00..98d1ed866046ce 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/RequestQuoteTag.java +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/java/com/liferay/commerce/frontend/taglib/servlet/taglib/RequestQuoteTag.java @@ -28,6 +28,7 @@ import com.liferay.petra.string.StringPool; import com.liferay.portal.configuration.module.configuration.ConfigurationProvider; import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.feature.flag.FeatureFlagManagerUtil; import com.liferay.portal.kernel.json.JSONArray; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; @@ -284,7 +285,7 @@ private PortletURL _getPortletURL( long plid = PortalUtil.getPlidFromPortletId(groupId, portletId); - if (plid > 0) { + if ((plid > 0) || FeatureFlagManagerUtil.isEnabled("LPD-20379")) { return PortletURLFactoryUtil.create( httpServletRequest, portletId, plid, PortletRequest.ACTION_PHASE); diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/init.jsp b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/init.jsp index 6b9ffd92b14372..8c1eed2f56413f 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/init.jsp +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/init.jsp @@ -32,7 +32,6 @@ String currencyCode = (String)request.getAttribute("liferay-commerce:account-sel CurrentCommerceAccountModel currentCommerceAccount = (CurrentCommerceAccountModel)request.getAttribute("liferay-commerce:account-selector:currentCommerceAccount"); CurrentCommerceOrderModel currentCommerceOrder = (CurrentCommerceOrderModel)request.getAttribute("liferay-commerce:account-selector:currentCommerceOrder"); boolean hasAddCommerceOrderPermission = (boolean)request.getAttribute("liferay-commerce:account-selector:hasAddCommerceOrderPermission"); -boolean hasCommerceOpenOrderContentPortlet = (boolean)request.getAttribute("liferay-commerce:account-selector:hasCommerceOpenOrderContentPortlet"); boolean hasManageAccountsPermission = (boolean)request.getAttribute("liferay-commerce:account-selector:hasManageAccountsPermission"); JSONArray orderTypesJSONArray = (JSONArray)request.getAttribute("liferay-commerce:account-selector:orderTypes"); String selectOrderURL = (String)request.getAttribute("liferay-commerce:account-selector:selectOrderURL"); diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/page.jsp b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/page.jsp index f882d8de96c005..b885b395869fe0 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/page.jsp +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/account_selector/page.jsp @@ -36,8 +36,6 @@ "currentCommerceOrder", currentCommerceOrder ).put( "hasAddCommerceOrderPermission", hasAddCommerceOrderPermission - ).put( - "hasCommerceOpenOrderContentPortlet", hasCommerceOpenOrderContentPortlet ).put( "hasManageAccountsPermission", hasManageAccountsPermission ).put( diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/init.jsp b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/init.jsp index a65b69f7415a3b..14bd50b1fc0e52 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/init.jsp +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/init.jsp @@ -33,7 +33,6 @@ String cssClasses = (String)request.getAttribute("liferay-commerce:cart:cssClass boolean displayDiscountLevels = (boolean)request.getAttribute("liferay-commerce:cart:displayDiscountLevels"); boolean displayTotalItemsQuantity = (boolean)request.getAttribute("liferay-commerce:cart:displayTotalItemsQuantity"); boolean guestOrderEnabled = (boolean)request.getAttribute("liferay-commerce:cart:guestOrderEnabled"); -boolean hasCommerceOpenOrderContentPortlet = (boolean)request.getAttribute("liferay-commerce:cart:hasCommerceOpenOrderContentPortlet"); int itemsQuantity = (int)request.getAttribute("liferay-commerce:cart:itemsQuantity"); Map labels = (Map)request.getAttribute("liferay-commerce:cart:labels"); String orderDetailURL = (String)request.getAttribute("liferay-commerce:cart:orderDetailURL"); diff --git a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/page.jsp b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/page.jsp index a47faf30dcb8fc..567ec71b698c07 100644 --- a/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/page.jsp +++ b/modules/apps/commerce/commerce-frontend-taglib/src/main/resources/META-INF/resources/mini_cart/page.jsp @@ -36,8 +36,6 @@ "groupId", commerceChannelGroupId ).put( "guestOrderEnabled", guestOrderEnabled - ).put( - "hasCommerceOpenOrderContentPortlet", hasCommerceOpenOrderContentPortlet ).put( "id", commerceChannelId ).put( diff --git a/modules/apps/commerce/commerce-order-content-web/src/main/java/com/liferay/commerce/order/content/web/internal/fragment/renderer/OrdersDataSetFragmentRenderer.java b/modules/apps/commerce/commerce-order-content-web/src/main/java/com/liferay/commerce/order/content/web/internal/fragment/renderer/OrdersDataSetFragmentRenderer.java index 0f26f86e603842..90c02a16a0a0ca 100644 --- a/modules/apps/commerce/commerce-order-content-web/src/main/java/com/liferay/commerce/order/content/web/internal/fragment/renderer/OrdersDataSetFragmentRenderer.java +++ b/modules/apps/commerce/commerce-order-content-web/src/main/java/com/liferay/commerce/order/content/web/internal/fragment/renderer/OrdersDataSetFragmentRenderer.java @@ -9,6 +9,7 @@ import com.liferay.commerce.constants.CommercePortletKeys; import com.liferay.commerce.model.CommerceOrderType; import com.liferay.commerce.model.CommerceReturn; +import com.liferay.commerce.order.CommerceOrderHttpHelper; import com.liferay.commerce.order.content.web.internal.constants.CommerceOrderFragmentFDSNames; import com.liferay.commerce.product.model.CommerceChannel; import com.liferay.commerce.product.service.CommerceChannelLocalService; @@ -40,11 +41,9 @@ import com.liferay.portal.kernel.portlet.LiferayWindowState; import com.liferay.portal.kernel.portlet.PortletProvider; import com.liferay.portal.kernel.portlet.PortletProviderUtil; -import com.liferay.portal.kernel.portlet.PortletURLFactory; import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil; import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder; import com.liferay.portal.kernel.theme.ThemeDisplay; -import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HashMapBuilder; import com.liferay.portal.kernel.util.Portal; @@ -381,17 +380,18 @@ private Map _getFDSAdditionalProps( ).put( "currencyCode", commerceChannel.getCommerceCurrencyCode() ).put( - "hasCommerceOpenOrderContentPortlet", - _hasCommerceOpenOrderContentPortlet(httpServletRequest) - ).put( - "orderDetailURL", _getOrderURL(httpServletRequest) + "orderDetailURL", + _commerceOrderHttpHelper.getCommerceCartBaseURL( + httpServletRequest) ).build(); } else if (fdsName.equals(CommerceOrderFragmentFDSNames.PLACED_ORDERS)) { return HashMapBuilder.put( "namespace", namespace ).put( - "orderDetailURL", _getOrderURL(httpServletRequest) + "orderDetailURL", + _commerceOrderHttpHelper.getCommerceCartBaseURL( + httpServletRequest) ).build(); } @@ -423,7 +423,7 @@ private CreationMenu _getFDSCreationMenu( return CreationMenuBuilder.addPrimaryDropdownItem( dropdownItem -> { - dropdownItem.setHref("addCommerceOrder"); + dropdownItem.setHref("createCommerceCart"); dropdownItem.setLabel( _language.get(httpServletRequest, "add-order")); dropdownItem.setTarget("event"); @@ -431,26 +431,6 @@ private CreationMenu _getFDSCreationMenu( ).build(); } - private String _getOrderURL(HttpServletRequest httpServletRequest) - throws Exception { - - if (_hasCommerceOpenOrderContentPortlet(httpServletRequest)) { - return PortletURLBuilder.create( - _portletURLFactory.create( - httpServletRequest, - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT, - PortletRequest.ACTION_PHASE) - ).setActionName( - "/commerce_open_order_content/edit_commerce_order" - ).setCMD( - Constants.ADD - ).buildString(); - } - - return CommerceOrderInfoItemUtil.getCommerceOrderFriendlyURL( - _friendlyURLSeparatorProviderSnapshot.get(), httpServletRequest); - } - private Map _getReturnableOrderItemsContextParams( CommerceChannel commerceChannel, HttpServletRequest httpServletRequest) { @@ -496,21 +476,6 @@ private String _getViewReturnableOrderItemsURL( ).buildString(); } - private boolean _hasCommerceOpenOrderContentPortlet( - HttpServletRequest httpServletRequest) - throws Exception { - - long plid = _portal.getPlidFromPortletId( - _portal.getScopeGroupId(httpServletRequest), - CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT); - - if (plid > 0) { - return true; - } - - return false; - } - private static final Log _log = LogFactoryUtil.getLog( OrdersDataSetFragmentRenderer.class); @@ -525,6 +490,9 @@ private boolean _hasCommerceOpenOrderContentPortlet( @Reference private CommerceChannelLocalService _commerceChannelLocalService; + @Reference + private CommerceOrderHttpHelper _commerceOrderHttpHelper; + @Reference private CommerceOrderTypeLocalService _commerceOrderTypeLocalService; @@ -540,9 +508,6 @@ private boolean _hasCommerceOpenOrderContentPortlet( @Reference private Portal _portal; - @Reference - private PortletURLFactory _portletURLFactory; - @Reference( target = "(osgi.web.symbolicname=com.liferay.commerce.order.content.web)" ) diff --git a/modules/apps/commerce/commerce-product-api/bnd.bnd b/modules/apps/commerce/commerce-product-api/bnd.bnd index d4ae3633d42590..007982d4f058b7 100644 --- a/modules/apps/commerce/commerce-product-api/bnd.bnd +++ b/modules/apps/commerce/commerce-product-api/bnd.bnd @@ -1,6 +1,6 @@ Bundle-Name: Liferay Commerce Product API Bundle-SymbolicName: com.liferay.commerce.product.api -Bundle-Version: 88.2.1 +Bundle-Version: 88.3.0 Export-Package:\ com.liferay.commerce.product.availability,\ com.liferay.commerce.product.catalog,\ diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalService.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalService.java index e1f30ae7fd9610..6066a709879bca 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalService.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalService.java @@ -288,6 +288,14 @@ public List getCommerceChannelRels( public int getCommerceChannelRelsCount( String className, long classPK, String name); + @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) + public List getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end); + + @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name); + @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public IndexableActionableDynamicQuery getIndexableActionableDynamicQuery(); diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceUtil.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceUtil.java index d5b6a5498f0eff..e55f5773f44cf7 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceUtil.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceUtil.java @@ -344,6 +344,21 @@ public static int getCommerceChannelRelsCount( className, classPK, name); } + public static List + getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) { + + return getService().getCommerceCurrencyCommerceChannelRels( + commerceChannelId, name, start, end); + } + + public static int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) { + + return getService().getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, name); + } + public static com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() { diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceWrapper.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceWrapper.java index 9497cd14ea4f46..4c04e29f4ed5bf 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceWrapper.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelLocalServiceWrapper.java @@ -391,6 +391,25 @@ public int getCommerceChannelRelsCount( className, classPK, name); } + @Override + public java.util.List + getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) { + + return _commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRels( + commerceChannelId, name, start, end); + } + + @Override + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) { + + return _commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, name); + } + @Override public com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery getIndexableActionableDynamicQuery() { diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelService.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelService.java index 907fa5b09f9632..65c3ba961190f4 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelService.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelService.java @@ -105,6 +105,16 @@ public int getCommerceChannelRelsCount( String className, long classPK, String name) throws PortalException; + @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) + public List getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) + throws PortalException; + + @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) + throws PortalException; + /** * Returns the OSGi service identifier. * diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceUtil.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceUtil.java index 5b9cd77421ac67..75c7f6bedfd704 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceUtil.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceUtil.java @@ -130,6 +130,23 @@ public static int getCommerceChannelRelsCount( className, classPK, name); } + public static List + getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) + throws PortalException { + + return getService().getCommerceCurrencyCommerceChannelRels( + commerceChannelId, name, start, end); + } + + public static int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) + throws PortalException { + + return getService().getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, name); + } + /** * Returns the OSGi service identifier. * diff --git a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceWrapper.java b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceWrapper.java index bec578be353adf..9508875f8755d2 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceWrapper.java +++ b/modules/apps/commerce/commerce-product-api/src/main/java/com/liferay/commerce/product/service/CommerceChannelRelServiceWrapper.java @@ -145,6 +145,27 @@ public int getCommerceChannelRelsCount( className, classPK, name); } + @Override + public java.util.List + getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) + throws com.liferay.portal.kernel.exception.PortalException { + + return _commerceChannelRelService. + getCommerceCurrencyCommerceChannelRels( + commerceChannelId, name, start, end); + } + + @Override + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) + throws com.liferay.portal.kernel.exception.PortalException { + + return _commerceChannelRelService. + getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, name); + } + /** * Returns the OSGi service identifier. * diff --git a/modules/apps/commerce/commerce-product-api/src/main/resources/com/liferay/commerce/product/service/packageinfo b/modules/apps/commerce/commerce-product-api/src/main/resources/com/liferay/commerce/product/service/packageinfo index 9a9c1f2cf99df9..b3d897dcc92554 100644 --- a/modules/apps/commerce/commerce-product-api/src/main/resources/com/liferay/commerce/product/service/packageinfo +++ b/modules/apps/commerce/commerce-product-api/src/main/resources/com/liferay/commerce/product/service/packageinfo @@ -1 +1 @@ -version 49.2.0 \ No newline at end of file +version 49.3.0 \ No newline at end of file diff --git a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/http/CommerceChannelRelServiceHttp.java b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/http/CommerceChannelRelServiceHttp.java index 82bcbca9ac4edb..8a6ee6e94ec172 100644 --- a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/http/CommerceChannelRelServiceHttp.java +++ b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/http/CommerceChannelRelServiceHttp.java @@ -250,6 +250,93 @@ public static void deleteCommerceChannelRels( } } + public static java.util.List + + getCommerceCurrencyCommerceChannelRels( + HttpPrincipal httpPrincipal, long commerceChannelId, + String name, int start, int end) + throws com.liferay.portal.kernel.exception.PortalException { + + try { + MethodKey methodKey = new MethodKey( + CommerceChannelRelServiceUtil.class, + "getCommerceCurrencyCommerceChannelRels", + _getCommerceCurrencyCommerceChannelRelsParameterTypes5); + + MethodHandler methodHandler = new MethodHandler( + methodKey, commerceChannelId, name, start, end); + + Object returnObj = null; + + try { + returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler); + } + catch (Exception exception) { + if (exception instanceof + com.liferay.portal.kernel.exception.PortalException) { + + throw (com.liferay.portal.kernel.exception.PortalException) + exception; + } + + throw new com.liferay.portal.kernel.exception.SystemException( + exception); + } + + return (java.util.List + ) + returnObj; + } + catch (com.liferay.portal.kernel.exception.SystemException + systemException) { + + _log.error(systemException, systemException); + + throw systemException; + } + } + + public static int getCommerceCurrencyCommerceChannelRelsCount( + HttpPrincipal httpPrincipal, long commerceChannelId, String name) + throws com.liferay.portal.kernel.exception.PortalException { + + try { + MethodKey methodKey = new MethodKey( + CommerceChannelRelServiceUtil.class, + "getCommerceCurrencyCommerceChannelRelsCount", + _getCommerceCurrencyCommerceChannelRelsCountParameterTypes6); + + MethodHandler methodHandler = new MethodHandler( + methodKey, commerceChannelId, name); + + Object returnObj = null; + + try { + returnObj = TunnelUtil.invoke(httpPrincipal, methodHandler); + } + catch (Exception exception) { + if (exception instanceof + com.liferay.portal.kernel.exception.PortalException) { + + throw (com.liferay.portal.kernel.exception.PortalException) + exception; + } + + throw new com.liferay.portal.kernel.exception.SystemException( + exception); + } + + return ((Integer)returnObj).intValue(); + } + catch (com.liferay.portal.kernel.exception.SystemException + systemException) { + + _log.error(systemException, systemException); + + throw systemException; + } + } + public static java.util.List getCommerceChannelCountries( @@ -261,7 +348,7 @@ public static void deleteCommerceChannelRels( MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelCountries", - _getCommerceChannelCountriesParameterTypes5); + _getCommerceChannelCountriesParameterTypes7); MethodHandler methodHandler = new MethodHandler( methodKey, commerceChannelId, name, start, end); @@ -304,7 +391,7 @@ public static int getCommerceChannelCountriesCount( MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelCountriesCount", - _getCommerceChannelCountriesCountParameterTypes6); + _getCommerceChannelCountriesCountParameterTypes8); MethodHandler methodHandler = new MethodHandler( methodKey, commerceChannelId, name); @@ -345,7 +432,7 @@ public static int getCommerceChannelCountriesCount( try { MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRel", - _getCommerceChannelRelParameterTypes7); + _getCommerceChannelRelParameterTypes9); MethodHandler methodHandler = new MethodHandler( methodKey, commerceChannelRelId); @@ -392,7 +479,7 @@ public static int getCommerceChannelCountriesCount( try { MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRels", - _getCommerceChannelRelsParameterTypes8); + _getCommerceChannelRelsParameterTypes10); MethodHandler methodHandler = new MethodHandler( methodKey, commerceChannelId, start, end, orderByComparator); @@ -437,7 +524,7 @@ public static int getCommerceChannelCountriesCount( try { MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRels", - _getCommerceChannelRelsParameterTypes9); + _getCommerceChannelRelsParameterTypes11); MethodHandler methodHandler = new MethodHandler( methodKey, className, classPK, name, start, end); @@ -480,7 +567,7 @@ public static int getCommerceChannelRelsCount( MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRelsCount", - _getCommerceChannelRelsCountParameterTypes10); + _getCommerceChannelRelsCountParameterTypes12); MethodHandler methodHandler = new MethodHandler( methodKey, commerceChannelId); @@ -521,7 +608,7 @@ public static int getCommerceChannelRelsCount( MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRelsCount", - _getCommerceChannelRelsCountParameterTypes11); + _getCommerceChannelRelsCountParameterTypes13); MethodHandler methodHandler = new MethodHandler( methodKey, className, classPK); @@ -563,7 +650,7 @@ public static int getCommerceChannelRelsCount( MethodKey methodKey = new MethodKey( CommerceChannelRelServiceUtil.class, "getCommerceChannelRelsCount", - _getCommerceChannelRelsCountParameterTypes12); + _getCommerceChannelRelsCountParameterTypes14); MethodHandler methodHandler = new MethodHandler( methodKey, className, classPK, name); @@ -616,32 +703,39 @@ public static int getCommerceChannelRelsCount( private static final Class[] _fetchCommerceChannelRelParameterTypes4 = new Class[] {String.class, long.class, long.class}; private static final Class[] - _getCommerceChannelCountriesParameterTypes5 = new Class[] { + _getCommerceCurrencyCommerceChannelRelsParameterTypes5 = new Class[] { + long.class, String.class, int.class, int.class + }; + private static final Class[] + _getCommerceCurrencyCommerceChannelRelsCountParameterTypes6 = + new Class[] {long.class, String.class}; + private static final Class[] + _getCommerceChannelCountriesParameterTypes7 = new Class[] { long.class, String.class, int.class, int.class }; private static final Class[] - _getCommerceChannelCountriesCountParameterTypes6 = new Class[] { + _getCommerceChannelCountriesCountParameterTypes8 = new Class[] { long.class, String.class }; - private static final Class[] _getCommerceChannelRelParameterTypes7 = + private static final Class[] _getCommerceChannelRelParameterTypes9 = new Class[] {long.class}; - private static final Class[] _getCommerceChannelRelsParameterTypes8 = + private static final Class[] _getCommerceChannelRelsParameterTypes10 = new Class[] { long.class, int.class, int.class, com.liferay.portal.kernel.util.OrderByComparator.class }; - private static final Class[] _getCommerceChannelRelsParameterTypes9 = + private static final Class[] _getCommerceChannelRelsParameterTypes11 = new Class[] { String.class, long.class, String.class, int.class, int.class }; private static final Class[] - _getCommerceChannelRelsCountParameterTypes10 = new Class[] {long.class}; + _getCommerceChannelRelsCountParameterTypes12 = new Class[] {long.class}; private static final Class[] - _getCommerceChannelRelsCountParameterTypes11 = new Class[] { + _getCommerceChannelRelsCountParameterTypes13 = new Class[] { String.class, long.class }; private static final Class[] - _getCommerceChannelRelsCountParameterTypes12 = new Class[] { + _getCommerceChannelRelsCountParameterTypes14 = new Class[] { String.class, long.class, String.class }; diff --git a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelLocalServiceImpl.java b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelLocalServiceImpl.java index 719041a6448235..30350609e6c810 100644 --- a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelLocalServiceImpl.java +++ b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelLocalServiceImpl.java @@ -5,6 +5,9 @@ package com.liferay.commerce.product.service.impl; +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.model.CommerceCurrencyTable; +import com.liferay.commerce.currency.service.CommerceCurrencyLocalService; import com.liferay.commerce.product.exception.DuplicateCommerceChannelRelException; import com.liferay.commerce.product.model.CommerceChannelRel; import com.liferay.commerce.product.model.CommerceChannelRelTable; @@ -15,9 +18,14 @@ import com.liferay.petra.string.StringPool; import com.liferay.portal.aop.AopService; import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.model.Country; import com.liferay.portal.kernel.model.CountryTable; import com.liferay.portal.kernel.model.User; +import com.liferay.portal.kernel.search.Indexable; +import com.liferay.portal.kernel.search.IndexableType; +import com.liferay.portal.kernel.search.Indexer; +import com.liferay.portal.kernel.search.IndexerRegistryUtil; import com.liferay.portal.kernel.service.ClassNameLocalService; import com.liferay.portal.kernel.service.CountryLocalService; import com.liferay.portal.kernel.service.ServiceContext; @@ -57,6 +65,10 @@ public CommerceChannelRel addCommerceChannelRel( throw new DuplicateCommerceChannelRelException(); } + if (className.equals(CommerceCurrency.class.getName())) { + _reindexCommerceChannelRels(classPK); + } + User user = _userLocalService.getUser(serviceContext.getUserId()); long commerceChannelRelId = counterLocalService.increment(); @@ -85,6 +97,28 @@ public List addCommerceChannelRels( className, classPK, commerceChannelId, serviceContext)); } + @Indexable(type = IndexableType.DELETE) + @Override + public CommerceChannelRel deleteCommerceChannelRel( + long commerceChannelRelId) + throws PortalException { + + CommerceChannelRel commerceChannelRel = + commerceChannelRelPersistence.remove(commerceChannelRelId); + + long commerceCurrencyClassNameId = + _classNameLocalService.getClassNameId( + CommerceCurrency.class.getName()); + + if (commerceChannelRel.getClassNameId() == + commerceCurrencyClassNameId) { + + _reindexCommerceChannelRels(commerceChannelRel.getClassPK()); + } + + return commerceChannelRel; + } + @Override public void deleteCommerceChannelRels(long commerceChannelId) { commerceChannelRelPersistence.removeByCommerceChannelId( @@ -227,9 +261,100 @@ public int getCommerceChannelRelsCount( return commerceChannelRelFinder.countByC_C(className, classPK, name); } + @Override + public List getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) { + + return dslQuery( + DSLQueryFactoryUtil.select( + CommerceChannelRelTable.INSTANCE + ).from( + CommerceChannelRelTable.INSTANCE + ).leftJoinOn( + CommerceCurrencyTable.INSTANCE, + CommerceCurrencyTable.INSTANCE.commerceCurrencyId.eq( + CommerceChannelRelTable.INSTANCE.classPK) + ).where( + CommerceChannelRelTable.INSTANCE.classNameId.eq( + _classNameLocalService.getClassNameId( + CommerceCurrency.class.getName()) + ).and( + CommerceChannelRelTable.INSTANCE.commerceChannelId.eq( + commerceChannelId) + ).and( + () -> { + if (Validator.isNull(name)) { + return null; + } + + return DSLFunctionFactoryUtil.lower( + CommerceCurrencyTable.INSTANCE.name + ).like( + StringPool.PERCENT + StringUtil.toLowerCase(name) + + StringPool.PERCENT + ); + } + ) + ).limit( + start, end + )); + } + + @Override + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) { + + return dslQueryCount( + DSLQueryFactoryUtil.count( + ).from( + CommerceChannelRelTable.INSTANCE + ).leftJoinOn( + CommerceCurrencyTable.INSTANCE, + CommerceCurrencyTable.INSTANCE.commerceCurrencyId.eq( + CommerceChannelRelTable.INSTANCE.classPK) + ).where( + CommerceChannelRelTable.INSTANCE.commerceChannelId.eq( + commerceChannelId + ).and( + CommerceChannelRelTable.INSTANCE.classNameId.eq( + _classNameLocalService.getClassNameId( + CommerceCurrency.class.getName())) + ).and( + () -> { + if (Validator.isNull(name)) { + return null; + } + + return DSLFunctionFactoryUtil.lower( + CommerceCurrencyTable.INSTANCE.name + ).like( + StringPool.PERCENT + StringUtil.toLowerCase(name) + + StringPool.PERCENT + ); + } + ) + )); + } + + private void _reindexCommerceChannelRels(long commerceCurrencyId) { + Indexer indexer = + IndexerRegistryUtil.nullSafeGetIndexer(CommerceCurrency.class); + + try { + indexer.reindex( + CommerceCurrency.class.getName(), commerceCurrencyId); + } + catch (PortalException portalException) { + throw new SystemException(portalException); + } + } + @Reference private ClassNameLocalService _classNameLocalService; + @Reference + private CommerceCurrencyLocalService _commerceCurrencyLocalService; + @Reference private CountryLocalService _countryLocalService; diff --git a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelServiceImpl.java b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelServiceImpl.java index 130bee3fc18e37..02f0bbfdb9d573 100644 --- a/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelServiceImpl.java +++ b/modules/apps/commerce/commerce-product-service/src/main/java/com/liferay/commerce/product/service/impl/CommerceChannelRelServiceImpl.java @@ -204,6 +204,32 @@ public int getCommerceChannelRelsCount( className, classPK, name, true); } + @Override + public List getCommerceCurrencyCommerceChannelRels( + long commerceChannelId, String name, int start, int end) + throws PortalException { + + _commerceChannelModelResourcePermission.check( + getPermissionChecker(), commerceChannelId, ActionKeys.VIEW); + + return commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRels( + commerceChannelId, name, start, end); + } + + @Override + public int getCommerceCurrencyCommerceChannelRelsCount( + long commerceChannelId, String name) + throws PortalException { + + _commerceChannelModelResourcePermission.check( + getPermissionChecker(), commerceChannelId, ActionKeys.VIEW); + + return commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRelsCount( + commerceChannelId, name); + } + @Reference( target = "(model.class.name=com.liferay.commerce.product.model.CommerceChannel)" ) diff --git a/modules/apps/commerce/commerce-product-test/src/testIntegration/java/com/liferay/commerce/product/service/test/CommerceChannelRelLocalServiceTest.java b/modules/apps/commerce/commerce-product-test/src/testIntegration/java/com/liferay/commerce/product/service/test/CommerceChannelRelLocalServiceTest.java index 01d939aac614d0..b557906c51bc10 100644 --- a/modules/apps/commerce/commerce-product-test/src/testIntegration/java/com/liferay/commerce/product/service/test/CommerceChannelRelLocalServiceTest.java +++ b/modules/apps/commerce/commerce-product-test/src/testIntegration/java/com/liferay/commerce/product/service/test/CommerceChannelRelLocalServiceTest.java @@ -8,6 +8,7 @@ import com.liferay.account.constants.AccountConstants; import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.service.CommerceCurrencyLocalService; import com.liferay.commerce.currency.test.util.CommerceCurrencyTestUtil; import com.liferay.commerce.product.constants.CommerceChannelConstants; import com.liferay.commerce.product.model.CPDefinition; @@ -36,6 +37,7 @@ import com.liferay.portal.kernel.test.util.ServiceContextTestUtil; import com.liferay.portal.kernel.test.util.UserTestUtil; import com.liferay.portal.kernel.util.LocaleUtil; +import com.liferay.portal.test.rule.FeatureFlags; import com.liferay.portal.test.rule.Inject; import com.liferay.portal.test.rule.LiferayIntegrationTestRule; import com.liferay.portal.test.rule.PermissionCheckerMethodTestRule; @@ -136,6 +138,51 @@ public void testAddProductVisibility() throws Exception { "Channel Test")); } + @FeatureFlags("LPD-34908") + @Test + public void testCommerceChannelCommerceCurrencyVisibility() + throws Exception { + + List commerceCurrencies = + _commerceCurrencyLocalService.getCommerceCurrencies( + QueryUtil.ALL_POS, QueryUtil.ALL_POS); + + int commerceChannelCommerceCurrenciesCount = + _commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRelsCount( + _commerceChannel1.getCommerceChannelId(), StringPool.BLANK); + + CommerceChannelRel commerceChannelRel = + _commerceChannelRelLocalService.addCommerceChannelRel( + CommerceCurrency.class.getName(), + commerceCurrencies.get( + 1 + ).getCommerceCurrencyId(), + _commerceChannel1.getCommerceChannelId(), _serviceContext); + + _commerceChannelRelLocalService.addCommerceChannelRel( + CommerceCurrency.class.getName(), + commerceCurrencies.get( + 2 + ).getCommerceCurrencyId(), + _commerceChannel1.getCommerceChannelId(), _serviceContext); + + Assert.assertEquals( + _commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRelsCount( + _commerceChannel1.getCommerceChannelId(), StringPool.BLANK), + commerceChannelCommerceCurrenciesCount + 2); + + _commerceChannelRelLocalService.deleteCommerceChannelRel( + commerceChannelRel.getCommerceChannelRelId()); + + Assert.assertEquals( + _commerceChannelRelLocalService. + getCommerceCurrencyCommerceChannelRelsCount( + _commerceChannel1.getCommerceChannelId(), StringPool.BLANK), + commerceChannelCommerceCurrenciesCount + 1); + } + @Test public void testCommerceChannelCountryVisibility() throws Exception { Country country1 = _countryLocalService.getCountryByA2( @@ -188,6 +235,9 @@ public void testCommerceChannelCountryVisibility() throws Exception { private CommerceCurrency _commerceCurrency; + @Inject + private CommerceCurrencyLocalService _commerceCurrencyLocalService; + @Inject private CountryLocalService _countryLocalService; diff --git a/modules/apps/commerce/commerce-service/src/main/java/com/liferay/commerce/internal/order/CommerceOrderHttpHelperImpl.java b/modules/apps/commerce/commerce-service/src/main/java/com/liferay/commerce/internal/order/CommerceOrderHttpHelperImpl.java index 725c9ca57694de..89e134add03011 100644 --- a/modules/apps/commerce/commerce-service/src/main/java/com/liferay/commerce/internal/order/CommerceOrderHttpHelperImpl.java +++ b/modules/apps/commerce/commerce-service/src/main/java/com/liferay/commerce/internal/order/CommerceOrderHttpHelperImpl.java @@ -68,8 +68,10 @@ import com.liferay.portal.kernel.settings.GroupServiceSettingsLocator; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.GetterUtil; +import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Portal; +import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.ResourceBundleUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; @@ -177,6 +179,35 @@ public CommerceOrder fetchCommerceOrderByUuidAndGroupId( uuid, groupId); } + public String getCommerceCartBaseURL(HttpServletRequest httpServletRequest) + throws PortalException { + + if (hasCommerceOrderPortlet( + httpServletRequest, + CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT)) { + + long plid = PortalUtil.getPlidFromPortletId( + PortalUtil.getScopeGroupId(httpServletRequest), + CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT); + + return PortletURLBuilder.create( + _portletURLFactory.create( + httpServletRequest, + CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT, plid, + PortletRequest.RENDER_PHASE) + ).setMVCRenderCommandName( + "/commerce_open_order_content/edit_commerce_order" + ).setBackURL( + ParamUtil.getString(httpServletRequest, "backURL") + ).buildString(); + } + + return HtmlUtil.escape( + CommerceOrderInfoItemUtil.getCommerceOrderFriendlyURL( + _friendlyURLSeparatorProviderSnapshot.get(), + httpServletRequest)); + } + @Override public String getCommerceCartPortletURL( HttpServletRequest httpServletRequest) @@ -539,6 +570,28 @@ public CommerceOrder getCurrentCommerceOrder( return commerceOrder; } + @Override + public boolean hasCommerceOrderPortlet( + HttpServletRequest httpServletRequest, String portletKey) + throws PortalException { + + if (portletKey.equals( + CommercePortletKeys.COMMERCE_OPEN_ORDER_CONTENT) || + portletKey.equals(CommercePortletKeys.COMMERCE_ORDER_CONTENT) || + portletKey.equals(CommercePortletKeys.COMMERCE_CART_CONTENT)) { + + long groupId = _portal.getScopeGroupId(httpServletRequest); + + if (_portal.getPlidFromPortletId(groupId, portletKey) > 0) { + return true; + } + + return false; + } + + return false; + } + @Override public boolean isGuestCheckoutEnabled(HttpServletRequest httpServletRequest) throws PortalException { diff --git a/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/fragments/group/commerce/fragments/header-user/index.html b/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/fragments/group/commerce/fragments/header-user/index.html index 646ecbc326e22a..f04f22c28d849c 100644 --- a/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/fragments/group/commerce/fragments/header-user/index.html +++ b/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/fragments/group/commerce/fragments/header-user/index.html @@ -61,19 +61,7 @@ [#if configuration.showCurrencyMenu]
- - - +
[/#if] diff --git a/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/layout-page-templates/master-pages/commerce-classic-master/page-definition.json b/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/layout-page-templates/master-pages/commerce-classic-master/page-definition.json index ea3a7500aa0238..7979f38c853545 100644 --- a/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/layout-page-templates/master-pages/commerce-classic-master/page-definition.json +++ b/modules/apps/commerce/commerce-site-initializer/commerce-site-initializer/src/main/resources/site-initializer/layout-page-templates/master-pages/commerce-classic-master/page-definition.json @@ -31,13 +31,36 @@ }, "fragmentConfig": { "showAccountMenu": true, - "showCurrencyMenu": false, + "showCurrencyMenu": true, "showLanguageMenu": true }, "fragmentFields": [ ], "indexed": true }, + "pageElements": [ + { + "definition": { + "fragmentDropZoneId": "1" + }, + "pageElements": [ + { + "definition": { + "fragment": { + "key": "com.liferay.commerce.currency.web.internal.fragment.renderer.CurrencySelectorFragmentRenderer" + }, + "fragmentConfig": { + }, + "fragmentFields": [ + ], + "indexed": true + }, + "type": "Fragment" + } + ], + "type": "FragmentDropZone" + } + ], "type": "Fragment" }, { diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/bnd.bnd b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/bnd.bnd index dfe8658bfe183f..f4aeaf1a31431a 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/bnd.bnd +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/bnd.bnd @@ -1,6 +1,6 @@ Bundle-Name: Liferay Headless Commerce Delivery Catalog API Bundle-SymbolicName: com.liferay.headless.commerce.delivery.catalog.api -Bundle-Version: 22.1.1 +Bundle-Version: 22.2.0 Export-Package:\ com.liferay.headless.commerce.delivery.catalog.dto.v1_0,\ com.liferay.headless.commerce.delivery.catalog.dto.v1_0.converter,\ diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/Currency.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/Currency.java new file mode 100644 index 00000000000000..932b65c34872c0 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/Currency.java @@ -0,0 +1,956 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.dto.v1_0; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonValue; + +import com.liferay.petra.function.UnsafeSupplier; +import com.liferay.petra.string.StringBundler; +import com.liferay.portal.kernel.util.StringUtil; +import com.liferay.portal.vulcan.graphql.annotation.GraphQLField; +import com.liferay.portal.vulcan.graphql.annotation.GraphQLName; +import com.liferay.portal.vulcan.util.ObjectMapperUtil; + +import io.swagger.v3.oas.annotations.media.Schema; + +import java.io.Serializable; + +import java.math.BigDecimal; + +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Supplier; + +import javax.annotation.Generated; + +import javax.validation.Valid; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +@GraphQLName("Currency") +@JsonFilter("Liferay.Vulcan") +@Schema(requiredProperties = {"code", "name"}) +@XmlRootElement(name = "Currency") +public class Currency implements Serializable { + + public static Currency toDTO(String json) { + return ObjectMapperUtil.readValue(Currency.class, json); + } + + public static Currency unsafeToDTO(String json) { + return ObjectMapperUtil.unsafeReadValue(Currency.class, json); + } + + @Schema(example = "true") + public Boolean getActive() { + if (_activeSupplier != null) { + active = _activeSupplier.get(); + + _activeSupplier = null; + } + + return active; + } + + public void setActive(Boolean active) { + this.active = active; + + _activeSupplier = null; + } + + @JsonIgnore + public void setActive( + UnsafeSupplier activeUnsafeSupplier) { + + _activeSupplier = () -> { + try { + return activeUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Boolean active; + + @JsonIgnore + private Supplier _activeSupplier; + + @Schema(example = "USD") + public String getCode() { + if (_codeSupplier != null) { + code = _codeSupplier.get(); + + _codeSupplier = null; + } + + return code; + } + + public void setCode(String code) { + this.code = code; + + _codeSupplier = null; + } + + @JsonIgnore + public void setCode(UnsafeSupplier codeUnsafeSupplier) { + _codeSupplier = () -> { + try { + return codeUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + @NotEmpty + protected String code; + + @JsonIgnore + private Supplier _codeSupplier; + + @Schema(example = "AB-34098-789-N") + public String getExternalReferenceCode() { + if (_externalReferenceCodeSupplier != null) { + externalReferenceCode = _externalReferenceCodeSupplier.get(); + + _externalReferenceCodeSupplier = null; + } + + return externalReferenceCode; + } + + public void setExternalReferenceCode(String externalReferenceCode) { + this.externalReferenceCode = externalReferenceCode; + + _externalReferenceCodeSupplier = null; + } + + @JsonIgnore + public void setExternalReferenceCode( + UnsafeSupplier externalReferenceCodeUnsafeSupplier) { + + _externalReferenceCodeSupplier = () -> { + try { + return externalReferenceCodeUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected String externalReferenceCode; + + @JsonIgnore + private Supplier _externalReferenceCodeSupplier; + + @Schema( + example = "{en_US=Hand Saw, hr_HR=Product Name HR, hu_HU=Product Name HU}" + ) + @Valid + public Map getFormatPattern() { + if (_formatPatternSupplier != null) { + formatPattern = _formatPatternSupplier.get(); + + _formatPatternSupplier = null; + } + + return formatPattern; + } + + public void setFormatPattern(Map formatPattern) { + this.formatPattern = formatPattern; + + _formatPatternSupplier = null; + } + + @JsonIgnore + public void setFormatPattern( + UnsafeSupplier, Exception> + formatPatternUnsafeSupplier) { + + _formatPatternSupplier = () -> { + try { + return formatPatternUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Map formatPattern; + + @JsonIgnore + private Supplier> _formatPatternSupplier; + + @DecimalMin("0") + @Schema(example = "30130") + public Long getId() { + if (_idSupplier != null) { + id = _idSupplier.get(); + + _idSupplier = null; + } + + return id; + } + + public void setId(Long id) { + this.id = id; + + _idSupplier = null; + } + + @JsonIgnore + public void setId(UnsafeSupplier idUnsafeSupplier) { + _idSupplier = () -> { + try { + return idUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Long id; + + @JsonIgnore + private Supplier _idSupplier; + + @DecimalMin("0") + @Schema + public Integer getMaxFractionDigits() { + if (_maxFractionDigitsSupplier != null) { + maxFractionDigits = _maxFractionDigitsSupplier.get(); + + _maxFractionDigitsSupplier = null; + } + + return maxFractionDigits; + } + + public void setMaxFractionDigits(Integer maxFractionDigits) { + this.maxFractionDigits = maxFractionDigits; + + _maxFractionDigitsSupplier = null; + } + + @JsonIgnore + public void setMaxFractionDigits( + UnsafeSupplier maxFractionDigitsUnsafeSupplier) { + + _maxFractionDigitsSupplier = () -> { + try { + return maxFractionDigitsUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Integer maxFractionDigits; + + @JsonIgnore + private Supplier _maxFractionDigitsSupplier; + + @DecimalMin("0") + @Schema + public Integer getMinFractionDigits() { + if (_minFractionDigitsSupplier != null) { + minFractionDigits = _minFractionDigitsSupplier.get(); + + _minFractionDigitsSupplier = null; + } + + return minFractionDigits; + } + + public void setMinFractionDigits(Integer minFractionDigits) { + this.minFractionDigits = minFractionDigits; + + _minFractionDigitsSupplier = null; + } + + @JsonIgnore + public void setMinFractionDigits( + UnsafeSupplier minFractionDigitsUnsafeSupplier) { + + _minFractionDigitsSupplier = () -> { + try { + return minFractionDigitsUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Integer minFractionDigits; + + @JsonIgnore + private Supplier _minFractionDigitsSupplier; + + @Schema( + example = "{en_US=Hand Saw, hr_HR=Product Name HR, hu_HU=Product Name HU}" + ) + @Valid + public Map getName() { + if (_nameSupplier != null) { + name = _nameSupplier.get(); + + _nameSupplier = null; + } + + return name; + } + + public void setName(Map name) { + this.name = name; + + _nameSupplier = null; + } + + @JsonIgnore + public void setName( + UnsafeSupplier, Exception> nameUnsafeSupplier) { + + _nameSupplier = () -> { + try { + return nameUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + @NotNull + protected Map name; + + @JsonIgnore + private Supplier> _nameSupplier; + + @Schema(example = "true") + public Boolean getPrimary() { + if (_primarySupplier != null) { + primary = _primarySupplier.get(); + + _primarySupplier = null; + } + + return primary; + } + + public void setPrimary(Boolean primary) { + this.primary = primary; + + _primarySupplier = null; + } + + @JsonIgnore + public void setPrimary( + UnsafeSupplier primaryUnsafeSupplier) { + + _primarySupplier = () -> { + try { + return primaryUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Boolean primary; + + @JsonIgnore + private Supplier _primarySupplier; + + @Schema(example = "1.2") + public Double getPriority() { + if (_prioritySupplier != null) { + priority = _prioritySupplier.get(); + + _prioritySupplier = null; + } + + return priority; + } + + public void setPriority(Double priority) { + this.priority = priority; + + _prioritySupplier = null; + } + + @JsonIgnore + public void setPriority( + UnsafeSupplier priorityUnsafeSupplier) { + + _prioritySupplier = () -> { + try { + return priorityUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected Double priority; + + @JsonIgnore + private Supplier _prioritySupplier; + + @Schema(example = "33.54") + @Valid + public BigDecimal getRate() { + if (_rateSupplier != null) { + rate = _rateSupplier.get(); + + _rateSupplier = null; + } + + return rate; + } + + public void setRate(BigDecimal rate) { + this.rate = rate; + + _rateSupplier = null; + } + + @JsonIgnore + public void setRate( + UnsafeSupplier rateUnsafeSupplier) { + + _rateSupplier = () -> { + try { + return rateUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected BigDecimal rate; + + @JsonIgnore + private Supplier _rateSupplier; + + @JsonGetter("roundingMode") + @Schema(example = "HALF_EVEN") + @Valid + public RoundingMode getRoundingMode() { + if (_roundingModeSupplier != null) { + roundingMode = _roundingModeSupplier.get(); + + _roundingModeSupplier = null; + } + + return roundingMode; + } + + @JsonIgnore + public String getRoundingModeAsString() { + RoundingMode roundingMode = getRoundingMode(); + + if (roundingMode == null) { + return null; + } + + return roundingMode.toString(); + } + + public void setRoundingMode(RoundingMode roundingMode) { + this.roundingMode = roundingMode; + + _roundingModeSupplier = null; + } + + @JsonIgnore + public void setRoundingMode( + UnsafeSupplier roundingModeUnsafeSupplier) { + + _roundingModeSupplier = () -> { + try { + return roundingModeUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected RoundingMode roundingMode; + + @JsonIgnore + private Supplier _roundingModeSupplier; + + @Schema(example = "$") + public String getSymbol() { + if (_symbolSupplier != null) { + symbol = _symbolSupplier.get(); + + _symbolSupplier = null; + } + + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + + _symbolSupplier = null; + } + + @JsonIgnore + public void setSymbol( + UnsafeSupplier symbolUnsafeSupplier) { + + _symbolSupplier = () -> { + try { + return symbolUnsafeSupplier.get(); + } + catch (RuntimeException runtimeException) { + throw runtimeException; + } + catch (Exception exception) { + throw new RuntimeException(exception); + } + }; + } + + @GraphQLField + @JsonProperty(access = JsonProperty.Access.READ_WRITE) + protected String symbol; + + @JsonIgnore + private Supplier _symbolSupplier; + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (!(object instanceof Currency)) { + return false; + } + + Currency currency = (Currency)object; + + return Objects.equals(toString(), currency.toString()); + } + + @Override + public int hashCode() { + String string = toString(); + + return string.hashCode(); + } + + public String toString() { + StringBundler sb = new StringBundler(); + + sb.append("{"); + + Boolean active = getActive(); + + if (active != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"active\": "); + + sb.append(active); + } + + String code = getCode(); + + if (code != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"code\": "); + + sb.append("\""); + + sb.append(_escape(code)); + + sb.append("\""); + } + + String externalReferenceCode = getExternalReferenceCode(); + + if (externalReferenceCode != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"externalReferenceCode\": "); + + sb.append("\""); + + sb.append(_escape(externalReferenceCode)); + + sb.append("\""); + } + + Map formatPattern = getFormatPattern(); + + if (formatPattern != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"formatPattern\": "); + + sb.append(_toJSON(formatPattern)); + } + + Long id = getId(); + + if (id != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"id\": "); + + sb.append(id); + } + + Integer maxFractionDigits = getMaxFractionDigits(); + + if (maxFractionDigits != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"maxFractionDigits\": "); + + sb.append(maxFractionDigits); + } + + Integer minFractionDigits = getMinFractionDigits(); + + if (minFractionDigits != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"minFractionDigits\": "); + + sb.append(minFractionDigits); + } + + Map name = getName(); + + if (name != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"name\": "); + + sb.append(_toJSON(name)); + } + + Boolean primary = getPrimary(); + + if (primary != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"primary\": "); + + sb.append(primary); + } + + Double priority = getPriority(); + + if (priority != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"priority\": "); + + sb.append(priority); + } + + BigDecimal rate = getRate(); + + if (rate != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"rate\": "); + + sb.append(rate); + } + + RoundingMode roundingMode = getRoundingMode(); + + if (roundingMode != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"roundingMode\": "); + + sb.append("\""); + + sb.append(roundingMode); + + sb.append("\""); + } + + String symbol = getSymbol(); + + if (symbol != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"symbol\": "); + + sb.append("\""); + + sb.append(_escape(symbol)); + + sb.append("\""); + } + + sb.append("}"); + + return sb.toString(); + } + + @Schema( + accessMode = Schema.AccessMode.READ_ONLY, + defaultValue = "com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency", + name = "x-class-name" + ) + public String xClassName; + + @GraphQLName("RoundingMode") + public static enum RoundingMode { + + UP("UP"), DOWN("DOWN"), CEILING("CEILING"), FLOOR("FLOOR"), + HALF_UP("HALF_UP"), HALF_DOWN("HALF_DOWN"), HALF_EVEN("HALF_EVEN"), + UNNECESSARY("UNNECESSARY"); + + @JsonCreator + public static RoundingMode create(String value) { + if ((value == null) || value.equals("")) { + return null; + } + + for (RoundingMode roundingMode : values()) { + if (Objects.equals(roundingMode.getValue(), value)) { + return roundingMode; + } + } + + throw new IllegalArgumentException("Invalid enum value: " + value); + } + + @JsonValue + public String getValue() { + return _value; + } + + @Override + public String toString() { + return _value; + } + + private RoundingMode(String value) { + _value = value; + } + + private final String _value; + + } + + private static String _escape(Object object) { + return StringUtil.replace( + String.valueOf(object), _JSON_ESCAPE_STRINGS[0], + _JSON_ESCAPE_STRINGS[1]); + } + + private static boolean _isArray(Object value) { + if (value == null) { + return false; + } + + Class clazz = value.getClass(); + + return clazz.isArray(); + } + + private static String _toJSON(Map map) { + StringBuilder sb = new StringBuilder("{"); + + @SuppressWarnings("unchecked") + Set set = map.entrySet(); + + @SuppressWarnings("unchecked") + Iterator> iterator = set.iterator(); + + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + + sb.append("\""); + sb.append(_escape(entry.getKey())); + sb.append("\": "); + + Object value = entry.getValue(); + + if (_isArray(value)) { + sb.append("["); + + Object[] valueArray = (Object[])value; + + for (int i = 0; i < valueArray.length; i++) { + if (valueArray[i] instanceof Map) { + sb.append(_toJSON((Map)valueArray[i])); + } + else if (valueArray[i] instanceof String) { + sb.append("\""); + sb.append(valueArray[i]); + sb.append("\""); + } + else { + sb.append(valueArray[i]); + } + + if ((i + 1) < valueArray.length) { + sb.append(", "); + } + } + + sb.append("]"); + } + else if (value instanceof Map) { + sb.append(_toJSON((Map)value)); + } + else if (value instanceof String) { + sb.append("\""); + sb.append(_escape(value)); + sb.append("\""); + } + else { + sb.append(value); + } + + if (iterator.hasNext()) { + sb.append(", "); + } + } + + sb.append("}"); + + return sb.toString(); + } + + private static final String[][] _JSON_ESCAPE_STRINGS = { + {"\\", "\"", "\b", "\f", "\n", "\r", "\t"}, + {"\\\\", "\\\"", "\\b", "\\f", "\\n", "\\r", "\\t"} + }; + + private Map _extendedProperties; + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/CurrencyResource.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/CurrencyResource.java new file mode 100644 index 00000000000000..5e10ac118ee3a7 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/CurrencyResource.java @@ -0,0 +1,150 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.resource.v1_0; + +import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency; +import com.liferay.portal.kernel.search.Sort; +import com.liferay.portal.kernel.search.filter.Filter; +import com.liferay.portal.kernel.service.GroupLocalService; +import com.liferay.portal.kernel.service.ResourceActionLocalService; +import com.liferay.portal.kernel.service.ResourcePermissionLocalService; +import com.liferay.portal.kernel.service.RoleLocalService; +import com.liferay.portal.odata.filter.ExpressionConvert; +import com.liferay.portal.odata.filter.FilterParserProvider; +import com.liferay.portal.odata.sort.SortParserProvider; +import com.liferay.portal.vulcan.accept.language.AcceptLanguage; +import com.liferay.portal.vulcan.batch.engine.resource.VulcanBatchEngineExportTaskResource; +import com.liferay.portal.vulcan.batch.engine.resource.VulcanBatchEngineImportTaskResource; +import com.liferay.portal.vulcan.pagination.Page; +import com.liferay.portal.vulcan.pagination.Pagination; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import javax.annotation.Generated; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import javax.ws.rs.core.UriInfo; + +import org.osgi.annotation.versioning.ProviderType; + +/** + * To access this resource, run: + * + * curl -u your@email.com:yourpassword -D - http://localhost:8080/o/headless-commerce-delivery-catalog/v1.0 + * + * @author Andrea Sbarra + * @generated + */ +@Generated("") +@ProviderType +public interface CurrencyResource { + + public Page getChannelByExternalReferenceCodeCurrenciesPage( + String externalReferenceCode, String search, Filter filter, + Pagination pagination, Sort[] sorts) + throws Exception; + + public Page getChannelCurrenciesPage( + Long channelId, String search, Filter filter, Pagination pagination, + Sort[] sorts) + throws Exception; + + public default void setContextAcceptLanguage( + AcceptLanguage contextAcceptLanguage) { + } + + public void setContextCompany( + com.liferay.portal.kernel.model.Company contextCompany); + + public default void setContextHttpServletRequest( + HttpServletRequest contextHttpServletRequest) { + } + + public default void setContextHttpServletResponse( + HttpServletResponse contextHttpServletResponse) { + } + + public default void setContextUriInfo(UriInfo contextUriInfo) { + } + + public void setContextUser( + com.liferay.portal.kernel.model.User contextUser); + + public void setExpressionConvert( + ExpressionConvert expressionConvert); + + public void setFilterParserProvider( + FilterParserProvider filterParserProvider); + + public void setGroupLocalService(GroupLocalService groupLocalService); + + public void setResourceActionLocalService( + ResourceActionLocalService resourceActionLocalService); + + public void setResourcePermissionLocalService( + ResourcePermissionLocalService resourcePermissionLocalService); + + public void setRoleLocalService(RoleLocalService roleLocalService); + + public void setSortParserProvider(SortParserProvider sortParserProvider); + + public void setVulcanBatchEngineExportTaskResource( + VulcanBatchEngineExportTaskResource + vulcanBatchEngineExportTaskResource); + + public void setVulcanBatchEngineImportTaskResource( + VulcanBatchEngineImportTaskResource + vulcanBatchEngineImportTaskResource); + + public default Filter toFilter(String filterString) { + return toFilter( + filterString, Collections.>emptyMap()); + } + + public default Filter toFilter( + String filterString, Map> multivaluedMap) { + + return null; + } + + public default Sort[] toSorts(String sortsString) { + return new Sort[0]; + } + + @ProviderType + public interface Builder { + + public CurrencyResource build(); + + public Builder checkPermissions(boolean checkPermissions); + + public Builder httpServletRequest( + HttpServletRequest httpServletRequest); + + public Builder httpServletResponse( + HttpServletResponse httpServletResponse); + + public Builder preferredLocale(Locale preferredLocale); + + public Builder uriInfo(UriInfo uriInfo); + + public Builder user(com.liferay.portal.kernel.model.User user); + + } + + @ProviderType + public interface Factory { + + public Builder create(); + + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/packageinfo b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/packageinfo index c040e1ca567e3d..4ca40605736141 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/packageinfo +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/dto/v1_0/packageinfo @@ -1 +1 @@ -version 6.11.0 \ No newline at end of file +version 6.12.0 \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/packageinfo b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/packageinfo index a2ba609bf193ba..7398bac75c7cdd 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/packageinfo +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-api/src/main/resources/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/packageinfo @@ -1 +1 @@ -version 8.1.0 \ No newline at end of file +version 8.2.0 \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/dto/v1_0/Currency.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/dto/v1_0/Currency.java new file mode 100644 index 00000000000000..f0d43e0dd863a8 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/dto/v1_0/Currency.java @@ -0,0 +1,375 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.client.dto.v1_0; + +import com.liferay.headless.commerce.delivery.catalog.client.function.UnsafeSupplier; +import com.liferay.headless.commerce.delivery.catalog.client.serdes.v1_0.CurrencySerDes; + +import java.io.Serializable; + +import java.math.BigDecimal; + +import java.util.Map; +import java.util.Objects; + +import javax.annotation.Generated; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +public class Currency implements Cloneable, Serializable { + + public static Currency toDTO(String json) { + return CurrencySerDes.toDTO(json); + } + + public Boolean getActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } + + public void setActive( + UnsafeSupplier activeUnsafeSupplier) { + + try { + active = activeUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Boolean active; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public void setCode(UnsafeSupplier codeUnsafeSupplier) { + try { + code = codeUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected String code; + + public String getExternalReferenceCode() { + return externalReferenceCode; + } + + public void setExternalReferenceCode(String externalReferenceCode) { + this.externalReferenceCode = externalReferenceCode; + } + + public void setExternalReferenceCode( + UnsafeSupplier externalReferenceCodeUnsafeSupplier) { + + try { + externalReferenceCode = externalReferenceCodeUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected String externalReferenceCode; + + public Map getFormatPattern() { + return formatPattern; + } + + public void setFormatPattern(Map formatPattern) { + this.formatPattern = formatPattern; + } + + public void setFormatPattern( + UnsafeSupplier, Exception> + formatPatternUnsafeSupplier) { + + try { + formatPattern = formatPatternUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Map formatPattern; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public void setId(UnsafeSupplier idUnsafeSupplier) { + try { + id = idUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Long id; + + public Integer getMaxFractionDigits() { + return maxFractionDigits; + } + + public void setMaxFractionDigits(Integer maxFractionDigits) { + this.maxFractionDigits = maxFractionDigits; + } + + public void setMaxFractionDigits( + UnsafeSupplier maxFractionDigitsUnsafeSupplier) { + + try { + maxFractionDigits = maxFractionDigitsUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Integer maxFractionDigits; + + public Integer getMinFractionDigits() { + return minFractionDigits; + } + + public void setMinFractionDigits(Integer minFractionDigits) { + this.minFractionDigits = minFractionDigits; + } + + public void setMinFractionDigits( + UnsafeSupplier minFractionDigitsUnsafeSupplier) { + + try { + minFractionDigits = minFractionDigitsUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Integer minFractionDigits; + + public Map getName() { + return name; + } + + public void setName(Map name) { + this.name = name; + } + + public void setName( + UnsafeSupplier, Exception> nameUnsafeSupplier) { + + try { + name = nameUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Map name; + + public Boolean getPrimary() { + return primary; + } + + public void setPrimary(Boolean primary) { + this.primary = primary; + } + + public void setPrimary( + UnsafeSupplier primaryUnsafeSupplier) { + + try { + primary = primaryUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Boolean primary; + + public Double getPriority() { + return priority; + } + + public void setPriority(Double priority) { + this.priority = priority; + } + + public void setPriority( + UnsafeSupplier priorityUnsafeSupplier) { + + try { + priority = priorityUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected Double priority; + + public BigDecimal getRate() { + return rate; + } + + public void setRate(BigDecimal rate) { + this.rate = rate; + } + + public void setRate( + UnsafeSupplier rateUnsafeSupplier) { + + try { + rate = rateUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected BigDecimal rate; + + public RoundingMode getRoundingMode() { + return roundingMode; + } + + public String getRoundingModeAsString() { + if (roundingMode == null) { + return null; + } + + return roundingMode.toString(); + } + + public void setRoundingMode(RoundingMode roundingMode) { + this.roundingMode = roundingMode; + } + + public void setRoundingMode( + UnsafeSupplier roundingModeUnsafeSupplier) { + + try { + roundingMode = roundingModeUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected RoundingMode roundingMode; + + public String getSymbol() { + return symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public void setSymbol( + UnsafeSupplier symbolUnsafeSupplier) { + + try { + symbol = symbolUnsafeSupplier.get(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected String symbol; + + @Override + public Currency clone() throws CloneNotSupportedException { + return (Currency)super.clone(); + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (!(object instanceof Currency)) { + return false; + } + + Currency currency = (Currency)object; + + return Objects.equals(toString(), currency.toString()); + } + + @Override + public int hashCode() { + String string = toString(); + + return string.hashCode(); + } + + public String toString() { + return CurrencySerDes.toJSON(this); + } + + public static enum RoundingMode { + + UP("UP"), DOWN("DOWN"), CEILING("CEILING"), FLOOR("FLOOR"), + HALF_UP("HALF_UP"), HALF_DOWN("HALF_DOWN"), HALF_EVEN("HALF_EVEN"), + UNNECESSARY("UNNECESSARY"); + + public static RoundingMode create(String value) { + for (RoundingMode roundingMode : values()) { + if (Objects.equals(roundingMode.getValue(), value) || + Objects.equals(roundingMode.name(), value)) { + + return roundingMode; + } + } + + return null; + } + + public String getValue() { + return _value; + } + + @Override + public String toString() { + return _value; + } + + private RoundingMode(String value) { + _value = value; + } + + private final String _value; + + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/resource/v1_0/CurrencyResource.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/resource/v1_0/CurrencyResource.java new file mode 100644 index 00000000000000..47eaa330084c2d --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/resource/v1_0/CurrencyResource.java @@ -0,0 +1,432 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.client.resource.v1_0; + +import com.liferay.headless.commerce.delivery.catalog.client.dto.v1_0.Currency; +import com.liferay.headless.commerce.delivery.catalog.client.http.HttpInvoker; +import com.liferay.headless.commerce.delivery.catalog.client.pagination.Page; +import com.liferay.headless.commerce.delivery.catalog.client.pagination.Pagination; +import com.liferay.headless.commerce.delivery.catalog.client.problem.Problem; +import com.liferay.headless.commerce.delivery.catalog.client.serdes.v1_0.CurrencySerDes; + +import java.net.URL; + +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.annotation.Generated; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +public interface CurrencyResource { + + public static Builder builder() { + return new Builder(); + } + + public Page getChannelByExternalReferenceCodeCurrenciesPage( + String externalReferenceCode, String search, String filterString, + Pagination pagination, String sortString) + throws Exception; + + public HttpInvoker.HttpResponse + getChannelByExternalReferenceCodeCurrenciesPageHttpResponse( + String externalReferenceCode, String search, + String filterString, Pagination pagination, String sortString) + throws Exception; + + public Page getChannelCurrenciesPage( + Long channelId, String search, String filterString, + Pagination pagination, String sortString) + throws Exception; + + public HttpInvoker.HttpResponse getChannelCurrenciesPageHttpResponse( + Long channelId, String search, String filterString, + Pagination pagination, String sortString) + throws Exception; + + public static class Builder { + + public Builder authentication(String login, String password) { + _login = login; + _password = password; + + return this; + } + + public Builder bearerToken(String token) { + return header("Authorization", "Bearer " + token); + } + + public CurrencyResource build() { + return new CurrencyResourceImpl(this); + } + + public Builder contextPath(String contextPath) { + _contextPath = contextPath; + + return this; + } + + public Builder endpoint(String address, String scheme) { + String[] addressParts = address.split(":"); + + String host = addressParts[0]; + + int port = 443; + + if (addressParts.length > 1) { + String portString = addressParts[1]; + + try { + port = Integer.parseInt(portString); + } + catch (NumberFormatException numberFormatException) { + throw new IllegalArgumentException( + "Unable to parse port from " + portString); + } + } + + return endpoint(host, port, scheme); + } + + public Builder endpoint(String host, int port, String scheme) { + _host = host; + _port = port; + _scheme = scheme; + + return this; + } + + public Builder endpoint(URL url) { + return endpoint(url.getHost(), url.getPort(), url.getProtocol()); + } + + public Builder header(String key, String value) { + _headers.put(key, value); + + return this; + } + + public Builder locale(Locale locale) { + _locale = locale; + + return this; + } + + public Builder parameter(String key, String value) { + _parameters.put(key, value); + + return this; + } + + public Builder parameters(String... parameters) { + if ((parameters.length % 2) != 0) { + throw new IllegalArgumentException( + "Parameters length is not an even number"); + } + + for (int i = 0; i < parameters.length; i += 2) { + String parameterName = String.valueOf(parameters[i]); + String parameterValue = String.valueOf(parameters[i + 1]); + + _parameters.put(parameterName, parameterValue); + } + + return this; + } + + private Builder() { + } + + private String _contextPath = ""; + private Map _headers = new LinkedHashMap<>(); + private String _host = "localhost"; + private Locale _locale; + private String _login = ""; + private String _password = ""; + private Map _parameters = new LinkedHashMap<>(); + private int _port = 8080; + private String _scheme = "http"; + + } + + public static class CurrencyResourceImpl implements CurrencyResource { + + public Page getChannelByExternalReferenceCodeCurrenciesPage( + String externalReferenceCode, String search, + String filterString, Pagination pagination, String sortString) + throws Exception { + + HttpInvoker.HttpResponse httpResponse = + getChannelByExternalReferenceCodeCurrenciesPageHttpResponse( + externalReferenceCode, search, filterString, pagination, + sortString); + + String content = httpResponse.getContent(); + + if ((httpResponse.getStatusCode() / 100) != 2) { + _logger.log( + Level.WARNING, + "Unable to process HTTP response content: " + content); + _logger.log( + Level.WARNING, + "HTTP response message: " + httpResponse.getMessage()); + _logger.log( + Level.WARNING, + "HTTP response status code: " + + httpResponse.getStatusCode()); + + Problem.ProblemException problemException = null; + + if (Objects.equals( + httpResponse.getContentType(), "application/json")) { + + problemException = new Problem.ProblemException( + Problem.toDTO(content)); + } + else { + _logger.log( + Level.WARNING, + "Unable to process content type: " + + httpResponse.getContentType()); + + Problem problem = new Problem(); + + problem.setStatus( + String.valueOf(httpResponse.getStatusCode())); + + problemException = new Problem.ProblemException(problem); + } + + throw problemException; + } + else { + _logger.fine("HTTP response content: " + content); + _logger.fine( + "HTTP response message: " + httpResponse.getMessage()); + _logger.fine( + "HTTP response status code: " + + httpResponse.getStatusCode()); + } + + try { + return Page.of(content, CurrencySerDes::toDTO); + } + catch (Exception e) { + _logger.log( + Level.WARNING, + "Unable to process HTTP response: " + content, e); + + throw new Problem.ProblemException(Problem.toDTO(content)); + } + } + + public HttpInvoker.HttpResponse + getChannelByExternalReferenceCodeCurrenciesPageHttpResponse( + String externalReferenceCode, String search, + String filterString, Pagination pagination, + String sortString) + throws Exception { + + HttpInvoker httpInvoker = HttpInvoker.newHttpInvoker(); + + if (_builder._locale != null) { + httpInvoker.header( + "Accept-Language", _builder._locale.toLanguageTag()); + } + + for (Map.Entry entry : + _builder._headers.entrySet()) { + + httpInvoker.header(entry.getKey(), entry.getValue()); + } + + for (Map.Entry entry : + _builder._parameters.entrySet()) { + + httpInvoker.parameter(entry.getKey(), entry.getValue()); + } + + httpInvoker.httpMethod(HttpInvoker.HttpMethod.GET); + + if (search != null) { + httpInvoker.parameter("search", String.valueOf(search)); + } + + if (filterString != null) { + httpInvoker.parameter("filter", filterString); + } + + if (pagination != null) { + httpInvoker.parameter( + "page", String.valueOf(pagination.getPage())); + httpInvoker.parameter( + "pageSize", String.valueOf(pagination.getPageSize())); + } + + if (sortString != null) { + httpInvoker.parameter("sort", sortString); + } + + httpInvoker.path( + _builder._scheme + "://" + _builder._host + ":" + + _builder._port + _builder._contextPath + + "/o/headless-commerce-delivery-catalog/v1.0/channels/by-externalReferenceCode/{externalReferenceCode}/currencies"); + + httpInvoker.path("externalReferenceCode", externalReferenceCode); + + httpInvoker.userNameAndPassword( + _builder._login + ":" + _builder._password); + + return httpInvoker.invoke(); + } + + public Page getChannelCurrenciesPage( + Long channelId, String search, String filterString, + Pagination pagination, String sortString) + throws Exception { + + HttpInvoker.HttpResponse httpResponse = + getChannelCurrenciesPageHttpResponse( + channelId, search, filterString, pagination, sortString); + + String content = httpResponse.getContent(); + + if ((httpResponse.getStatusCode() / 100) != 2) { + _logger.log( + Level.WARNING, + "Unable to process HTTP response content: " + content); + _logger.log( + Level.WARNING, + "HTTP response message: " + httpResponse.getMessage()); + _logger.log( + Level.WARNING, + "HTTP response status code: " + + httpResponse.getStatusCode()); + + Problem.ProblemException problemException = null; + + if (Objects.equals( + httpResponse.getContentType(), "application/json")) { + + problemException = new Problem.ProblemException( + Problem.toDTO(content)); + } + else { + _logger.log( + Level.WARNING, + "Unable to process content type: " + + httpResponse.getContentType()); + + Problem problem = new Problem(); + + problem.setStatus( + String.valueOf(httpResponse.getStatusCode())); + + problemException = new Problem.ProblemException(problem); + } + + throw problemException; + } + else { + _logger.fine("HTTP response content: " + content); + _logger.fine( + "HTTP response message: " + httpResponse.getMessage()); + _logger.fine( + "HTTP response status code: " + + httpResponse.getStatusCode()); + } + + try { + return Page.of(content, CurrencySerDes::toDTO); + } + catch (Exception e) { + _logger.log( + Level.WARNING, + "Unable to process HTTP response: " + content, e); + + throw new Problem.ProblemException(Problem.toDTO(content)); + } + } + + public HttpInvoker.HttpResponse getChannelCurrenciesPageHttpResponse( + Long channelId, String search, String filterString, + Pagination pagination, String sortString) + throws Exception { + + HttpInvoker httpInvoker = HttpInvoker.newHttpInvoker(); + + if (_builder._locale != null) { + httpInvoker.header( + "Accept-Language", _builder._locale.toLanguageTag()); + } + + for (Map.Entry entry : + _builder._headers.entrySet()) { + + httpInvoker.header(entry.getKey(), entry.getValue()); + } + + for (Map.Entry entry : + _builder._parameters.entrySet()) { + + httpInvoker.parameter(entry.getKey(), entry.getValue()); + } + + httpInvoker.httpMethod(HttpInvoker.HttpMethod.GET); + + if (search != null) { + httpInvoker.parameter("search", String.valueOf(search)); + } + + if (filterString != null) { + httpInvoker.parameter("filter", filterString); + } + + if (pagination != null) { + httpInvoker.parameter( + "page", String.valueOf(pagination.getPage())); + httpInvoker.parameter( + "pageSize", String.valueOf(pagination.getPageSize())); + } + + if (sortString != null) { + httpInvoker.parameter("sort", sortString); + } + + httpInvoker.path( + _builder._scheme + "://" + _builder._host + ":" + + _builder._port + _builder._contextPath + + "/o/headless-commerce-delivery-catalog/v1.0/channels/{channelId}/currencies"); + + httpInvoker.path("channelId", channelId); + + httpInvoker.userNameAndPassword( + _builder._login + ":" + _builder._password); + + return httpInvoker.invoke(); + } + + private CurrencyResourceImpl(Builder builder) { + _builder = builder; + } + + private static final Logger _logger = Logger.getLogger( + CurrencyResource.class.getName()); + + private Builder _builder; + + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/serdes/v1_0/CurrencySerDes.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/serdes/v1_0/CurrencySerDes.java new file mode 100644 index 00000000000000..6ba8dd7964c222 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-client/src/main/java/com/liferay/headless/commerce/delivery/catalog/client/serdes/v1_0/CurrencySerDes.java @@ -0,0 +1,529 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.client.serdes.v1_0; + +import com.liferay.headless.commerce.delivery.catalog.client.dto.v1_0.Currency; +import com.liferay.headless.commerce.delivery.catalog.client.json.BaseJSONParser; + +import java.math.BigDecimal; + +import java.util.Iterator; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.TreeMap; + +import javax.annotation.Generated; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +public class CurrencySerDes { + + public static Currency toDTO(String json) { + CurrencyJSONParser currencyJSONParser = new CurrencyJSONParser(); + + return currencyJSONParser.parseToDTO(json); + } + + public static Currency[] toDTOs(String json) { + CurrencyJSONParser currencyJSONParser = new CurrencyJSONParser(); + + return currencyJSONParser.parseToDTOs(json); + } + + public static String toJSON(Currency currency) { + if (currency == null) { + return "null"; + } + + StringBuilder sb = new StringBuilder(); + + sb.append("{"); + + if (currency.getActive() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"active\": "); + + sb.append(currency.getActive()); + } + + if (currency.getCode() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"code\": "); + + sb.append("\""); + + sb.append(_escape(currency.getCode())); + + sb.append("\""); + } + + if (currency.getExternalReferenceCode() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"externalReferenceCode\": "); + + sb.append("\""); + + sb.append(_escape(currency.getExternalReferenceCode())); + + sb.append("\""); + } + + if (currency.getFormatPattern() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"formatPattern\": "); + + sb.append(_toJSON(currency.getFormatPattern())); + } + + if (currency.getId() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"id\": "); + + sb.append(currency.getId()); + } + + if (currency.getMaxFractionDigits() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"maxFractionDigits\": "); + + sb.append(currency.getMaxFractionDigits()); + } + + if (currency.getMinFractionDigits() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"minFractionDigits\": "); + + sb.append(currency.getMinFractionDigits()); + } + + if (currency.getName() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"name\": "); + + sb.append(_toJSON(currency.getName())); + } + + if (currency.getPrimary() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"primary\": "); + + sb.append(currency.getPrimary()); + } + + if (currency.getPriority() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"priority\": "); + + sb.append(currency.getPriority()); + } + + if (currency.getRate() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"rate\": "); + + sb.append(currency.getRate()); + } + + if (currency.getRoundingMode() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"roundingMode\": "); + + sb.append("\""); + + sb.append(currency.getRoundingMode()); + + sb.append("\""); + } + + if (currency.getSymbol() != null) { + if (sb.length() > 1) { + sb.append(", "); + } + + sb.append("\"symbol\": "); + + sb.append("\""); + + sb.append(_escape(currency.getSymbol())); + + sb.append("\""); + } + + sb.append("}"); + + return sb.toString(); + } + + public static Map toMap(String json) { + CurrencyJSONParser currencyJSONParser = new CurrencyJSONParser(); + + return currencyJSONParser.parseToMap(json); + } + + public static Map toMap(Currency currency) { + if (currency == null) { + return null; + } + + Map map = new TreeMap<>(); + + if (currency.getActive() == null) { + map.put("active", null); + } + else { + map.put("active", String.valueOf(currency.getActive())); + } + + if (currency.getCode() == null) { + map.put("code", null); + } + else { + map.put("code", String.valueOf(currency.getCode())); + } + + if (currency.getExternalReferenceCode() == null) { + map.put("externalReferenceCode", null); + } + else { + map.put( + "externalReferenceCode", + String.valueOf(currency.getExternalReferenceCode())); + } + + if (currency.getFormatPattern() == null) { + map.put("formatPattern", null); + } + else { + map.put( + "formatPattern", String.valueOf(currency.getFormatPattern())); + } + + if (currency.getId() == null) { + map.put("id", null); + } + else { + map.put("id", String.valueOf(currency.getId())); + } + + if (currency.getMaxFractionDigits() == null) { + map.put("maxFractionDigits", null); + } + else { + map.put( + "maxFractionDigits", + String.valueOf(currency.getMaxFractionDigits())); + } + + if (currency.getMinFractionDigits() == null) { + map.put("minFractionDigits", null); + } + else { + map.put( + "minFractionDigits", + String.valueOf(currency.getMinFractionDigits())); + } + + if (currency.getName() == null) { + map.put("name", null); + } + else { + map.put("name", String.valueOf(currency.getName())); + } + + if (currency.getPrimary() == null) { + map.put("primary", null); + } + else { + map.put("primary", String.valueOf(currency.getPrimary())); + } + + if (currency.getPriority() == null) { + map.put("priority", null); + } + else { + map.put("priority", String.valueOf(currency.getPriority())); + } + + if (currency.getRate() == null) { + map.put("rate", null); + } + else { + map.put("rate", String.valueOf(currency.getRate())); + } + + if (currency.getRoundingMode() == null) { + map.put("roundingMode", null); + } + else { + map.put("roundingMode", String.valueOf(currency.getRoundingMode())); + } + + if (currency.getSymbol() == null) { + map.put("symbol", null); + } + else { + map.put("symbol", String.valueOf(currency.getSymbol())); + } + + return map; + } + + public static class CurrencyJSONParser extends BaseJSONParser { + + @Override + protected Currency createDTO() { + return new Currency(); + } + + @Override + protected Currency[] createDTOArray(int size) { + return new Currency[size]; + } + + @Override + protected boolean parseMaps(String jsonParserFieldName) { + if (Objects.equals(jsonParserFieldName, "active")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "code")) { + return false; + } + else if (Objects.equals( + jsonParserFieldName, "externalReferenceCode")) { + + return false; + } + else if (Objects.equals(jsonParserFieldName, "formatPattern")) { + return true; + } + else if (Objects.equals(jsonParserFieldName, "id")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "maxFractionDigits")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "minFractionDigits")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "name")) { + return true; + } + else if (Objects.equals(jsonParserFieldName, "primary")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "priority")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "rate")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "roundingMode")) { + return false; + } + else if (Objects.equals(jsonParserFieldName, "symbol")) { + return false; + } + + return false; + } + + @Override + protected void setField( + Currency currency, String jsonParserFieldName, + Object jsonParserFieldValue) { + + if (Objects.equals(jsonParserFieldName, "active")) { + if (jsonParserFieldValue != null) { + currency.setActive((Boolean)jsonParserFieldValue); + } + } + else if (Objects.equals(jsonParserFieldName, "code")) { + if (jsonParserFieldValue != null) { + currency.setCode((String)jsonParserFieldValue); + } + } + else if (Objects.equals( + jsonParserFieldName, "externalReferenceCode")) { + + if (jsonParserFieldValue != null) { + currency.setExternalReferenceCode( + (String)jsonParserFieldValue); + } + } + else if (Objects.equals(jsonParserFieldName, "formatPattern")) { + if (jsonParserFieldValue != null) { + currency.setFormatPattern( + (Map)jsonParserFieldValue); + } + } + else if (Objects.equals(jsonParserFieldName, "id")) { + if (jsonParserFieldValue != null) { + currency.setId(Long.valueOf((String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "maxFractionDigits")) { + if (jsonParserFieldValue != null) { + currency.setMaxFractionDigits( + Integer.valueOf((String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "minFractionDigits")) { + if (jsonParserFieldValue != null) { + currency.setMinFractionDigits( + Integer.valueOf((String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "name")) { + if (jsonParserFieldValue != null) { + currency.setName((Map)jsonParserFieldValue); + } + } + else if (Objects.equals(jsonParserFieldName, "primary")) { + if (jsonParserFieldValue != null) { + currency.setPrimary((Boolean)jsonParserFieldValue); + } + } + else if (Objects.equals(jsonParserFieldName, "priority")) { + if (jsonParserFieldValue != null) { + currency.setPriority( + Double.valueOf((String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "rate")) { + if (jsonParserFieldValue != null) { + currency.setRate( + new BigDecimal((String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "roundingMode")) { + if (jsonParserFieldValue != null) { + currency.setRoundingMode( + Currency.RoundingMode.create( + (String)jsonParserFieldValue)); + } + } + else if (Objects.equals(jsonParserFieldName, "symbol")) { + if (jsonParserFieldValue != null) { + currency.setSymbol((String)jsonParserFieldValue); + } + } + } + + } + + private static String _escape(Object object) { + String string = String.valueOf(object); + + for (String[] strings : BaseJSONParser.JSON_ESCAPE_STRINGS) { + string = string.replace(strings[0], strings[1]); + } + + return string; + } + + private static String _toJSON(Map map) { + StringBuilder sb = new StringBuilder("{"); + + @SuppressWarnings("unchecked") + Set set = map.entrySet(); + + @SuppressWarnings("unchecked") + Iterator> iterator = set.iterator(); + + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + + sb.append("\""); + sb.append(entry.getKey()); + sb.append("\": "); + + Object value = entry.getValue(); + + sb.append(_toJSON(value)); + + if (iterator.hasNext()) { + sb.append(", "); + } + } + + sb.append("}"); + + return sb.toString(); + } + + private static String _toJSON(Object value) { + if (value instanceof Map) { + return _toJSON((Map)value); + } + + Class clazz = value.getClass(); + + if (clazz.isArray()) { + StringBuilder sb = new StringBuilder("["); + + Object[] values = (Object[])value; + + for (int i = 0; i < values.length; i++) { + sb.append(_toJSON(values[i])); + + if ((i + 1) < values.length) { + sb.append(", "); + } + } + + sb.append("]"); + + return sb.toString(); + } + + if (value instanceof String) { + return "\"" + _escape(value) + "\""; + } + + return String.valueOf(value); + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/rest-openapi.yaml b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/rest-openapi.yaml index 4c9f514963c8a0..bb768cb98c587d 100755 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/rest-openapi.yaml +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/rest-openapi.yaml @@ -254,6 +254,68 @@ components: - name - type type: object + Currency: + properties: + active: + example: true + type: boolean + code: + example: USD + type: string + externalReferenceCode: + example: AB-34098-789-N + type: string + formatPattern: + additionalProperties: + type: string + example: + en_US: Hand Saw + hr_HR: Product Name HR + hu_HU: Product Name HU + type: object + id: + example: 30130 + format: int64 + minimum: 0 + type: integer + maxFractionDigits: + format: int32 + minimum: 0 + type: integer + minFractionDigits: + format: int32 + minimum: 0 + type: integer + name: + additionalProperties: + type: string + example: + en_US: Hand Saw + hr_HR: Product Name HR + hu_HU: Product Name HU + type: object + primary: + example: true + type: boolean + priority: + example: 1.2 + format: double + type: number + rate: + example: 33.54 + format: bigdecimal + type: number + roundingMode: + enum: [UP, DOWN, CEILING, FLOOR, HALF_UP, HALF_DOWN, HALF_EVEN, UNNECESSARY] + example: HALF_EVEN + type: string + symbol: + example: $ + type: string + required: + - code + - name + type: object CustomField: description: Represents the value of each custom field. Fields can contain different information types (e.g., @@ -2170,6 +2232,90 @@ paths: description: Unexpected error tags: ["Sku"] + "/channels/by-externalReferenceCode/{externalReferenceCode}/currencies": + get: + description: + Retrieves currencies from selected channel. + operationId: getChannelByExternalReferenceCodeCurrenciesPage + parameters: + - in: path + explode: false + name: externalReferenceCode + required: true + schema: + description: + Channel ExternalReferenceCode + type: string + style: simple + - in: query + name: filter + required: false + schema: + type: string + - in: query + name: page + required: false + schema: + type: integer + - in: query + name: pageSize + required: false + schema: + type: integer + - in: query + name: search + required: false + schema: + type: string + - in: query + name: sort + required: false + schema: + type: string + responses: + 200: + content: + application/json: + schema: + items: + $ref: "#/components/schemas/Currency" + type: array + application/xml: + schema: + items: + $ref: "#/components/schemas/Currency" + type: array + 401: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + Authentication information is missing or invalid + 404: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + The specified resource was not found + 500: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + Unexpected error + tags: ["Currency"] "/channels/by-externalReferenceCode/{externalReferenceCode}/wishlists": get: description: @@ -2491,6 +2637,91 @@ paths: - CommerceOpenApiAdmin.write summary: Creates or updates an Account. tags: ["Account"] + "/channels/{channelId}/currencies": + get: + description: + Retrieves currencies from selected channel. + operationId: getChannelCurrenciesPage + parameters: + - in: path + explode: false + name: channelId + required: true + schema: + description: + Channel Id + format: int64 + type: integer + style: simple + - in: query + name: filter + required: false + schema: + type: string + - in: query + name: page + required: false + schema: + type: integer + - in: query + name: pageSize + required: false + schema: + type: integer + - in: query + name: search + required: false + schema: + type: string + - in: query + name: sort + required: false + schema: + type: string + responses: + 200: + content: + application/json: + schema: + items: + $ref: "#/components/schemas/Currency" + type: array + application/xml: + schema: + items: + $ref: "#/components/schemas/Currency" + type: array + 401: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + Authentication information is missing or invalid + 404: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + The specified resource was not found + 500: + content: + application/json: + schema: + $ref: "#/components/schemas/Error" + application/xml: + schema: + $ref: "#/components/schemas/Error" + description: + Unexpected error + tags: ["Currency"] "/channels/{channelId}/products": get: description: diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/dto/v1_0/converter/CurrencyDTOConverter.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/dto/v1_0/converter/CurrencyDTOConverter.java new file mode 100644 index 00000000000000..f94e3639c7c485 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/dto/v1_0/converter/CurrencyDTOConverter.java @@ -0,0 +1,70 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.internal.dto.v1_0.converter; + +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.service.CommerceCurrencyService; +import com.liferay.headless.commerce.core.util.LanguageUtils; +import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency; +import com.liferay.portal.vulcan.dto.converter.DTOConverter; +import com.liferay.portal.vulcan.dto.converter.DTOConverterContext; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Michele Vigilante + */ +@Component( + property = "dto.class.name=com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency", + service = DTOConverter.class +) +public class CurrencyDTOConverter + implements DTOConverter { + + @Override + public String getContentType() { + return Currency.class.getSimpleName(); + } + + @Override + public Currency toDTO(DTOConverterContext dtoConverterContext) + throws Exception { + + CommerceCurrency commerceCurrency = + _commerceCurrencyService.getCommerceCurrency( + (Long)dtoConverterContext.getId()); + + return new Currency() { + { + setActive(commerceCurrency::isActive); + setCode(commerceCurrency::getCode); + setExternalReferenceCode( + commerceCurrency::getExternalReferenceCode); + setFormatPattern( + () -> LanguageUtils.getLanguageIdMap( + commerceCurrency.getFormatPatternMap())); + setId(commerceCurrency::getCommerceCurrencyId); + setMaxFractionDigits(commerceCurrency::getMaxFractionDigits); + setMinFractionDigits(commerceCurrency::getMinFractionDigits); + setName( + () -> LanguageUtils.getLanguageIdMap( + commerceCurrency.getNameMap())); + setPrimary(commerceCurrency::getPrimary); + setPriority(commerceCurrency::getPriority); + setRate(commerceCurrency::getRate); + setRoundingMode( + () -> RoundingMode.valueOf( + commerceCurrency.getRoundingMode())); + setSymbol(commerceCurrency::getSymbol); + } + }; + } + + @Reference + private CommerceCurrencyService _commerceCurrencyService; + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/query/v1_0/Query.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/query/v1_0/Query.java index 2c50b36f88100d..674960ce590033 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/query/v1_0/Query.java +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/query/v1_0/Query.java @@ -9,6 +9,7 @@ import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Attachment; import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Category; import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Channel; +import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency; import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.LinkedProduct; import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.MappedProduct; import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Pin; @@ -24,6 +25,7 @@ import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.AttachmentResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CategoryResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.ChannelResource; +import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CurrencyResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.LinkedProductResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.MappedProductResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.PinResource; @@ -99,6 +101,14 @@ public static void setChannelResourceComponentServiceObjects( channelResourceComponentServiceObjects; } + public static void setCurrencyResourceComponentServiceObjects( + ComponentServiceObjects + currencyResourceComponentServiceObjects) { + + _currencyResourceComponentServiceObjects = + currencyResourceComponentServiceObjects; + } + public static void setLinkedProductResourceComponentServiceObjects( ComponentServiceObjects linkedProductResourceComponentServiceObjects) { @@ -305,6 +315,60 @@ public ChannelPage channels( _sortsBiFunction.apply(channelResource, sortsString)))); } + /** + * Invoke this method with the command line: + * + * curl -H 'Content-Type: text/plain; charset=utf-8' -X 'POST' 'http://localhost:8080/o/graphql' -d $'{"query": "query {channelByExternalReferenceCodeCurrencies(externalReferenceCode: ___, filter: ___, page: ___, pageSize: ___, search: ___, sorts: ___){items {__}, page, pageSize, totalCount}}"}' -u 'test@liferay.com:test' + */ + @GraphQLField(description = "Retrieves currencies from selected channel.") + public CurrencyPage channelByExternalReferenceCodeCurrencies( + @GraphQLName("externalReferenceCode") String externalReferenceCode, + @GraphQLName("search") String search, + @GraphQLName("filter") String filterString, + @GraphQLName("pageSize") int pageSize, + @GraphQLName("page") int page, + @GraphQLName("sort") String sortsString) + throws Exception { + + return _applyComponentServiceObjects( + _currencyResourceComponentServiceObjects, + this::_populateResourceContext, + currencyResource -> new CurrencyPage( + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, search, + _filterBiFunction.apply(currencyResource, filterString), + Pagination.of(page, pageSize), + _sortsBiFunction.apply( + currencyResource, sortsString)))); + } + + /** + * Invoke this method with the command line: + * + * curl -H 'Content-Type: text/plain; charset=utf-8' -X 'POST' 'http://localhost:8080/o/graphql' -d $'{"query": "query {channelCurrencies(channelId: ___, filter: ___, page: ___, pageSize: ___, search: ___, sorts: ___){items {__}, page, pageSize, totalCount}}"}' -u 'test@liferay.com:test' + */ + @GraphQLField(description = "Retrieves currencies from selected channel.") + public CurrencyPage channelCurrencies( + @GraphQLName("channelId") Long channelId, + @GraphQLName("search") String search, + @GraphQLName("filter") String filterString, + @GraphQLName("pageSize") int pageSize, + @GraphQLName("page") int page, + @GraphQLName("sort") String sortsString) + throws Exception { + + return _applyComponentServiceObjects( + _currencyResourceComponentServiceObjects, + this::_populateResourceContext, + currencyResource -> new CurrencyPage( + currencyResource.getChannelCurrenciesPage( + channelId, search, + _filterBiFunction.apply(currencyResource, filterString), + Pagination.of(page, pageSize), + _sortsBiFunction.apply(currencyResource, sortsString)))); + } + /** * Invoke this method with the command line: * @@ -1018,6 +1082,39 @@ public ChannelPage(Page channelPage) { } + @GraphQLName("CurrencyPage") + public class CurrencyPage { + + public CurrencyPage(Page currencyPage) { + actions = currencyPage.getActions(); + + items = currencyPage.getItems(); + lastPage = currencyPage.getLastPage(); + page = currencyPage.getPage(); + pageSize = currencyPage.getPageSize(); + totalCount = currencyPage.getTotalCount(); + } + + @GraphQLField + protected Map> actions; + + @GraphQLField + protected java.util.Collection items; + + @GraphQLField + protected long lastPage; + + @GraphQLField + protected long page; + + @GraphQLField + protected long pageSize; + + @GraphQLField + protected long totalCount; + + } + @GraphQLName("LinkedProductPage") public class LinkedProductPage { @@ -1452,6 +1549,19 @@ private void _populateResourceContext(ChannelResource channelResource) channelResource.setRoleLocalService(_roleLocalService); } + private void _populateResourceContext(CurrencyResource currencyResource) + throws Exception { + + currencyResource.setContextAcceptLanguage(_acceptLanguage); + currencyResource.setContextCompany(_company); + currencyResource.setContextHttpServletRequest(_httpServletRequest); + currencyResource.setContextHttpServletResponse(_httpServletResponse); + currencyResource.setContextUriInfo(_uriInfo); + currencyResource.setContextUser(_user); + currencyResource.setGroupLocalService(_groupLocalService); + currencyResource.setRoleLocalService(_roleLocalService); + } + private void _populateResourceContext( LinkedProductResource linkedProductResource) throws Exception { @@ -1620,6 +1730,8 @@ private void _populateResourceContext( _categoryResourceComponentServiceObjects; private static ComponentServiceObjects _channelResourceComponentServiceObjects; + private static ComponentServiceObjects + _currencyResourceComponentServiceObjects; private static ComponentServiceObjects _linkedProductResourceComponentServiceObjects; private static ComponentServiceObjects diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/servlet/v1_0/ServletDataImpl.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/servlet/v1_0/ServletDataImpl.java index a4d06cc4ca6831..5a7f567e0683f5 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/servlet/v1_0/ServletDataImpl.java +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/graphql/servlet/v1_0/ServletDataImpl.java @@ -11,6 +11,7 @@ import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.AttachmentResourceImpl; import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.CategoryResourceImpl; import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.ChannelResourceImpl; +import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.CurrencyResourceImpl; import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.LinkedProductResourceImpl; import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.MappedProductResourceImpl; import com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.PinResourceImpl; @@ -26,6 +27,7 @@ import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.AttachmentResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CategoryResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.ChannelResource; +import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CurrencyResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.LinkedProductResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.MappedProductResource; import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.PinResource; @@ -83,6 +85,8 @@ public void activate(BundleContext bundleContext) { _categoryResourceComponentServiceObjects); Query.setChannelResourceComponentServiceObjects( _channelResourceComponentServiceObjects); + Query.setCurrencyResourceComponentServiceObjects( + _currencyResourceComponentServiceObjects); Query.setLinkedProductResourceComponentServiceObjects( _linkedProductResourceComponentServiceObjects); Query.setMappedProductResourceComponentServiceObjects( @@ -240,6 +244,16 @@ public ObjectValuePair, String> getResourceMethodObjectValuePair( "query#channels", new ObjectValuePair<>( ChannelResourceImpl.class, "getChannelsPage")); + put( + "query#channelByExternalReferenceCodeCurrencies", + new ObjectValuePair<>( + CurrencyResourceImpl.class, + "getChannelByExternalReferenceCodeCurrenciesPage")); + put( + "query#channelCurrencies", + new ObjectValuePair<>( + CurrencyResourceImpl.class, + "getChannelCurrenciesPage")); put( "query#channelProductLinkedProducts", new ObjectValuePair<>( @@ -392,6 +406,10 @@ public ObjectValuePair, String> getResourceMethodObjectValuePair( private ComponentServiceObjects _categoryResourceComponentServiceObjects; + @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED) + private ComponentServiceObjects + _currencyResourceComponentServiceObjects; + @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED) private ComponentServiceObjects _linkedProductResourceComponentServiceObjects; diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/BaseCurrencyResourceImpl.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/BaseCurrencyResourceImpl.java new file mode 100644 index 00000000000000..bcc67a523c1ce5 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/BaseCurrencyResourceImpl.java @@ -0,0 +1,585 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0; + +import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency; +import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CurrencyResource; +import com.liferay.petra.function.UnsafeBiConsumer; +import com.liferay.petra.function.UnsafeConsumer; +import com.liferay.petra.function.UnsafeFunction; +import com.liferay.petra.function.transform.TransformUtil; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.search.Sort; +import com.liferay.portal.kernel.search.filter.Filter; +import com.liferay.portal.kernel.security.permission.resource.ModelResourcePermission; +import com.liferay.portal.kernel.service.GroupLocalService; +import com.liferay.portal.kernel.service.ResourceActionLocalService; +import com.liferay.portal.kernel.service.ResourcePermissionLocalService; +import com.liferay.portal.kernel.service.RoleLocalService; +import com.liferay.portal.kernel.util.LocaleUtil; +import com.liferay.portal.kernel.util.SetUtil; +import com.liferay.portal.kernel.util.Validator; +import com.liferay.portal.odata.entity.EntityModel; +import com.liferay.portal.odata.filter.ExpressionConvert; +import com.liferay.portal.odata.filter.FilterParser; +import com.liferay.portal.odata.filter.FilterParserProvider; +import com.liferay.portal.odata.sort.SortField; +import com.liferay.portal.odata.sort.SortParser; +import com.liferay.portal.odata.sort.SortParserProvider; +import com.liferay.portal.vulcan.accept.language.AcceptLanguage; +import com.liferay.portal.vulcan.batch.engine.VulcanBatchEngineTaskItemDelegate; +import com.liferay.portal.vulcan.batch.engine.resource.VulcanBatchEngineExportTaskResource; +import com.liferay.portal.vulcan.batch.engine.resource.VulcanBatchEngineImportTaskResource; +import com.liferay.portal.vulcan.pagination.Page; +import com.liferay.portal.vulcan.pagination.Pagination; +import com.liferay.portal.vulcan.resource.EntityModelResource; +import com.liferay.portal.vulcan.util.ActionUtil; + +import java.io.Serializable; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Generated; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import javax.ws.rs.core.MultivaluedHashMap; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.UriInfo; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +@javax.ws.rs.Path("/v1.0") +public abstract class BaseCurrencyResourceImpl + implements CurrencyResource, EntityModelResource, + VulcanBatchEngineTaskItemDelegate { + + /** + * Invoke this method with the command line: + * + * curl -X 'GET' 'http://localhost:8080/o/headless-commerce-delivery-catalog/v1.0/channels/by-externalReferenceCode/{externalReferenceCode}/currencies' -u 'test@liferay.com:test' + */ + @io.swagger.v3.oas.annotations.Operation( + description = "Retrieves currencies from selected channel." + ) + @io.swagger.v3.oas.annotations.Parameters( + value = { + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.PATH, + name = "externalReferenceCode" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "filter" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "page" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "pageSize" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "search" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "sort" + ) + } + ) + @io.swagger.v3.oas.annotations.tags.Tags( + value = {@io.swagger.v3.oas.annotations.tags.Tag(name = "Currency")} + ) + @javax.ws.rs.GET + @javax.ws.rs.Path( + "/channels/by-externalReferenceCode/{externalReferenceCode}/currencies" + ) + @javax.ws.rs.Produces({"application/json", "application/xml"}) + @Override + public Page getChannelByExternalReferenceCodeCurrenciesPage( + @io.swagger.v3.oas.annotations.Parameter(hidden = true) + @javax.validation.constraints.NotNull + @javax.ws.rs.PathParam("externalReferenceCode") + String externalReferenceCode, + @io.swagger.v3.oas.annotations.Parameter(hidden = true) + @javax.ws.rs.QueryParam("search") + String search, + @javax.ws.rs.core.Context Filter filter, + @javax.ws.rs.core.Context Pagination pagination, + @javax.ws.rs.core.Context Sort[] sorts) + throws Exception { + + return Page.of(Collections.emptyList()); + } + + /** + * Invoke this method with the command line: + * + * curl -X 'GET' 'http://localhost:8080/o/headless-commerce-delivery-catalog/v1.0/channels/{channelId}/currencies' -u 'test@liferay.com:test' + */ + @io.swagger.v3.oas.annotations.Operation( + description = "Retrieves currencies from selected channel." + ) + @io.swagger.v3.oas.annotations.Parameters( + value = { + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.PATH, + name = "channelId" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "filter" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "page" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "pageSize" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "search" + ), + @io.swagger.v3.oas.annotations.Parameter( + in = io.swagger.v3.oas.annotations.enums.ParameterIn.QUERY, + name = "sort" + ) + } + ) + @io.swagger.v3.oas.annotations.tags.Tags( + value = {@io.swagger.v3.oas.annotations.tags.Tag(name = "Currency")} + ) + @javax.ws.rs.GET + @javax.ws.rs.Path("/channels/{channelId}/currencies") + @javax.ws.rs.Produces({"application/json", "application/xml"}) + @Override + public Page getChannelCurrenciesPage( + @io.swagger.v3.oas.annotations.Parameter(hidden = true) + @javax.validation.constraints.NotNull + @javax.ws.rs.PathParam("channelId") + Long channelId, + @io.swagger.v3.oas.annotations.Parameter(hidden = true) + @javax.ws.rs.QueryParam("search") + String search, + @javax.ws.rs.core.Context Filter filter, + @javax.ws.rs.core.Context Pagination pagination, + @javax.ws.rs.core.Context Sort[] sorts) + throws Exception { + + return Page.of(Collections.emptyList()); + } + + @Override + @SuppressWarnings("PMD.UnusedLocalVariable") + public void create( + Collection currencies, + Map parameters) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + @Override + public void delete( + Collection currencies, + Map parameters) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + public Set getAvailableCreateStrategies() { + return SetUtil.fromArray(); + } + + public Set getAvailableUpdateStrategies() { + return SetUtil.fromArray(); + } + + @Override + public EntityModel getEntityModel(Map> multivaluedMap) + throws Exception { + + return getEntityModel( + new MultivaluedHashMap(multivaluedMap)); + } + + @Override + public EntityModel getEntityModel(MultivaluedMap multivaluedMap) + throws Exception { + + return null; + } + + public String getResourceName() { + return "Currency"; + } + + public String getVersion() { + return "v1.0"; + } + + @Override + public Page read( + Filter filter, Pagination pagination, Sort[] sorts, + Map parameters, String search) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + @Override + public void setLanguageId(String languageId) { + this.contextAcceptLanguage = new AcceptLanguage() { + + @Override + public List getLocales() { + return null; + } + + @Override + public String getPreferredLanguageId() { + return languageId; + } + + @Override + public Locale getPreferredLocale() { + return LocaleUtil.fromLanguageId(languageId); + } + + }; + } + + @Override + public void update( + Collection currencies, + Map parameters) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + public void setContextAcceptLanguage(AcceptLanguage contextAcceptLanguage) { + this.contextAcceptLanguage = contextAcceptLanguage; + } + + public void setContextBatchUnsafeBiConsumer( + UnsafeBiConsumer + , + UnsafeFunction, Exception> + contextBatchUnsafeBiConsumer) { + + this.contextBatchUnsafeBiConsumer = contextBatchUnsafeBiConsumer; + } + + public void setContextBatchUnsafeConsumer( + UnsafeBiConsumer + , UnsafeConsumer, + Exception> contextBatchUnsafeConsumer) { + + this.contextBatchUnsafeConsumer = contextBatchUnsafeConsumer; + } + + public void setContextCompany( + com.liferay.portal.kernel.model.Company contextCompany) { + + this.contextCompany = contextCompany; + } + + public void setContextHttpServletRequest( + HttpServletRequest contextHttpServletRequest) { + + this.contextHttpServletRequest = contextHttpServletRequest; + } + + public void setContextHttpServletResponse( + HttpServletResponse contextHttpServletResponse) { + + this.contextHttpServletResponse = contextHttpServletResponse; + } + + public void setContextUriInfo(UriInfo contextUriInfo) { + this.contextUriInfo = contextUriInfo; + } + + public void setContextUser( + com.liferay.portal.kernel.model.User contextUser) { + + this.contextUser = contextUser; + } + + public void setExpressionConvert( + ExpressionConvert expressionConvert) { + + this.expressionConvert = expressionConvert; + } + + public void setFilterParserProvider( + FilterParserProvider filterParserProvider) { + + this.filterParserProvider = filterParserProvider; + } + + public void setGroupLocalService(GroupLocalService groupLocalService) { + this.groupLocalService = groupLocalService; + } + + public void setResourceActionLocalService( + ResourceActionLocalService resourceActionLocalService) { + + this.resourceActionLocalService = resourceActionLocalService; + } + + public void setResourcePermissionLocalService( + ResourcePermissionLocalService resourcePermissionLocalService) { + + this.resourcePermissionLocalService = resourcePermissionLocalService; + } + + public void setRoleLocalService(RoleLocalService roleLocalService) { + this.roleLocalService = roleLocalService; + } + + public void setSortParserProvider(SortParserProvider sortParserProvider) { + this.sortParserProvider = sortParserProvider; + } + + public void setVulcanBatchEngineExportTaskResource( + VulcanBatchEngineExportTaskResource + vulcanBatchEngineExportTaskResource) { + + this.vulcanBatchEngineExportTaskResource = + vulcanBatchEngineExportTaskResource; + } + + public void setVulcanBatchEngineImportTaskResource( + VulcanBatchEngineImportTaskResource + vulcanBatchEngineImportTaskResource) { + + this.vulcanBatchEngineImportTaskResource = + vulcanBatchEngineImportTaskResource; + } + + @Override + public Filter toFilter( + String filterString, Map> multivaluedMap) { + + try { + EntityModel entityModel = getEntityModel(multivaluedMap); + + FilterParser filterParser = filterParserProvider.provide( + entityModel); + + com.liferay.portal.odata.filter.Filter oDataFilter = + new com.liferay.portal.odata.filter.Filter( + filterParser.parse(filterString)); + + return expressionConvert.convert( + oDataFilter.getExpression(), + contextAcceptLanguage.getPreferredLocale(), entityModel); + } + catch (Exception exception) { + _log.error("Invalid filter " + filterString, exception); + + return null; + } + } + + @Override + public Sort[] toSorts(String sortString) { + if (Validator.isNull(sortString)) { + return null; + } + + try { + SortParser sortParser = sortParserProvider.provide( + getEntityModel(Collections.emptyMap())); + + if (sortParser == null) { + return null; + } + + com.liferay.portal.odata.sort.Sort oDataSort = + new com.liferay.portal.odata.sort.Sort( + sortParser.parse(sortString)); + + List sortFields = oDataSort.getSortFields(); + + Sort[] sorts = new Sort[sortFields.size()]; + + for (int i = 0; i < sortFields.size(); i++) { + SortField sortField = sortFields.get(i); + + sorts[i] = new Sort( + sortField.getSortableFieldName( + contextAcceptLanguage.getPreferredLocale()), + !sortField.isAscending()); + } + + return sorts; + } + catch (Exception exception) { + _log.error("Invalid sort " + sortString, exception); + + return new Sort[0]; + } + } + + protected Map addAction( + String actionName, + com.liferay.portal.kernel.model.GroupedModel groupedModel, + String methodName) { + + return ActionUtil.addAction( + actionName, getClass(), groupedModel, methodName, + contextScopeChecker, contextUriInfo); + } + + protected Map addAction( + String actionName, Long id, String methodName, Long ownerId, + String permissionName, Long siteId) { + + return ActionUtil.addAction( + actionName, getClass(), id, methodName, contextScopeChecker, + ownerId, permissionName, siteId, contextUriInfo); + } + + protected Map addAction( + String actionName, Long id, String methodName, + ModelResourcePermission modelResourcePermission) { + + return ActionUtil.addAction( + actionName, getClass(), id, methodName, contextScopeChecker, + modelResourcePermission, contextUriInfo); + } + + protected Map addAction( + String actionName, String methodName, String permissionName, + Long siteId) { + + return addAction( + actionName, siteId, methodName, null, permissionName, siteId); + } + + protected List transform( + Collection collection, UnsafeFunction unsafeFunction) { + + return TransformUtil.transform(collection, unsafeFunction); + } + + protected R[] transform( + T[] array, UnsafeFunction unsafeFunction, + Class clazz) { + + return TransformUtil.transform(array, unsafeFunction, clazz); + } + + protected R[] transformToArray( + Collection collection, UnsafeFunction unsafeFunction, + Class clazz) { + + return TransformUtil.transformToArray( + collection, unsafeFunction, clazz); + } + + protected List transformToList( + T[] array, UnsafeFunction unsafeFunction) { + + return TransformUtil.transformToList(array, unsafeFunction); + } + + protected long[] transformToLongArray( + Collection collection, UnsafeFunction unsafeFunction) { + + return TransformUtil.transformToLongArray(collection, unsafeFunction); + } + + protected List unsafeTransform( + Collection collection, UnsafeFunction unsafeFunction) + throws E { + + return TransformUtil.unsafeTransform(collection, unsafeFunction); + } + + protected R[] unsafeTransform( + T[] array, UnsafeFunction unsafeFunction, + Class clazz) + throws E { + + return TransformUtil.unsafeTransform(array, unsafeFunction, clazz); + } + + protected R[] unsafeTransformToArray( + Collection collection, UnsafeFunction unsafeFunction, + Class clazz) + throws E { + + return TransformUtil.unsafeTransformToArray( + collection, unsafeFunction, clazz); + } + + protected List unsafeTransformToList( + T[] array, UnsafeFunction unsafeFunction) + throws E { + + return TransformUtil.unsafeTransformToList(array, unsafeFunction); + } + + protected long[] unsafeTransformToLongArray( + Collection collection, UnsafeFunction unsafeFunction) + throws E { + + return TransformUtil.unsafeTransformToLongArray( + collection, unsafeFunction); + } + + protected AcceptLanguage contextAcceptLanguage; + protected UnsafeBiConsumer + , UnsafeFunction, + Exception> contextBatchUnsafeBiConsumer; + protected UnsafeBiConsumer + , UnsafeConsumer, Exception> + contextBatchUnsafeConsumer; + protected com.liferay.portal.kernel.model.Company contextCompany; + protected HttpServletRequest contextHttpServletRequest; + protected HttpServletResponse contextHttpServletResponse; + protected Object contextScopeChecker; + protected UriInfo contextUriInfo; + protected com.liferay.portal.kernel.model.User contextUser; + protected ExpressionConvert expressionConvert; + protected FilterParserProvider filterParserProvider; + protected GroupLocalService groupLocalService; + protected ResourceActionLocalService resourceActionLocalService; + protected ResourcePermissionLocalService resourcePermissionLocalService; + protected RoleLocalService roleLocalService; + protected SortParserProvider sortParserProvider; + protected VulcanBatchEngineExportTaskResource + vulcanBatchEngineExportTaskResource; + protected VulcanBatchEngineImportTaskResource + vulcanBatchEngineImportTaskResource; + + private static final com.liferay.portal.kernel.log.Log _log = + LogFactoryUtil.getLog(BaseCurrencyResourceImpl.class); + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/CurrencyResourceImpl.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/CurrencyResourceImpl.java new file mode 100644 index 00000000000000..ceaff0e66df63c --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/CurrencyResourceImpl.java @@ -0,0 +1,130 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0; + +import com.liferay.commerce.currency.model.CommerceCurrency; +import com.liferay.commerce.currency.service.CommerceCurrencyService; +import com.liferay.commerce.product.constants.CPField; +import com.liferay.commerce.product.model.CommerceChannel; +import com.liferay.commerce.product.service.CommerceChannelLocalService; +import com.liferay.commerce.product.service.CommerceChannelRelService; +import com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency; +import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CurrencyResource; +import com.liferay.portal.kernel.search.Field; +import com.liferay.portal.kernel.search.Sort; +import com.liferay.portal.kernel.search.filter.Filter; +import com.liferay.portal.kernel.util.GetterUtil; +import com.liferay.portal.kernel.util.Validator; +import com.liferay.portal.vulcan.dto.converter.DTOConverter; +import com.liferay.portal.vulcan.dto.converter.DefaultDTOConverterContext; +import com.liferay.portal.vulcan.pagination.Page; +import com.liferay.portal.vulcan.pagination.Pagination; +import com.liferay.portal.vulcan.util.SearchUtil; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ServiceScope; + +/** + * @author Michele Vigilante + */ +@Component( + properties = "OSGI-INF/liferay/rest/v1_0/currency.properties", + scope = ServiceScope.PROTOTYPE, service = CurrencyResource.class +) +public class CurrencyResourceImpl extends BaseCurrencyResourceImpl { + + @Override + public Page getChannelByExternalReferenceCodeCurrenciesPage( + String channelExternalReferenceCode, String search, Filter filter, + Pagination pagination, Sort[] sorts) + throws Exception { + + CommerceChannel commerceChannel = + _commerceChannelLocalService. + getCommerceChannelByExternalReferenceCode( + channelExternalReferenceCode, + contextCompany.getCompanyId()); + + return _getChannelCurrenciesPage( + commerceChannel, search, filter, pagination, sorts); + } + + @Override + public Page getChannelCurrenciesPage( + Long channelId, String search, Filter filter, Pagination pagination, + Sort[] sorts) + throws Exception { + + return _getChannelCurrenciesPage( + _commerceChannelLocalService.getCommerceChannel(channelId), search, + filter, pagination, sorts); + } + + private Page _getChannelCurrenciesPage( + CommerceChannel commerceChannel, String search, Filter filter, + Pagination pagination, Sort[] sorts) + throws Exception { + + return SearchUtil.search( + null, + booleanQuery -> { + }, + filter, CommerceCurrency.class.getName(), search, pagination, + queryConfig -> queryConfig.setSelectedFieldNames( + Field.ENTRY_CLASS_PK), + searchContext -> { + int count = + _commerceChannelRelService. + getCommerceCurrencyCommerceChannelRelsCount( + commerceChannel.getCommerceChannelId(), null); + + if (count > 0) { + searchContext.setAttribute( + CPField.CHANNEL_IDS, + new long[] {commerceChannel.getCommerceChannelId()}); + } + + searchContext.setCompanyId(commerceChannel.getCompanyId()); + + if (Validator.isNotNull(search)) { + searchContext.setKeywords(search); + } + }, + sorts, + document -> _toCurrency( + _commerceCurrencyService.getCommerceCurrency( + GetterUtil.getLong(document.get(Field.ENTRY_CLASS_PK))))); + } + + private Currency _toCurrency(CommerceCurrency commerceCurrency) + throws Exception { + + return _toCurrency(commerceCurrency.getCommerceCurrencyId()); + } + + private Currency _toCurrency(Long commerceCurrencyId) throws Exception { + return _currencyDTOConverter.toDTO( + new DefaultDTOConverterContext( + commerceCurrencyId, + contextAcceptLanguage.getPreferredLocale())); + } + + @Reference + private CommerceChannelLocalService _commerceChannelLocalService; + + @Reference + private CommerceChannelRelService _commerceChannelRelService; + + @Reference + private CommerceCurrencyService _commerceCurrencyService; + + @Reference( + target = "(component.name=com.liferay.headless.commerce.delivery.catalog.internal.dto.v1_0.converter.CurrencyDTOConverter)" + ) + private DTOConverter _currencyDTOConverter; + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/OpenAPIResourceImpl.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/OpenAPIResourceImpl.java index ea54758938e40a..f080893c78f266 100644 --- a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/OpenAPIResourceImpl.java +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/OpenAPIResourceImpl.java @@ -93,6 +93,8 @@ public Response getOpenAPI( add(ChannelResourceImpl.class); + add(CurrencyResourceImpl.class); + add(LinkedProductResourceImpl.class); add(MappedProductResourceImpl.class); diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/factory/CurrencyResourceFactoryImpl.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/factory/CurrencyResourceFactoryImpl.java new file mode 100644 index 00000000000000..867318aaa930ec --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/java/com/liferay/headless/commerce/delivery/catalog/internal/resource/v1_0/factory/CurrencyResourceFactoryImpl.java @@ -0,0 +1,328 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.internal.resource.v1_0.factory; + +import com.liferay.headless.commerce.delivery.catalog.internal.security.permission.LiberalPermissionChecker; +import com.liferay.headless.commerce.delivery.catalog.resource.v1_0.CurrencyResource; +import com.liferay.portal.kernel.model.Company; +import com.liferay.portal.kernel.model.User; +import com.liferay.portal.kernel.search.filter.Filter; +import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal; +import com.liferay.portal.kernel.security.permission.PermissionChecker; +import com.liferay.portal.kernel.security.permission.PermissionCheckerFactory; +import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; +import com.liferay.portal.kernel.service.CompanyLocalService; +import com.liferay.portal.kernel.service.GroupLocalService; +import com.liferay.portal.kernel.service.ResourceActionLocalService; +import com.liferay.portal.kernel.service.ResourcePermissionLocalService; +import com.liferay.portal.kernel.service.RoleLocalService; +import com.liferay.portal.kernel.service.UserLocalService; +import com.liferay.portal.kernel.util.LocaleUtil; +import com.liferay.portal.kernel.util.ProxyUtil; +import com.liferay.portal.kernel.util.WebKeys; +import com.liferay.portal.odata.filter.ExpressionConvert; +import com.liferay.portal.odata.filter.FilterParserProvider; +import com.liferay.portal.odata.sort.SortParserProvider; +import com.liferay.portal.vulcan.accept.language.AcceptLanguage; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.function.Function; + +import javax.annotation.Generated; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import javax.ws.rs.core.UriInfo; + +import org.osgi.service.component.ComponentServiceObjects; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.component.annotations.ReferenceScope; + +/** + * @author Andrea Sbarra + * @generated + */ +@Component( + property = "resource.locator.key=/headless-commerce-delivery-catalog/v1.0/Currency", + service = CurrencyResource.Factory.class +) +@Generated("") +public class CurrencyResourceFactoryImpl implements CurrencyResource.Factory { + + @Override + public CurrencyResource.Builder create() { + return new CurrencyResource.Builder() { + + @Override + public CurrencyResource build() { + if (_user == null) { + throw new IllegalArgumentException("User is not set"); + } + + Function + currencyResourceProxyProviderFunction = + ResourceProxyProviderFunctionHolder. + _currencyResourceProxyProviderFunction; + + return currencyResourceProxyProviderFunction.apply( + (proxy, method, arguments) -> _invoke( + method, arguments, _checkPermissions, + _httpServletRequest, _httpServletResponse, + _preferredLocale, _uriInfo, _user)); + } + + @Override + public CurrencyResource.Builder checkPermissions( + boolean checkPermissions) { + + _checkPermissions = checkPermissions; + + return this; + } + + @Override + public CurrencyResource.Builder httpServletRequest( + HttpServletRequest httpServletRequest) { + + _httpServletRequest = httpServletRequest; + + return this; + } + + @Override + public CurrencyResource.Builder httpServletResponse( + HttpServletResponse httpServletResponse) { + + _httpServletResponse = httpServletResponse; + + return this; + } + + @Override + public CurrencyResource.Builder preferredLocale( + Locale preferredLocale) { + + _preferredLocale = preferredLocale; + + return this; + } + + @Override + public CurrencyResource.Builder uriInfo(UriInfo uriInfo) { + _uriInfo = uriInfo; + + return this; + } + + @Override + public CurrencyResource.Builder user(User user) { + _user = user; + + return this; + } + + private boolean _checkPermissions = true; + private HttpServletRequest _httpServletRequest; + private HttpServletResponse _httpServletResponse; + private Locale _preferredLocale; + private UriInfo _uriInfo; + private User _user; + + }; + } + + private static Function + _getProxyProviderFunction() { + + Class proxyClass = ProxyUtil.getProxyClass( + CurrencyResource.class.getClassLoader(), CurrencyResource.class); + + try { + Constructor constructor = + (Constructor)proxyClass.getConstructor( + InvocationHandler.class); + + return invocationHandler -> { + try { + return constructor.newInstance(invocationHandler); + } + catch (ReflectiveOperationException + reflectiveOperationException) { + + throw new InternalError(reflectiveOperationException); + } + }; + } + catch (NoSuchMethodException noSuchMethodException) { + throw new InternalError(noSuchMethodException); + } + } + + private Object _invoke( + Method method, Object[] arguments, boolean checkPermissions, + HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse, Locale preferredLocale, + UriInfo uriInfo, User user) + throws Throwable { + + String name = PrincipalThreadLocal.getName(); + + PrincipalThreadLocal.setName(user.getUserId()); + + PermissionChecker permissionChecker = + PermissionThreadLocal.getPermissionChecker(); + + if (checkPermissions) { + PermissionThreadLocal.setPermissionChecker( + _defaultPermissionCheckerFactory.create(user)); + } + else { + PermissionThreadLocal.setPermissionChecker( + new LiberalPermissionChecker(user)); + } + + CurrencyResource currencyResource = + _componentServiceObjects.getService(); + + currencyResource.setContextAcceptLanguage( + new AcceptLanguageImpl(httpServletRequest, preferredLocale, user)); + + Company company = _companyLocalService.getCompany(user.getCompanyId()); + + currencyResource.setContextCompany(company); + + currencyResource.setContextHttpServletRequest(httpServletRequest); + currencyResource.setContextHttpServletResponse(httpServletResponse); + currencyResource.setContextUriInfo(uriInfo); + currencyResource.setContextUser(user); + currencyResource.setExpressionConvert(_expressionConvert); + currencyResource.setFilterParserProvider(_filterParserProvider); + currencyResource.setGroupLocalService(_groupLocalService); + currencyResource.setResourceActionLocalService( + _resourceActionLocalService); + currencyResource.setResourcePermissionLocalService( + _resourcePermissionLocalService); + currencyResource.setRoleLocalService(_roleLocalService); + currencyResource.setSortParserProvider(_sortParserProvider); + + try { + return method.invoke(currencyResource, arguments); + } + catch (InvocationTargetException invocationTargetException) { + throw invocationTargetException.getTargetException(); + } + finally { + _componentServiceObjects.ungetService(currencyResource); + + PrincipalThreadLocal.setName(name); + + PermissionThreadLocal.setPermissionChecker(permissionChecker); + } + } + + @Reference + private CompanyLocalService _companyLocalService; + + @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED) + private ComponentServiceObjects _componentServiceObjects; + + @Reference + private PermissionCheckerFactory _defaultPermissionCheckerFactory; + + @Reference( + target = "(result.class.name=com.liferay.portal.kernel.search.filter.Filter)" + ) + private ExpressionConvert _expressionConvert; + + @Reference + private FilterParserProvider _filterParserProvider; + + @Reference + private GroupLocalService _groupLocalService; + + @Reference + private ResourceActionLocalService _resourceActionLocalService; + + @Reference + private ResourcePermissionLocalService _resourcePermissionLocalService; + + @Reference + private RoleLocalService _roleLocalService; + + @Reference + private SortParserProvider _sortParserProvider; + + @Reference + private UserLocalService _userLocalService; + + private static class ResourceProxyProviderFunctionHolder { + + private static final Function + _currencyResourceProxyProviderFunction = + _getProxyProviderFunction(); + + } + + private class AcceptLanguageImpl implements AcceptLanguage { + + public AcceptLanguageImpl( + HttpServletRequest httpServletRequest, Locale preferredLocale, + User user) { + + _httpServletRequest = httpServletRequest; + _preferredLocale = preferredLocale; + _user = user; + } + + @Override + public List getLocales() { + return Arrays.asList(getPreferredLocale()); + } + + @Override + public String getPreferredLanguageId() { + return LocaleUtil.toLanguageId(getPreferredLocale()); + } + + @Override + public Locale getPreferredLocale() { + if (_preferredLocale != null) { + return _preferredLocale; + } + + if (_httpServletRequest != null) { + Locale locale = (Locale)_httpServletRequest.getAttribute( + WebKeys.LOCALE); + + if (locale != null) { + return locale; + } + } + + return _user.getLocale(); + } + + @Override + public boolean isAcceptAllLanguages() { + return false; + } + + private final HttpServletRequest _httpServletRequest; + private final Locale _preferredLocale; + private final User _user; + + } + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/resources/OSGI-INF/liferay/rest/v1_0/currency.properties b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/resources/OSGI-INF/liferay/rest/v1_0/currency.properties new file mode 100644 index 00000000000000..879181cee2666a --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-impl/src/main/resources/OSGI-INF/liferay/rest/v1_0/currency.properties @@ -0,0 +1,12 @@ +# +# This is a generated file. +# + +api.version=v1.0 +batch.engine.entity.class.name=com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency +batch.engine.task.item.delegate=true +batch.planner.export.enabled=false +batch.planner.import.enabled=false +entity.class.name=com.liferay.headless.commerce.delivery.catalog.dto.v1_0.Currency +osgi.jaxrs.application.select=(osgi.jaxrs.name=Liferay.Headless.Commerce.Delivery.Catalog) +osgi.jaxrs.resource=true \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/BaseCurrencyResourceTestCase.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/BaseCurrencyResourceTestCase.java new file mode 100644 index 00000000000000..06b901f0b46934 --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/BaseCurrencyResourceTestCase.java @@ -0,0 +1,2024 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.resource.v1_0.test; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.ISO8601DateFormat; + +import com.liferay.headless.commerce.delivery.catalog.client.dto.v1_0.Currency; +import com.liferay.headless.commerce.delivery.catalog.client.http.HttpInvoker; +import com.liferay.headless.commerce.delivery.catalog.client.pagination.Page; +import com.liferay.headless.commerce.delivery.catalog.client.pagination.Pagination; +import com.liferay.headless.commerce.delivery.catalog.client.resource.v1_0.CurrencyResource; +import com.liferay.headless.commerce.delivery.catalog.client.serdes.v1_0.CurrencySerDes; +import com.liferay.petra.function.UnsafeTriConsumer; +import com.liferay.petra.function.transform.TransformUtil; +import com.liferay.petra.reflect.ReflectionUtil; +import com.liferay.petra.string.StringBundler; +import com.liferay.portal.kernel.json.JSONFactoryUtil; +import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.portal.kernel.json.JSONUtil; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.service.CompanyLocalServiceUtil; +import com.liferay.portal.kernel.test.util.GroupTestUtil; +import com.liferay.portal.kernel.test.util.RandomTestUtil; +import com.liferay.portal.kernel.test.util.UserTestUtil; +import com.liferay.portal.kernel.util.ArrayUtil; +import com.liferay.portal.kernel.util.DateFormatFactoryUtil; +import com.liferay.portal.kernel.util.GetterUtil; +import com.liferay.portal.kernel.util.LocaleUtil; +import com.liferay.portal.kernel.util.StringUtil; +import com.liferay.portal.kernel.util.Time; +import com.liferay.portal.odata.entity.EntityField; +import com.liferay.portal.odata.entity.EntityModel; +import com.liferay.portal.search.test.rule.SearchTestRule; +import com.liferay.portal.test.rule.Inject; +import com.liferay.portal.test.rule.LiferayIntegrationTestRule; +import com.liferay.portal.util.PropsValues; +import com.liferay.portal.vulcan.resource.EntityModelResource; + +import java.lang.reflect.Method; + +import java.text.DateFormat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.Generated; + +import javax.ws.rs.core.MultivaluedHashMap; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +/** + * @author Andrea Sbarra + * @generated + */ +@Generated("") +public abstract class BaseCurrencyResourceTestCase { + + @ClassRule + @Rule + public static final LiferayIntegrationTestRule liferayIntegrationTestRule = + new LiferayIntegrationTestRule(); + + @BeforeClass + public static void setUpClass() throws Exception { + _dateFormat = DateFormatFactoryUtil.getSimpleDateFormat( + "yyyy-MM-dd'T'HH:mm:ss'Z'"); + } + + @Before + public void setUp() throws Exception { + irrelevantGroup = GroupTestUtil.addGroup(); + testGroup = GroupTestUtil.addGroup(); + + testCompany = CompanyLocalServiceUtil.getCompany( + testGroup.getCompanyId()); + + _currencyResource.setContextCompany(testCompany); + + com.liferay.portal.kernel.model.User testCompanyAdminUser = + UserTestUtil.getAdminUser(testCompany.getCompanyId()); + + currencyResource = CurrencyResource.builder( + ).authentication( + testCompanyAdminUser.getEmailAddress(), + PropsValues.DEFAULT_ADMIN_PASSWORD + ).endpoint( + testCompany.getVirtualHostname(), 8080, "http" + ).locale( + LocaleUtil.getDefault() + ).build(); + } + + @After + public void tearDown() throws Exception { + GroupTestUtil.deleteGroup(irrelevantGroup); + GroupTestUtil.deleteGroup(testGroup); + } + + @Test + public void testClientSerDesToDTO() throws Exception { + ObjectMapper objectMapper = getClientSerDesObjectMapper(); + + Currency currency1 = randomCurrency(); + + String json = objectMapper.writeValueAsString(currency1); + + Currency currency2 = CurrencySerDes.toDTO(json); + + Assert.assertTrue(equals(currency1, currency2)); + } + + @Test + public void testClientSerDesToJSON() throws Exception { + ObjectMapper objectMapper = getClientSerDesObjectMapper(); + + Currency currency = randomCurrency(); + + String json1 = objectMapper.writeValueAsString(currency); + String json2 = CurrencySerDes.toJSON(currency); + + Assert.assertEquals( + objectMapper.readTree(json1), objectMapper.readTree(json2)); + } + + protected ObjectMapper getClientSerDesObjectMapper() { + return new ObjectMapper() { + { + configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + configure( + SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); + enable(SerializationFeature.INDENT_OUTPUT); + setDateFormat(new ISO8601DateFormat()); + setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + setSerializationInclusion(JsonInclude.Include.NON_NULL); + setVisibility( + PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + setVisibility( + PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); + } + }; + } + + @Test + public void testEscapeRegexInStringFields() throws Exception { + String regex = "^[0-9]+(\\.[0-9]{1,2})\"?"; + + Currency currency = randomCurrency(); + + currency.setCode(regex); + currency.setExternalReferenceCode(regex); + currency.setSymbol(regex); + + String json = CurrencySerDes.toJSON(currency); + + Assert.assertFalse(json.contains(regex)); + + currency = CurrencySerDes.toDTO(json); + + Assert.assertEquals(regex, currency.getCode()); + Assert.assertEquals(regex, currency.getExternalReferenceCode()); + Assert.assertEquals(regex, currency.getSymbol()); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPage() + throws Exception { + + String externalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode(); + String irrelevantExternalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getIrrelevantExternalReferenceCode(); + + Page page = + currencyResource.getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, Pagination.of(1, 10), null); + + long totalCount = page.getTotalCount(); + + if (irrelevantExternalReferenceCode != null) { + Currency irrelevantCurrency = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + irrelevantExternalReferenceCode, + randomIrrelevantCurrency()); + + page = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + irrelevantExternalReferenceCode, null, null, + Pagination.of(1, (int)totalCount + 1), null); + + Assert.assertEquals(totalCount + 1, page.getTotalCount()); + + assertContains(irrelevantCurrency, (List)page.getItems()); + assertValid( + page, + testGetChannelByExternalReferenceCodeCurrenciesPage_getExpectedActions( + irrelevantExternalReferenceCode)); + } + + Currency currency1 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + Currency currency2 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + page = currencyResource.getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, Pagination.of(1, 10), null); + + Assert.assertEquals(totalCount + 2, page.getTotalCount()); + + assertContains(currency1, (List)page.getItems()); + assertContains(currency2, (List)page.getItems()); + assertValid( + page, + testGetChannelByExternalReferenceCodeCurrenciesPage_getExpectedActions( + externalReferenceCode)); + } + + protected Map> + testGetChannelByExternalReferenceCodeCurrenciesPage_getExpectedActions( + String externalReferenceCode) + throws Exception { + + Map> expectedActions = new HashMap<>(); + + return expectedActions; + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithFilterDateTimeEquals() + throws Exception { + + List entityFields = getEntityFields( + EntityField.Type.DATE_TIME); + + if (entityFields.isEmpty()) { + return; + } + + String externalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode(); + + Currency currency1 = randomCurrency(); + + currency1 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, currency1); + + for (EntityField entityField : entityFields) { + Page page = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, + getFilterString(entityField, "between", currency1), + Pagination.of(1, 2), null); + + assertEquals( + Collections.singletonList(currency1), + (List)page.getItems()); + } + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithFilterDoubleEquals() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithFilter( + "eq", EntityField.Type.DOUBLE); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithFilterStringContains() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithFilter( + "contains", EntityField.Type.STRING); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithFilterStringEquals() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithFilter( + "eq", EntityField.Type.STRING); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithFilterStringStartsWith() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithFilter( + "startswith", EntityField.Type.STRING); + } + + protected void + testGetChannelByExternalReferenceCodeCurrenciesPageWithFilter( + String operator, EntityField.Type type) + throws Exception { + + List entityFields = getEntityFields(type); + + if (entityFields.isEmpty()) { + return; + } + + String externalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode(); + + Currency currency1 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + @SuppressWarnings("PMD.UnusedLocalVariable") + Currency currency2 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + for (EntityField entityField : entityFields) { + Page page = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, + getFilterString(entityField, operator, currency1), + Pagination.of(1, 2), null); + + assertEquals( + Collections.singletonList(currency1), + (List)page.getItems()); + } + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithPagination() + throws Exception { + + String externalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode(); + + Page currencyPage = + currencyResource.getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, null, null); + + int totalCount = GetterUtil.getInteger(currencyPage.getTotalCount()); + + Currency currency1 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + Currency currency2 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + Currency currency3 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, randomCurrency()); + + // See com.liferay.portal.vulcan.internal.configuration.HeadlessAPICompanyConfiguration#pageSizeLimit + + int pageSizeLimit = 500; + + if (totalCount >= (pageSizeLimit - 2)) { + Page page1 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 1.0) / pageSizeLimit), + pageSizeLimit), + null); + + Assert.assertEquals(totalCount + 3, page1.getTotalCount()); + + assertContains(currency1, (List)page1.getItems()); + + Page page2 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 2.0) / pageSizeLimit), + pageSizeLimit), + null); + + assertContains(currency2, (List)page2.getItems()); + + Page page3 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 3.0) / pageSizeLimit), + pageSizeLimit), + null); + + assertContains(currency3, (List)page3.getItems()); + } + else { + Page page1 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of(1, totalCount + 2), null); + + List currencies1 = (List)page1.getItems(); + + Assert.assertEquals( + currencies1.toString(), totalCount + 2, currencies1.size()); + + Page page2 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of(2, totalCount + 2), null); + + Assert.assertEquals(totalCount + 3, page2.getTotalCount()); + + List currencies2 = (List)page2.getItems(); + + Assert.assertEquals(currencies2.toString(), 1, currencies2.size()); + + Page page3 = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of(1, (int)totalCount + 3), null); + + assertContains(currency1, (List)page3.getItems()); + assertContains(currency2, (List)page3.getItems()); + assertContains(currency3, (List)page3.getItems()); + } + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithSortDateTime() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithSort( + EntityField.Type.DATE_TIME, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty( + currency1, entityField.getName(), + new Date(System.currentTimeMillis() - (2 * Time.MINUTE))); + }); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithSortDouble() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithSort( + EntityField.Type.DOUBLE, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty(currency1, entityField.getName(), 0.1); + BeanTestUtil.setProperty(currency2, entityField.getName(), 0.5); + }); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithSortInteger() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithSort( + EntityField.Type.INTEGER, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty(currency1, entityField.getName(), 0); + BeanTestUtil.setProperty(currency2, entityField.getName(), 1); + }); + } + + @Test + public void testGetChannelByExternalReferenceCodeCurrenciesPageWithSortString() + throws Exception { + + testGetChannelByExternalReferenceCodeCurrenciesPageWithSort( + EntityField.Type.STRING, + (entityField, currency1, currency2) -> { + Class clazz = currency1.getClass(); + + String entityFieldName = entityField.getName(); + + Method method = clazz.getMethod( + "get" + StringUtil.upperCaseFirstLetter(entityFieldName)); + + Class returnType = method.getReturnType(); + + if (returnType.isAssignableFrom(Map.class)) { + BeanTestUtil.setProperty( + currency1, entityFieldName, + Collections.singletonMap("Aaa", "Aaa")); + BeanTestUtil.setProperty( + currency2, entityFieldName, + Collections.singletonMap("Bbb", "Bbb")); + } + else if (entityFieldName.contains("email")) { + BeanTestUtil.setProperty( + currency1, entityFieldName, + "aaa" + + StringUtil.toLowerCase( + RandomTestUtil.randomString()) + + "@liferay.com"); + BeanTestUtil.setProperty( + currency2, entityFieldName, + "bbb" + + StringUtil.toLowerCase( + RandomTestUtil.randomString()) + + "@liferay.com"); + } + else { + BeanTestUtil.setProperty( + currency1, entityFieldName, + "aaa" + + StringUtil.toLowerCase( + RandomTestUtil.randomString())); + BeanTestUtil.setProperty( + currency2, entityFieldName, + "bbb" + + StringUtil.toLowerCase( + RandomTestUtil.randomString())); + } + }); + } + + protected void testGetChannelByExternalReferenceCodeCurrenciesPageWithSort( + EntityField.Type type, + UnsafeTriConsumer + unsafeTriConsumer) + throws Exception { + + List entityFields = getEntityFields(type); + + if (entityFields.isEmpty()) { + return; + } + + String externalReferenceCode = + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode(); + + Currency currency1 = randomCurrency(); + Currency currency2 = randomCurrency(); + + for (EntityField entityField : entityFields) { + unsafeTriConsumer.accept(entityField, currency1, currency2); + } + + currency1 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, currency1); + + currency2 = + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + externalReferenceCode, currency2); + + Page page = + currencyResource.getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, null, null); + + for (EntityField entityField : entityFields) { + Page ascPage = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of(1, (int)page.getTotalCount() + 1), + entityField.getName() + ":asc"); + + assertContains(currency1, (List)ascPage.getItems()); + assertContains(currency2, (List)ascPage.getItems()); + + Page descPage = + currencyResource. + getChannelByExternalReferenceCodeCurrenciesPage( + externalReferenceCode, null, null, + Pagination.of(1, (int)page.getTotalCount() + 1), + entityField.getName() + ":desc"); + + assertContains(currency2, (List)descPage.getItems()); + assertContains(currency1, (List)descPage.getItems()); + } + } + + protected Currency + testGetChannelByExternalReferenceCodeCurrenciesPage_addCurrency( + String externalReferenceCode, Currency currency) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + protected String + testGetChannelByExternalReferenceCodeCurrenciesPage_getExternalReferenceCode() + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + protected String + testGetChannelByExternalReferenceCodeCurrenciesPage_getIrrelevantExternalReferenceCode() + throws Exception { + + return null; + } + + @Test + public void testGetChannelCurrenciesPage() throws Exception { + Long channelId = testGetChannelCurrenciesPage_getChannelId(); + Long irrelevantChannelId = + testGetChannelCurrenciesPage_getIrrelevantChannelId(); + + Page page = currencyResource.getChannelCurrenciesPage( + channelId, null, null, Pagination.of(1, 10), null); + + long totalCount = page.getTotalCount(); + + if (irrelevantChannelId != null) { + Currency irrelevantCurrency = + testGetChannelCurrenciesPage_addCurrency( + irrelevantChannelId, randomIrrelevantCurrency()); + + page = currencyResource.getChannelCurrenciesPage( + irrelevantChannelId, null, null, + Pagination.of(1, (int)totalCount + 1), null); + + Assert.assertEquals(totalCount + 1, page.getTotalCount()); + + assertContains(irrelevantCurrency, (List)page.getItems()); + assertValid( + page, + testGetChannelCurrenciesPage_getExpectedActions( + irrelevantChannelId)); + } + + Currency currency1 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + Currency currency2 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + page = currencyResource.getChannelCurrenciesPage( + channelId, null, null, Pagination.of(1, 10), null); + + Assert.assertEquals(totalCount + 2, page.getTotalCount()); + + assertContains(currency1, (List)page.getItems()); + assertContains(currency2, (List)page.getItems()); + assertValid( + page, testGetChannelCurrenciesPage_getExpectedActions(channelId)); + } + + protected Map> + testGetChannelCurrenciesPage_getExpectedActions(Long channelId) + throws Exception { + + Map> expectedActions = new HashMap<>(); + + return expectedActions; + } + + @Test + public void testGetChannelCurrenciesPageWithFilterDateTimeEquals() + throws Exception { + + List entityFields = getEntityFields( + EntityField.Type.DATE_TIME); + + if (entityFields.isEmpty()) { + return; + } + + Long channelId = testGetChannelCurrenciesPage_getChannelId(); + + Currency currency1 = randomCurrency(); + + currency1 = testGetChannelCurrenciesPage_addCurrency( + channelId, currency1); + + for (EntityField entityField : entityFields) { + Page page = currencyResource.getChannelCurrenciesPage( + channelId, null, + getFilterString(entityField, "between", currency1), + Pagination.of(1, 2), null); + + assertEquals( + Collections.singletonList(currency1), + (List)page.getItems()); + } + } + + @Test + public void testGetChannelCurrenciesPageWithFilterDoubleEquals() + throws Exception { + + testGetChannelCurrenciesPageWithFilter("eq", EntityField.Type.DOUBLE); + } + + @Test + public void testGetChannelCurrenciesPageWithFilterStringContains() + throws Exception { + + testGetChannelCurrenciesPageWithFilter( + "contains", EntityField.Type.STRING); + } + + @Test + public void testGetChannelCurrenciesPageWithFilterStringEquals() + throws Exception { + + testGetChannelCurrenciesPageWithFilter("eq", EntityField.Type.STRING); + } + + @Test + public void testGetChannelCurrenciesPageWithFilterStringStartsWith() + throws Exception { + + testGetChannelCurrenciesPageWithFilter( + "startswith", EntityField.Type.STRING); + } + + protected void testGetChannelCurrenciesPageWithFilter( + String operator, EntityField.Type type) + throws Exception { + + List entityFields = getEntityFields(type); + + if (entityFields.isEmpty()) { + return; + } + + Long channelId = testGetChannelCurrenciesPage_getChannelId(); + + Currency currency1 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + @SuppressWarnings("PMD.UnusedLocalVariable") + Currency currency2 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + for (EntityField entityField : entityFields) { + Page page = currencyResource.getChannelCurrenciesPage( + channelId, null, + getFilterString(entityField, operator, currency1), + Pagination.of(1, 2), null); + + assertEquals( + Collections.singletonList(currency1), + (List)page.getItems()); + } + } + + @Test + public void testGetChannelCurrenciesPageWithPagination() throws Exception { + Long channelId = testGetChannelCurrenciesPage_getChannelId(); + + Page currencyPage = currencyResource.getChannelCurrenciesPage( + channelId, null, null, null, null); + + int totalCount = GetterUtil.getInteger(currencyPage.getTotalCount()); + + Currency currency1 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + Currency currency2 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + Currency currency3 = testGetChannelCurrenciesPage_addCurrency( + channelId, randomCurrency()); + + // See com.liferay.portal.vulcan.internal.configuration.HeadlessAPICompanyConfiguration#pageSizeLimit + + int pageSizeLimit = 500; + + if (totalCount >= (pageSizeLimit - 2)) { + Page page1 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 1.0) / pageSizeLimit), + pageSizeLimit), + null); + + Assert.assertEquals(totalCount + 3, page1.getTotalCount()); + + assertContains(currency1, (List)page1.getItems()); + + Page page2 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 2.0) / pageSizeLimit), + pageSizeLimit), + null); + + assertContains(currency2, (List)page2.getItems()); + + Page page3 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, + Pagination.of( + (int)Math.ceil((totalCount + 3.0) / pageSizeLimit), + pageSizeLimit), + null); + + assertContains(currency3, (List)page3.getItems()); + } + else { + Page page1 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, Pagination.of(1, totalCount + 2), null); + + List currencies1 = (List)page1.getItems(); + + Assert.assertEquals( + currencies1.toString(), totalCount + 2, currencies1.size()); + + Page page2 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, Pagination.of(2, totalCount + 2), null); + + Assert.assertEquals(totalCount + 3, page2.getTotalCount()); + + List currencies2 = (List)page2.getItems(); + + Assert.assertEquals(currencies2.toString(), 1, currencies2.size()); + + Page page3 = currencyResource.getChannelCurrenciesPage( + channelId, null, null, Pagination.of(1, (int)totalCount + 3), + null); + + assertContains(currency1, (List)page3.getItems()); + assertContains(currency2, (List)page3.getItems()); + assertContains(currency3, (List)page3.getItems()); + } + } + + @Test + public void testGetChannelCurrenciesPageWithSortDateTime() + throws Exception { + + testGetChannelCurrenciesPageWithSort( + EntityField.Type.DATE_TIME, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty( + currency1, entityField.getName(), + new Date(System.currentTimeMillis() - (2 * Time.MINUTE))); + }); + } + + @Test + public void testGetChannelCurrenciesPageWithSortDouble() throws Exception { + testGetChannelCurrenciesPageWithSort( + EntityField.Type.DOUBLE, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty(currency1, entityField.getName(), 0.1); + BeanTestUtil.setProperty(currency2, entityField.getName(), 0.5); + }); + } + + @Test + public void testGetChannelCurrenciesPageWithSortInteger() throws Exception { + testGetChannelCurrenciesPageWithSort( + EntityField.Type.INTEGER, + (entityField, currency1, currency2) -> { + BeanTestUtil.setProperty(currency1, entityField.getName(), 0); + BeanTestUtil.setProperty(currency2, entityField.getName(), 1); + }); + } + + @Test + public void testGetChannelCurrenciesPageWithSortString() throws Exception { + testGetChannelCurrenciesPageWithSort( + EntityField.Type.STRING, + (entityField, currency1, currency2) -> { + Class clazz = currency1.getClass(); + + String entityFieldName = entityField.getName(); + + Method method = clazz.getMethod( + "get" + StringUtil.upperCaseFirstLetter(entityFieldName)); + + Class returnType = method.getReturnType(); + + if (returnType.isAssignableFrom(Map.class)) { + BeanTestUtil.setProperty( + currency1, entityFieldName, + Collections.singletonMap("Aaa", "Aaa")); + BeanTestUtil.setProperty( + currency2, entityFieldName, + Collections.singletonMap("Bbb", "Bbb")); + } + else if (entityFieldName.contains("email")) { + BeanTestUtil.setProperty( + currency1, entityFieldName, + "aaa" + + StringUtil.toLowerCase( + RandomTestUtil.randomString()) + + "@liferay.com"); + BeanTestUtil.setProperty( + currency2, entityFieldName, + "bbb" + + StringUtil.toLowerCase( + RandomTestUtil.randomString()) + + "@liferay.com"); + } + else { + BeanTestUtil.setProperty( + currency1, entityFieldName, + "aaa" + + StringUtil.toLowerCase( + RandomTestUtil.randomString())); + BeanTestUtil.setProperty( + currency2, entityFieldName, + "bbb" + + StringUtil.toLowerCase( + RandomTestUtil.randomString())); + } + }); + } + + protected void testGetChannelCurrenciesPageWithSort( + EntityField.Type type, + UnsafeTriConsumer + unsafeTriConsumer) + throws Exception { + + List entityFields = getEntityFields(type); + + if (entityFields.isEmpty()) { + return; + } + + Long channelId = testGetChannelCurrenciesPage_getChannelId(); + + Currency currency1 = randomCurrency(); + Currency currency2 = randomCurrency(); + + for (EntityField entityField : entityFields) { + unsafeTriConsumer.accept(entityField, currency1, currency2); + } + + currency1 = testGetChannelCurrenciesPage_addCurrency( + channelId, currency1); + + currency2 = testGetChannelCurrenciesPage_addCurrency( + channelId, currency2); + + Page page = currencyResource.getChannelCurrenciesPage( + channelId, null, null, null, null); + + for (EntityField entityField : entityFields) { + Page ascPage = currencyResource.getChannelCurrenciesPage( + channelId, null, null, + Pagination.of(1, (int)page.getTotalCount() + 1), + entityField.getName() + ":asc"); + + assertContains(currency1, (List)ascPage.getItems()); + assertContains(currency2, (List)ascPage.getItems()); + + Page descPage = currencyResource.getChannelCurrenciesPage( + channelId, null, null, + Pagination.of(1, (int)page.getTotalCount() + 1), + entityField.getName() + ":desc"); + + assertContains(currency2, (List)descPage.getItems()); + assertContains(currency1, (List)descPage.getItems()); + } + } + + protected Currency testGetChannelCurrenciesPage_addCurrency( + Long channelId, Currency currency) + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + protected Long testGetChannelCurrenciesPage_getChannelId() + throws Exception { + + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + protected Long testGetChannelCurrenciesPage_getIrrelevantChannelId() + throws Exception { + + return null; + } + + @Rule + public SearchTestRule searchTestRule = new SearchTestRule(); + + protected Currency testGraphQLCurrency_addCurrency() throws Exception { + throw new UnsupportedOperationException( + "This method needs to be implemented"); + } + + protected void assertContains( + Currency currency, List currencies) { + + boolean contains = false; + + for (Currency item : currencies) { + if (equals(currency, item)) { + contains = true; + + break; + } + } + + Assert.assertTrue( + currencies + " does not contain " + currency, contains); + } + + protected void assertHttpResponseStatusCode( + int expectedHttpResponseStatusCode, + HttpInvoker.HttpResponse actualHttpResponse) { + + Assert.assertEquals( + expectedHttpResponseStatusCode, actualHttpResponse.getStatusCode()); + } + + protected void assertEquals(Currency currency1, Currency currency2) { + Assert.assertTrue( + currency1 + " does not equal " + currency2, + equals(currency1, currency2)); + } + + protected void assertEquals( + List currencies1, List currencies2) { + + Assert.assertEquals(currencies1.size(), currencies2.size()); + + for (int i = 0; i < currencies1.size(); i++) { + Currency currency1 = currencies1.get(i); + Currency currency2 = currencies2.get(i); + + assertEquals(currency1, currency2); + } + } + + protected void assertEqualsIgnoringOrder( + List currencies1, List currencies2) { + + Assert.assertEquals(currencies1.size(), currencies2.size()); + + for (Currency currency1 : currencies1) { + boolean contains = false; + + for (Currency currency2 : currencies2) { + if (equals(currency1, currency2)) { + contains = true; + + break; + } + } + + Assert.assertTrue( + currencies2 + " does not contain " + currency1, contains); + } + } + + protected void assertValid(Currency currency) throws Exception { + boolean valid = true; + + if (currency.getId() == null) { + valid = false; + } + + for (String additionalAssertFieldName : + getAdditionalAssertFieldNames()) { + + if (Objects.equals("active", additionalAssertFieldName)) { + if (currency.getActive() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("code", additionalAssertFieldName)) { + if (currency.getCode() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals( + "externalReferenceCode", additionalAssertFieldName)) { + + if (currency.getExternalReferenceCode() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("formatPattern", additionalAssertFieldName)) { + if (currency.getFormatPattern() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals( + "maxFractionDigits", additionalAssertFieldName)) { + + if (currency.getMaxFractionDigits() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals( + "minFractionDigits", additionalAssertFieldName)) { + + if (currency.getMinFractionDigits() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("name", additionalAssertFieldName)) { + if (currency.getName() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("primary", additionalAssertFieldName)) { + if (currency.getPrimary() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("priority", additionalAssertFieldName)) { + if (currency.getPriority() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("rate", additionalAssertFieldName)) { + if (currency.getRate() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("roundingMode", additionalAssertFieldName)) { + if (currency.getRoundingMode() == null) { + valid = false; + } + + continue; + } + + if (Objects.equals("symbol", additionalAssertFieldName)) { + if (currency.getSymbol() == null) { + valid = false; + } + + continue; + } + + throw new IllegalArgumentException( + "Invalid additional assert field name " + + additionalAssertFieldName); + } + + Assert.assertTrue(valid); + } + + protected void assertValid(Page page) { + assertValid(page, Collections.emptyMap()); + } + + protected void assertValid( + Page page, Map> expectedActions) { + + boolean valid = false; + + java.util.Collection currencies = page.getItems(); + + int size = currencies.size(); + + if ((page.getLastPage() > 0) && (page.getPage() > 0) && + (page.getPageSize() > 0) && (page.getTotalCount() > 0) && + (size > 0)) { + + valid = true; + } + + Assert.assertTrue(valid); + + assertValid(page.getActions(), expectedActions); + } + + protected void assertValid( + Map> actions1, + Map> actions2) { + + for (String key : actions2.keySet()) { + Map action = actions1.get(key); + + Assert.assertNotNull(key + " does not contain an action", action); + + Map expectedAction = actions2.get(key); + + Assert.assertEquals( + expectedAction.get("method"), action.get("method")); + Assert.assertEquals(expectedAction.get("href"), action.get("href")); + } + } + + protected String[] getAdditionalAssertFieldNames() { + return new String[0]; + } + + protected List getGraphQLFields() throws Exception { + List graphQLFields = new ArrayList<>(); + + for (java.lang.reflect.Field field : + getDeclaredFields( + com.liferay.headless.commerce.delivery.catalog.dto.v1_0. + Currency.class)) { + + if (!ArrayUtil.contains( + getAdditionalAssertFieldNames(), field.getName())) { + + continue; + } + + graphQLFields.addAll(getGraphQLFields(field)); + } + + return graphQLFields; + } + + protected List getGraphQLFields( + java.lang.reflect.Field... fields) + throws Exception { + + List graphQLFields = new ArrayList<>(); + + for (java.lang.reflect.Field field : fields) { + com.liferay.portal.vulcan.graphql.annotation.GraphQLField + vulcanGraphQLField = field.getAnnotation( + com.liferay.portal.vulcan.graphql.annotation.GraphQLField. + class); + + if (vulcanGraphQLField != null) { + Class clazz = field.getType(); + + if (clazz.isArray()) { + clazz = clazz.getComponentType(); + } + + List childrenGraphQLFields = getGraphQLFields( + getDeclaredFields(clazz)); + + graphQLFields.add( + new GraphQLField(field.getName(), childrenGraphQLFields)); + } + } + + return graphQLFields; + } + + protected String[] getIgnoredEntityFieldNames() { + return new String[0]; + } + + protected boolean equals(Currency currency1, Currency currency2) { + if (currency1 == currency2) { + return true; + } + + for (String additionalAssertFieldName : + getAdditionalAssertFieldNames()) { + + if (Objects.equals("active", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getActive(), currency2.getActive())) { + + return false; + } + + continue; + } + + if (Objects.equals("code", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getCode(), currency2.getCode())) { + + return false; + } + + continue; + } + + if (Objects.equals( + "externalReferenceCode", additionalAssertFieldName)) { + + if (!Objects.deepEquals( + currency1.getExternalReferenceCode(), + currency2.getExternalReferenceCode())) { + + return false; + } + + continue; + } + + if (Objects.equals("formatPattern", additionalAssertFieldName)) { + if (!equals( + (Map)currency1.getFormatPattern(), + (Map)currency2.getFormatPattern())) { + + return false; + } + + continue; + } + + if (Objects.equals("id", additionalAssertFieldName)) { + if (!Objects.deepEquals(currency1.getId(), currency2.getId())) { + return false; + } + + continue; + } + + if (Objects.equals( + "maxFractionDigits", additionalAssertFieldName)) { + + if (!Objects.deepEquals( + currency1.getMaxFractionDigits(), + currency2.getMaxFractionDigits())) { + + return false; + } + + continue; + } + + if (Objects.equals( + "minFractionDigits", additionalAssertFieldName)) { + + if (!Objects.deepEquals( + currency1.getMinFractionDigits(), + currency2.getMinFractionDigits())) { + + return false; + } + + continue; + } + + if (Objects.equals("name", additionalAssertFieldName)) { + if (!equals( + (Map)currency1.getName(), (Map)currency2.getName())) { + + return false; + } + + continue; + } + + if (Objects.equals("primary", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getPrimary(), currency2.getPrimary())) { + + return false; + } + + continue; + } + + if (Objects.equals("priority", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getPriority(), currency2.getPriority())) { + + return false; + } + + continue; + } + + if (Objects.equals("rate", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getRate(), currency2.getRate())) { + + return false; + } + + continue; + } + + if (Objects.equals("roundingMode", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getRoundingMode(), + currency2.getRoundingMode())) { + + return false; + } + + continue; + } + + if (Objects.equals("symbol", additionalAssertFieldName)) { + if (!Objects.deepEquals( + currency1.getSymbol(), currency2.getSymbol())) { + + return false; + } + + continue; + } + + throw new IllegalArgumentException( + "Invalid additional assert field name " + + additionalAssertFieldName); + } + + return true; + } + + protected boolean equals( + Map map1, Map map2) { + + if (Objects.equals(map1.keySet(), map2.keySet())) { + for (Map.Entry entry : map1.entrySet()) { + if (entry.getValue() instanceof Map) { + if (!equals( + (Map)entry.getValue(), + (Map)map2.get(entry.getKey()))) { + + return false; + } + } + else if (!Objects.deepEquals( + entry.getValue(), map2.get(entry.getKey()))) { + + return false; + } + } + + return true; + } + + return false; + } + + protected java.lang.reflect.Field[] getDeclaredFields(Class clazz) + throws Exception { + + if (clazz.getClassLoader() == null) { + return new java.lang.reflect.Field[0]; + } + + return TransformUtil.transform( + ReflectionUtil.getDeclaredFields(clazz), + field -> { + if (field.isSynthetic()) { + return null; + } + + return field; + }, + java.lang.reflect.Field.class); + } + + protected java.util.Collection getEntityFields() + throws Exception { + + if (!(_currencyResource instanceof EntityModelResource)) { + throw new UnsupportedOperationException( + "Resource is not an instance of EntityModelResource"); + } + + EntityModelResource entityModelResource = + (EntityModelResource)_currencyResource; + + EntityModel entityModel = entityModelResource.getEntityModel( + new MultivaluedHashMap()); + + if (entityModel == null) { + return Collections.emptyList(); + } + + Map entityFieldsMap = + entityModel.getEntityFieldsMap(); + + return entityFieldsMap.values(); + } + + protected List getEntityFields(EntityField.Type type) + throws Exception { + + return TransformUtil.transform( + getEntityFields(), + entityField -> { + if (!Objects.equals(entityField.getType(), type) || + ArrayUtil.contains( + getIgnoredEntityFieldNames(), entityField.getName())) { + + return null; + } + + return entityField; + }); + } + + protected String getFilterString( + EntityField entityField, String operator, Currency currency) { + + StringBundler sb = new StringBundler(); + + String entityFieldName = entityField.getName(); + + sb.append(entityFieldName); + + sb.append(" "); + sb.append(operator); + sb.append(" "); + + if (entityFieldName.equals("active")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("code")) { + Object object = currency.getCode(); + + String value = String.valueOf(object); + + if (operator.equals("contains")) { + sb = new StringBundler(); + + sb.append("contains("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 2)) { + sb.append(value.substring(1, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else if (operator.equals("startswith")) { + sb = new StringBundler(); + + sb.append("startswith("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 1)) { + sb.append(value.substring(0, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else { + sb.append("'"); + sb.append(value); + sb.append("'"); + } + + return sb.toString(); + } + + if (entityFieldName.equals("externalReferenceCode")) { + Object object = currency.getExternalReferenceCode(); + + String value = String.valueOf(object); + + if (operator.equals("contains")) { + sb = new StringBundler(); + + sb.append("contains("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 2)) { + sb.append(value.substring(1, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else if (operator.equals("startswith")) { + sb = new StringBundler(); + + sb.append("startswith("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 1)) { + sb.append(value.substring(0, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else { + sb.append("'"); + sb.append(value); + sb.append("'"); + } + + return sb.toString(); + } + + if (entityFieldName.equals("formatPattern")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("id")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("maxFractionDigits")) { + sb.append(String.valueOf(currency.getMaxFractionDigits())); + + return sb.toString(); + } + + if (entityFieldName.equals("minFractionDigits")) { + sb.append(String.valueOf(currency.getMinFractionDigits())); + + return sb.toString(); + } + + if (entityFieldName.equals("name")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("primary")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("priority")) { + sb.append(String.valueOf(currency.getPriority())); + + return sb.toString(); + } + + if (entityFieldName.equals("rate")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("roundingMode")) { + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + if (entityFieldName.equals("symbol")) { + Object object = currency.getSymbol(); + + String value = String.valueOf(object); + + if (operator.equals("contains")) { + sb = new StringBundler(); + + sb.append("contains("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 2)) { + sb.append(value.substring(1, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else if (operator.equals("startswith")) { + sb = new StringBundler(); + + sb.append("startswith("); + sb.append(entityFieldName); + sb.append(",'"); + + if ((object != null) && (value.length() > 1)) { + sb.append(value.substring(0, value.length() - 1)); + } + else { + sb.append(value); + } + + sb.append("')"); + } + else { + sb.append("'"); + sb.append(value); + sb.append("'"); + } + + return sb.toString(); + } + + throw new IllegalArgumentException( + "Invalid entity field " + entityFieldName); + } + + protected String invoke(String query) throws Exception { + HttpInvoker httpInvoker = HttpInvoker.newHttpInvoker(); + + httpInvoker.body( + JSONUtil.put( + "query", query + ).toString(), + "application/json"); + httpInvoker.httpMethod(HttpInvoker.HttpMethod.POST); + httpInvoker.path("http://localhost:8080/o/graphql"); + httpInvoker.userNameAndPassword( + "test@liferay.com:" + PropsValues.DEFAULT_ADMIN_PASSWORD); + + HttpInvoker.HttpResponse httpResponse = httpInvoker.invoke(); + + return httpResponse.getContent(); + } + + protected JSONObject invokeGraphQLMutation(GraphQLField graphQLField) + throws Exception { + + GraphQLField mutationGraphQLField = new GraphQLField( + "mutation", graphQLField); + + return JSONFactoryUtil.createJSONObject( + invoke(mutationGraphQLField.toString())); + } + + protected JSONObject invokeGraphQLQuery(GraphQLField graphQLField) + throws Exception { + + GraphQLField queryGraphQLField = new GraphQLField( + "query", graphQLField); + + return JSONFactoryUtil.createJSONObject( + invoke(queryGraphQLField.toString())); + } + + protected Currency randomCurrency() throws Exception { + return new Currency() { + { + active = RandomTestUtil.randomBoolean(); + code = StringUtil.toLowerCase(RandomTestUtil.randomString()); + externalReferenceCode = StringUtil.toLowerCase( + RandomTestUtil.randomString()); + id = RandomTestUtil.randomLong(); + maxFractionDigits = RandomTestUtil.randomInt(); + minFractionDigits = RandomTestUtil.randomInt(); + primary = RandomTestUtil.randomBoolean(); + priority = RandomTestUtil.randomDouble(); + symbol = StringUtil.toLowerCase(RandomTestUtil.randomString()); + } + }; + } + + protected Currency randomIrrelevantCurrency() throws Exception { + Currency randomIrrelevantCurrency = randomCurrency(); + + return randomIrrelevantCurrency; + } + + protected Currency randomPatchCurrency() throws Exception { + return randomCurrency(); + } + + protected CurrencyResource currencyResource; + protected com.liferay.portal.kernel.model.Group irrelevantGroup; + protected com.liferay.portal.kernel.model.Company testCompany; + protected com.liferay.portal.kernel.model.Group testGroup; + + protected static class BeanTestUtil { + + public static void copyProperties(Object source, Object target) + throws Exception { + + Class sourceClass = source.getClass(); + + Class targetClass = target.getClass(); + + for (java.lang.reflect.Field field : + _getAllDeclaredFields(sourceClass)) { + + if (field.isSynthetic()) { + continue; + } + + Method getMethod = _getMethod( + sourceClass, field.getName(), "get"); + + try { + Method setMethod = _getMethod( + targetClass, field.getName(), "set", + getMethod.getReturnType()); + + setMethod.invoke(target, getMethod.invoke(source)); + } + catch (Exception e) { + continue; + } + } + } + + public static boolean hasProperty(Object bean, String name) { + Method setMethod = _getMethod( + bean.getClass(), "set" + StringUtil.upperCaseFirstLetter(name)); + + if (setMethod != null) { + return true; + } + + return false; + } + + public static void setProperty(Object bean, String name, Object value) + throws Exception { + + Class clazz = bean.getClass(); + + Method setMethod = _getMethod( + clazz, "set" + StringUtil.upperCaseFirstLetter(name)); + + if (setMethod == null) { + throw new NoSuchMethodException(); + } + + Class[] parameterTypes = setMethod.getParameterTypes(); + + setMethod.invoke(bean, _translateValue(parameterTypes[0], value)); + } + + private static List _getAllDeclaredFields( + Class clazz) { + + List fields = new ArrayList<>(); + + while ((clazz != null) && (clazz != Object.class)) { + for (java.lang.reflect.Field field : + clazz.getDeclaredFields()) { + + fields.add(field); + } + + clazz = clazz.getSuperclass(); + } + + return fields; + } + + private static Method _getMethod(Class clazz, String name) { + for (Method method : clazz.getMethods()) { + if (name.equals(method.getName()) && + (method.getParameterCount() == 1) && + _parameterTypes.contains(method.getParameterTypes()[0])) { + + return method; + } + } + + return null; + } + + private static Method _getMethod( + Class clazz, String fieldName, String prefix, + Class... parameterTypes) + throws Exception { + + return clazz.getMethod( + prefix + StringUtil.upperCaseFirstLetter(fieldName), + parameterTypes); + } + + private static Object _translateValue( + Class parameterType, Object value) { + + if ((value instanceof Integer) && + parameterType.equals(Long.class)) { + + Integer intValue = (Integer)value; + + return intValue.longValue(); + } + + return value; + } + + private static final Set> _parameterTypes = new HashSet<>( + Arrays.asList( + Boolean.class, Date.class, Double.class, Integer.class, + Long.class, Map.class, String.class)); + + } + + protected class GraphQLField { + + public GraphQLField(String key, GraphQLField... graphQLFields) { + this(key, new HashMap<>(), graphQLFields); + } + + public GraphQLField(String key, List graphQLFields) { + this(key, new HashMap<>(), graphQLFields); + } + + public GraphQLField( + String key, Map parameterMap, + GraphQLField... graphQLFields) { + + _key = key; + _parameterMap = parameterMap; + _graphQLFields = Arrays.asList(graphQLFields); + } + + public GraphQLField( + String key, Map parameterMap, + List graphQLFields) { + + _key = key; + _parameterMap = parameterMap; + _graphQLFields = graphQLFields; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(_key); + + if (!_parameterMap.isEmpty()) { + sb.append("("); + + for (Map.Entry entry : + _parameterMap.entrySet()) { + + sb.append(entry.getKey()); + sb.append(": "); + sb.append(entry.getValue()); + sb.append(", "); + } + + sb.setLength(sb.length() - 2); + + sb.append(")"); + } + + if (!_graphQLFields.isEmpty()) { + sb.append("{"); + + for (GraphQLField graphQLField : _graphQLFields) { + sb.append(graphQLField.toString()); + sb.append(", "); + } + + sb.setLength(sb.length() - 2); + + sb.append("}"); + } + + return sb.toString(); + } + + private final List _graphQLFields; + private final String _key; + private final Map _parameterMap; + + } + + private static final com.liferay.portal.kernel.log.Log _log = + LogFactoryUtil.getLog(BaseCurrencyResourceTestCase.class); + + private static DateFormat _dateFormat; + + @Inject + private com.liferay.headless.commerce.delivery.catalog.resource.v1_0. + CurrencyResource _currencyResource; + +} \ No newline at end of file diff --git a/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/CurrencyResourceTest.java b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/CurrencyResourceTest.java new file mode 100644 index 00000000000000..92fa8f5eb1352c --- /dev/null +++ b/modules/apps/commerce/headless/headless-commerce/headless-commerce-delivery-catalog-test/src/testIntegration/java/com/liferay/headless/commerce/delivery/catalog/resource/v1_0/test/CurrencyResourceTest.java @@ -0,0 +1,19 @@ +/** + * SPDX-FileCopyrightText: (c) 2025 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +package com.liferay.headless.commerce.delivery.catalog.resource.v1_0.test; + +import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian; + +import org.junit.Ignore; +import org.junit.runner.RunWith; + +/** + * @author Andrea Sbarra + */ +@Ignore +@RunWith(Arquillian.class) +public class CurrencyResourceTest extends BaseCurrencyResourceTestCase { +} \ No newline at end of file diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language.properties index 9e7dc57a8589da..24e1e9a58ea36b 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path certificate-url=Certificate URL chain-method=Chain Method change=Change +change-active-currency=Change Active Currency change-assignment=Change Assignment change-clickable-element=Change Clickable Element change-collection=Change Collection @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? channel=Channel channel-account-managers=Channel Account Managers channel-defaults=Channel Defaults @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies currency=Currency currency-code=Currency Code currency-id=Currency ID +currency-selector=Currency Selector currency-symbols=Currency Symbols currency.AED=UAE Dirham currency.ALL=Albanian Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. feature.flag.LPD-32649.title=Spaces Section feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. feature.flag.LPD-34594.title=Root Object Definitions +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ar.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ar.properties index bba312477782e4..bf340b447d004a 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ar.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ar.properties @@ -3360,6 +3360,7 @@ certificate-path-name=مسار الشهادة certificate-url=عنوان URL للشهادة chain-method=طريقة السلسلة change=غيّر +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=تغيير التعيين change-clickable-element=تغيير العنصر القابل للنقر change-collection=تغيير المجموعة @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=لن يؤثر تغيير النموذج على القالب الافتراضي لمحتوى الويب الأصلي. لا ينطبق التغيير إلا على عرض محتوى الويب هذا فقط. changing-the-value-of-this-field-reloads-the-page=تغيير قيمة هذا الحقل سيعيد تحميل الصفحة. changing-this-setting-will-reset-all-mappings-for-this-collection=تغيير هذا الإعداد سوف يعيد تعيين جميع الارتباطات لهذه المجموعة. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=القناة channel-account-managers=مديرو حسابات القنوات channel-defaults=افتراضيات القناة @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=العملات التجارية currency=العملة currency-code=رمز العملة currency-id=معرِّف العملة +currency-selector=Currency Selector (Automatic Copy) currency-symbols=رموز العملات currency.AED=درهم اماراتي currency.ALL=ليك ألباني @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=يمكن للمستخدمين إنشاء تدرجات هرمية لتعريفات الكائنات من خلال تحديد تعريف الكائن الجذر. تكون تعريفات الكائنات الفرعية مرتبطة بالجذر وترث الأذونات وتتخذ تكوين عنصر الواجهة من تعريف الكائن الجذر. ويتم دمج نقاط نهاية API لتعريفات الكائنات الفرعية مع نقاط النهاية الجذر. feature.flag.LPD-34594.title=تعريفات الكائنات الجذر +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=تم إهمال مقالة Wiki وسوف تتم إزالتها في المستقبل. لتفادي فقدان البيانات، يجب ترحيل بياناتك إلى Liferay Object. feature.flag.LPD-35013.title=ويكي feature.flag.LPD-35678.description=سماح للمستخدمين على قنوات B2B وB2X باستخدام السداد مع الخروج للضيف أو تسجيل الدخول ونقل سلة تسوقهم إلى حساب أعمال. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_bg.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_bg.properties index 383e63ca5edfd2..4794052d730720 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_bg.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_bg.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Път на сертификат (Automatic Translation) certificate-url=URL адрес на сертификат (Automatic Translation) chain-method=Метод на веригата (Automatic Translation) change=Промяна +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Промяна на елемент, върху който може да се кликне (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Промяната на стойността на това поле презарежда страницата. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=канал (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Търговски валути (Automatic currency=Валута currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Символи на валута currency.AED=дирхам на Обединените арабски емирства (Automatic Translation) currency.ALL=Албански лек @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ca.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ca.properties index dfe17709297123..63a80dff04f4d5 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ca.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ca.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Camí del certificat certificate-url=URL del certificat chain-method=Mètode de cadena change=Canvia +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Canvia l'assignació change-clickable-element=Canvia l'element clicable change-collection=Canvia la col·lecció @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Canviar la plantilla no afectarà la plantilla predeterminada del contingut web original. El canvi només afectarà aquesta visualització de contingut web. changing-the-value-of-this-field-reloads-the-page=Si es canvia el valor d'aquest camp es tornarà a carregar la pàgina. changing-this-setting-will-reset-all-mappings-for-this-collection=Si es canvia aquest paràmetre es restabliran tots els mapatges d'aquesta col·lecció. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gestors de comptes de canal channel-defaults=Valors per defecte del canal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Monedes de comerç currency=Moneda currency-code=Codi de moneda currency-id=ID de moneda +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbols de moneda currency.AED=dírham de la UEA currency.ALL=lek d'Albània @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Mostra i gestiona espais al nou CMS. feature.flag.LPD-32649.title=Secció Espais feature.flag.LPD-34594.description=Els usuaris poden crear jerarquies de definició d'objecte definint una definició d'objecte arrel. Les definicions d'objecte fill estan vinculades a l'arrel i hereten els permisos i la configuració del giny de la definició d'objecte arrel. Els endpoints de l'API de les definicions de l'objecte fill estan fusionats amb els endpoints de l'arrel. feature.flag.LPD-34594.title=Definicions d'objecte arrel +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=La wiki és obsoleta i se suprimirà més endavant. Per evitar la pèrdua de dades, heu de migrar les vostres dades a Liferay Object. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permet que els usuaris dels canals B2B i B2X utilitzin la finalització de la compra del convidat o iniciïn la sessió i transfereixin el seu cistell a un compte empresarial. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_cs.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_cs.properties index e4c5f3e9093026..ac211e857b9cde 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_cs.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_cs.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Změnit +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Změna této položky způsobí znovu-načtení stránky. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanál (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Měna currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symbol měny currency.AED=UAE dirham currency.ALL=Albánský Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_da.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_da.properties index f34ae304903ffc..a0e30b4ec856f7 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_da.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_da.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Sti til certifikat (Automatic Translation) certificate-url=URL-adresse til certifikat (Automatic Translation) chain-method=Kædemetode (Automatic Translation) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Skift element, der kan klikkes på (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanal (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Handelsvalutaer (Automatic Translation) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymboler currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Kontrolpanel) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de.properties index 538b502c48a5c0..9632491b9ddc64 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Zertifikatspfad certificate-url=URL des Zertifikats chain-method=Kettenmethode change=Ändern +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Zuweisung ändern change-clickable-element=Klickbares Element ändern change-collection=Sammlung ändern @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Das Verändern der Vorlage hat keine Auswirkungen auf die Standardvorlage des originalen Web-Inhalts. Die Veränderung gilt nur für die Anzeige dieses Web-Inhalts. changing-the-value-of-this-field-reloads-the-page=Das Ändern des Wertes dieses Feldes lädt die Seite neu. changing-this-setting-will-reset-all-mappings-for-this-collection=Wenn Sie diese Einstellung ändern, werden alle Zuordnungen für diese Sammlung zurückgesetzt. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Kanal-Kundenbetreuer channel-defaults=Kanalstandardwerte @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Währungen currency=Währung currency-code=Währungscode currency-id=Währungs-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Währungssymbole currency.AED=Arabische Dirham currency.ALL=Albanischer Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Benutzer können Objektdefinitionshierarchien erstellen, indem sie eine Stammobjektdefinition definieren. Untergeordnete Objektdefinitionen sind an den Stamm gebunden und erben Berechtigungen und Widget-Konfigurationen von der Stammobjektdefinition. Die API-Endpunkte der untergeordneten Objektdefinitionen werden mit den Endpunkten des Stamms zusammengeführt. feature.flag.LPD-34594.title=Stammobjekt-Definitionen +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki ist veraltet und wird zukünftig entfernt werden. Bitte migrieren Sie Ihre Daten bis dahin zu Liferay Object, um einen Datenverlust zu vermeiden. feature.flag.LPD-35013.title=Wikis feature.flag.LPD-35678.description=Ermöglichen Sie Benutzern auf B2B- und B2X-Kanälen, als Gast zu bezahlen oder sich anzumelden und ihren Warenkorb auf ein Geschäftskonto zu übertragen. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_AT.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_AT.properties index 7da887c93e5938..9af40d5930a1db 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_AT.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_AT.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Zertifikatspfad certificate-url=URL des Zertifikats chain-method=Kettenmethode change=Ändern +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Zuweisung ändern change-clickable-element=Klickbares Element ändern change-collection=Sammlung ändern @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Das Verändern der Vorlage hat keine Auswirkungen auf die Standardvorlage des originalen Web-Inhalts. Die Veränderung gilt nur für die Anzeige dieses Web-Inhalts. changing-the-value-of-this-field-reloads-the-page=Das Ändern des Wertes dieses Feldes lädt die Seite neu. changing-this-setting-will-reset-all-mappings-for-this-collection=Wenn Sie diese Einstellung ändern, werden alle Zuordnungen für diese Sammlung zurückgesetzt. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Kanal-Kundenbetreuer channel-defaults=Kanalstandardwerte @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Währungen currency=Währung currency-code=Währungscode currency-id=Währungs-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Währungssymbole currency.AED=Arabische Dirham currency.ALL=Albanischer Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Benutzer können Objektdefinitionshierarchien erstellen, indem sie eine Stammobjektdefinition definieren. Untergeordnete Objektdefinitionen sind an den Stamm gebunden und erben Berechtigungen und Widget-Konfigurationen von der Stammobjektdefinition. Die API-Endpunkte der untergeordneten Objektdefinitionen werden mit den Endpunkten des Stamms zusammengeführt. feature.flag.LPD-34594.title=Stammobjekt-Definitionen +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki ist veraltet und wird zukünftig entfernt werden. Bitte migrieren Sie Ihre Daten bis dahin zu Liferay Object, um einen Datenverlust zu vermeiden. feature.flag.LPD-35013.title=Wikis feature.flag.LPD-35678.description=Ermöglichen Sie Benutzern auf B2B- und B2X-Kanälen, als Gast zu bezahlen oder sich anzumelden und ihren Warenkorb auf ein Geschäftskonto zu übertragen. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_CH.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_CH.properties index 7da887c93e5938..9af40d5930a1db 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_CH.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_de_CH.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Zertifikatspfad certificate-url=URL des Zertifikats chain-method=Kettenmethode change=Ändern +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Zuweisung ändern change-clickable-element=Klickbares Element ändern change-collection=Sammlung ändern @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Das Verändern der Vorlage hat keine Auswirkungen auf die Standardvorlage des originalen Web-Inhalts. Die Veränderung gilt nur für die Anzeige dieses Web-Inhalts. changing-the-value-of-this-field-reloads-the-page=Das Ändern des Wertes dieses Feldes lädt die Seite neu. changing-this-setting-will-reset-all-mappings-for-this-collection=Wenn Sie diese Einstellung ändern, werden alle Zuordnungen für diese Sammlung zurückgesetzt. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Kanal-Kundenbetreuer channel-defaults=Kanalstandardwerte @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Währungen currency=Währung currency-code=Währungscode currency-id=Währungs-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Währungssymbole currency.AED=Arabische Dirham currency.ALL=Albanischer Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Benutzer können Objektdefinitionshierarchien erstellen, indem sie eine Stammobjektdefinition definieren. Untergeordnete Objektdefinitionen sind an den Stamm gebunden und erben Berechtigungen und Widget-Konfigurationen von der Stammobjektdefinition. Die API-Endpunkte der untergeordneten Objektdefinitionen werden mit den Endpunkten des Stamms zusammengeführt. feature.flag.LPD-34594.title=Stammobjekt-Definitionen +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki ist veraltet und wird zukünftig entfernt werden. Bitte migrieren Sie Ihre Daten bis dahin zu Liferay Object, um einen Datenverlust zu vermeiden. feature.flag.LPD-35013.title=Wikis feature.flag.LPD-35678.description=Ermöglichen Sie Benutzern auf B2B- und B2X-Kanälen, als Gast zu bezahlen oder sich anzumelden und ihren Warenkorb auf ein Geschäftskonto zu übertragen. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_el.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_el.properties index a00b00459950f0..ef0101e6cab7d3 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_el.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_el.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Διαδρομή πιστοποιητικού (Automatic T certificate-url=Διεύθυνση URL πιστοποιητικού (Automatic Translation) chain-method=Μέθοδος αλυσίδας (Automatic Translation) change=Αλλαγή +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Αλλαγή στοιχείου με δυνατότητα κλικ (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Με την αλλαγή της τιμής αυτού του πεδίου η σελίδα θα ξαναφορτωθεί. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=κανάλι (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Εμπορικά Νομίσματα (Autom currency=Συνάλλαγμα currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Σύμβολα νομισμάτων currency.AED=UAE Ντιρχάμ currency.ALL=Λεκ Αλβανίας @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (πίνακας ελέγχου) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en.properties index 9e7dc57a8589da..24e1e9a58ea36b 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path certificate-url=Certificate URL chain-method=Chain Method change=Change +change-active-currency=Change Active Currency change-assignment=Change Assignment change-clickable-element=Change Clickable Element change-collection=Change Collection @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? channel=Channel channel-account-managers=Channel Account Managers channel-defaults=Channel Defaults @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies currency=Currency currency-code=Currency Code currency-id=Currency ID +currency-selector=Currency Selector currency-symbols=Currency Symbols currency.AED=UAE Dirham currency.ALL=Albanian Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. feature.flag.LPD-32649.title=Spaces Section feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. feature.flag.LPD-34594.title=Root Object Definitions +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_AU.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_AU.properties index e8375b6498eeb1..e59da6190e43b2 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_AU.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_AU.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Currency (Automatic Copy) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols (Automatic Copy) currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_CA.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_CA.properties index dec91126c26995..12ea4de848b919 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_CA.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_CA.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Currency (Automatic Copy) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols (Automatic Copy) currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_GB.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_GB.properties index c90e433ba9c41b..8ba2441d106cdc 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_GB.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_en_GB.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Currency (Automatic Copy) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols (Automatic Copy) currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es.properties index f86ceeaeee47c9..a5041e5accc187 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Ruta del certificado certificate-url=URL de certificado chain-method=Método encadenado change=Cambiar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Cambiar asignación change-clickable-element=Cambiar elemento interactivo change-collection=Cambiar colección @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Aunque se cambie la plantilla, esto no afectará a la plantilla por defecto de contenido web original. El cambio solo se aplica en esta visualización de contenido web. changing-the-value-of-this-field-reloads-the-page=Cambiar el valor de este campo provocará que se recargue la página. changing-this-setting-will-reset-all-mappings-for-this-collection=El cambio de esta configuración restaurará todas las asignaciones de esta colección. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gestores de cuentas de canal channel-defaults=Valores por defecto del canal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Monedas de comercio currency=Moneda currency-code=Código de divisa currency-id=Identificador de divisa +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos de moneda currency.AED=Dirham de los EAU currency.ALL=Lek Albanés @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Los usuarios pueden crear jerarquías de definiciones de objeto al definir una definición del objeto raíz. Las definiciones de objetos hijo están ligadas a la raíz y heredan la configuración de widgets y permisos de la definición del objeto raíz. Los endpoints de la API de las definiciones de objetos hijo están fusionados con los endpoints raíz. feature.flag.LPD-34594.title=Definiciones de objetos raíz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=La wiki está en desuso y se quitará en el futuro. Para evitar la pérdida de datos, debe migrarlos a Objeto. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permitir que los usuarios de los canales B2B y B2X utilicen la finalización de compra de invitado o que inicien sesión y transfieran su cesta a una cuenta empresarial. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_AR.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_AR.properties index bc0ecb052ae2ac..eaf7bb71089ab6 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_AR.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_AR.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Añadir un voto action.ADD_WAREHOUSE=Añadir almacén action.ADMINISTRATE=Administrar action.ADMINISTRATOR=Administrador -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Actualización avanzada action.APPLY_SXP_BLUEPRINT=Aplicar plano action.APPROVE_ARTICLE=Aprobar un contenido web action.APPROVE_OPEN_COMMERCE_ORDERS=Aprobar pedidos abiertos @@ -962,7 +962,7 @@ add-new-attribute=Añadir nuevo atributo add-new-categories-or-remove-common-categories=Añada nuevas categorías o quite categorías comunes. add-new-category=Añadir una categoría add-new-entry-to-x=Añadir nueva entrada a {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Añada nuevos campos para comenzar a crear su estructura. add-new-group=Añadir nuevo grupo add-new-grouped-entry-to-x=Añadir nueva entrada agrupada a {0} add-new-in-x=Añadir nuevo en {0} @@ -1429,7 +1429,7 @@ allow-origin-port=Permitir puerto de origen allow-origin-port-description=Habilite esta opción para permitir cualquier número de puerto en la regla de coincidencia de origen. allow-origin-subdomain=Permitir subdominio de origen allow-origin-subdomain-description=Habilite esta opción para que la regla de coincidencia de origen permita cualquier subdominio de cualquier profundidad. -allow-overriding-an-entry's-friendly-url=Allow Overriding an Entry's Friendly URL (Automatic Copy) +allow-overriding-an-entry's-friendly-url=Permitir sobreescribir la URL descriptiva de una entrada allow-pingbacks=Permitir Pingbacks allow-request-a-quote-on-a-fully-priced-cart=Permitir la petición de un presupuesto para una cesta con el precio completo allow-respondents-to-see-the-current-forms-report-data=Permite a los participantes ver los datos de informes de formularios actuales. No solicite datos personales o confidenciales. @@ -3122,7 +3122,7 @@ categories-for-this-item=Categorías para este elemento categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Las categorías solo aparecerán en la URL cuando la entrada del blog está asociada a una página de visualización. categories[message-board]=Categorías categorization=Categorización -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Nombres de las clases de categorización categorization-configuration-name=Categorización categorization-is-disabled-for-the-selected-content=La categorización está deshabilitada para el contenido seleccionado. La categorización se debe habilitar para mostrar las categorías en este fragmento. categorization-of-object-entries=Categorización de entradas del objeto @@ -3360,6 +3360,7 @@ certificate-path-name=Ruta del certificado certificate-url=URL de certificado chain-method=Método encadenado change=Cambiar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Cambiar asignación change-clickable-element=Cambiar elemento interactivo change-collection=Cambiar colección @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Aunque se cambie la plantilla, esto no afectará a la plantilla por defecto de contenido web original. El cambio solo se aplica en esta visualización de contenido web. changing-the-value-of-this-field-reloads-the-page=Cambiar el valor de este campo provocará que se recargue la página. changing-this-setting-will-reset-all-mappings-for-this-collection=El cambio de esta configuración restaurará todas las asignaciones de esta colección. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gestores de cuentas de canal channel-defaults=Valores por defecto del canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Haga clic aquí para consultar la documentación. click-here-to-preview-the-form-in-a-new-window=Haga clic aquí para previsualizar el formulario en una nueva ventana click-here-to-save-it-now=Pulse aquí para salvarlo ahora. click-new-to-create-your-first-asset=Haga clic en «Nuevo» para crear su primer activo. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Haga clic en «Nuevo» para crear su primer archivo. +click-new-to-create-your-first-piece-of-content=Haga clic en «Nuevo» para crear su primer contenido. click-ok-to-create-a-new-thread-with-the-following-messages=Haga clic en Aceptar para crear un hilo de discusión con los siguientes mensajes. click-on-any-tag-to-edit-it=Pulse en una etiqueta para editarla. click-on-the-object-fields-in-the-sidebar-to-add-properties=Haga clic en los campos de objeto de la barra lateral para añadir propiedades. @@ -3799,7 +3801,7 @@ close-search=Cerrar búsqueda close-sidebar=Cerrar barra lateral close-x=Cerrar {0} closed=Cerrado -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=Cerrar la ventana no cancelará el proceso. cloud=Nube club-event=Evento del club cluster=Clúster @@ -3808,7 +3810,7 @@ cluster-name=Nombre del clúster cluster-name-help=El nombre del clúster al que unirse. El nombre debe coincidir con el clúster remoto cuando el modo de operación se establece en REMOTE (remoto). cluster-node-address-timeout=Tiempo de espera de la dirección del nodo del clúster cmis-repository-configuration-name=Repositorio CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Inicializador del sitio CMS code=Código code-file-mime-types=Tipos MIME de archivo de código code-of-the-element=Código del elemento @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Monedas de comercio currency=Moneda currency-code=Código de divisa currency-id=Identificador de divisa +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos de moneda currency.AED=Dirham de los EAU currency.ALL=Lek Albanés @@ -5879,7 +5882,7 @@ desktop=Escritorio desktop-view=Vista de escritorio destination=Destino destination-address=Dirección de destino -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=Identificador de la compañía de destino destination-directory=Directorio de destino destination-field=Campo de destino destination-name=Nombre de destino @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Los usuarios pueden crear jerarquías de definiciones de objeto al definir una definición del objeto raíz. Las definiciones de objetos hijo están ligadas a la raíz y heredan la configuración de widgets y permisos de la definición del objeto raíz. Los endpoints de la API de las definiciones de objetos hijo están fusionados con los endpoints raíz. feature.flag.LPD-34594.title=Definiciones de objetos raíz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=La wiki está en desuso y se quitará en el futuro. Para evitar la pérdida de datos, debe migrarlos a Objeto. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permitir que los usuarios de los canales B2B y B2X utilicen la finalización de compra de invitado o que inicien sesión y transfieran su cesta a una cuenta empresarial. @@ -7594,8 +7599,8 @@ feature.flag.LPD-48372.description=El cargador AMD está en desuso y se quitará feature.flag.LPD-48372.title=Cargador AMD feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48975.description=Quita la habilitación de Lodash del administrador del sistema. +feature.flag.LPD-48975.title=Habilitar Lodash feature.flag.LPS-96845.description=Los clientes SCIM configurados pueden utilizar las API de REST para sincronizar la información de identidad de usuarios y grupos con aplicaciones externas. feature.flag.LPS-96845.title=Sistema para la gestión de la identidad entre dominios (SCIM) feature.flag.LPS-122920.description=Cree una experiencia de búsqueda que comprenda el significado y el contexto de su contenido y las búsquedas de usuarios gracias a modelos de aprendizaje automático del idioma a través de proveedores de inserción de texto de terceros y Search Blueprints. Una vez habilitada, comience la configuración en Configuración de instancia > Experiencias de búsqueda > Búsqueda semántica. @@ -7816,7 +7821,7 @@ file-url=URL del archivo file-version-is-invalid=La versión del archivo no es válida. files=Archivos files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Los archivos se pueden almacenar en cualquier entrada de objeto o en una carpeta específica de Documentos y Multimedia. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Nombres de las clases de archivos fill-out-the-following-form-to-get-driving-directions-to=Rellene el siguiente formulario para solicitar instrucciones sobre como llegar a filter=Filtro filter-and-order=Filtrar y ordenar @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragmentos y widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Los fragmentos y widgets no pueden colocarse dentro de esta área. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Los fragmentos y widgets de las páginas basadas en esta página maestra se colocarán aquí. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Los conjuntos de fragmentos y widgets pueden ordenarse para acceder fácilmente a los más usados. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Los fragmentos solo se pueden soltar en el primer elemento de la colección. fragments-cannot-be-placed-inside-a-form-step-container=El fragmento no se puede colocar dentro del contenedor de pasos de un formulario. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Los fragmentos no pueden colocarse dentro de un fragmento de visualización de colección sin asignar. fragments-cannot-be-placed-inside-an-unmapped-form-container=Los fragmentos no pueden colocarse dentro de un contenedor de formulario sin asignar. @@ -10749,7 +10754,7 @@ marked-text-background-color=Color de fondo de texto marcado marketing-banner=Banner comercial marketplace-connection=Conexión con Marketplace marketplace-is-now-in-fragments=Marketplace Is Now in Fragments (Automatic Copy) -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=El Marketplace ahora está en Generador de páginas marking-messages-as-read=Marcando mensajes como leídos... marking-messages-as-unread=Marcando mensajes como no leídos... mass=Masa @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Definiciones de objeto model.resource.com.liferay.object.model.ObjectAction=Acción de objeto model.resource.com.liferay.object.model.ObjectDefinition=Definición de objeto model.resource.com.liferay.object.model.ObjectEntry=Objeto -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Carpeta de entradas de objetos model.resource.com.liferay.object.model.ObjectField=Campo de objeto model.resource.com.liferay.object.model.ObjectFolder=Carpeta del objeto model.resource.com.liferay.object.model.ObjectLayout=Diseño de objeto @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Margen horizontal del enlace de navegación nav-link-vertical-active-indicator-length=Longitud del indicador activo vertical del enlace de navegación nav-link-vertical-active-indicator-thickness=Grosor del indicador activo vertical del enlace de navegación nav-link-vertical-margin=Margen vertical del enlace de navegación -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Navegar por otras secciones no cancelará el proceso. navigation=Navegación navigation-bars=Barras de navegación navigation-exception-selectors-description=Definir los selectores CSS que debe ignorar el SPA. @@ -12178,7 +12183,7 @@ no-components-were-found=No se ha encontrado ningún componente. no-configurations-were-found=No se ha encontrado ninguna configuración. no-connected-applications-were-found=No se encontraron aplicaciones conectadas. no-content-was-found-that-matched-keyword-x=No se ha encontrado ningún contenido que coincida con las palabras clave: {0}. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Aún no hay contenido no-continue=No, continuar no-coupons-were-found=No se ha encontrado ningún cupón. no-css-client-extensions-were-loaded=No se cargaron extensiones de cliente de CSS. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=No hay campos disponibles para este tipo. no-fields-are-available-for-x-editable=No hay campos disponibles para el elemento editable {0}. no-fields-available=No hay campos disponibles no-fields-were-found=No se encontraron campos. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Aún no hay campos no-file-is-selected=Ningún archivo seleccionado. no-file-selected=Ningún archivo seleccionado. no-files-selected=Ningún fichero seleccionado. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Aún no hay archivos no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=No hay fuentes de filtros disponibles. Cree una lista desplegable o un vocabulario para este tipo de filtro. no-filter-was-created-yet=Aún no se ha creado ningún filtro. no-filters=Sin filtros @@ -12926,7 +12931,7 @@ open-in-a-new-tab=Se abre en una pestaña nueva. open-in-ms-office=Abrir en MS Office open-keyboard-shortcuts=Abrir métodos abreviados de teclado open-localizations=Abrir localizaciones -open-marketplace-explorer=Open Marketplace Explorer (Automatic Copy) +open-marketplace-explorer=Abrir el explorador del Marketplace open-page-in-a-new-tab=Abrir la página en una nueva pestaña open-page-options-menu=Abrir menú de opciones de página open-page-template=Abrir la plantilla de página @@ -14168,9 +14173,9 @@ portal-instance=Instancia de portal portal-instance-help=Objeto que representa la instancia actual del portal. portal-instance-id=Identificador de instancia del portal portal-instance-id-help=El identificador de la instancia actual del portal. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Copia de instancia del portal +portal-instances-extraction-configuration-name=Extracción de instancia del portal +portal-instances-insertion-configuration-name=Inserción de instancia del portal portal-name=Nombre del portal portal-properties=Configuración del portal portal-properties-analysis=Análisis de las propiedades del portal @@ -16023,7 +16028,7 @@ search-everywhere=Buscar en todo search-experiences=Experiencias de búsqueda search-feeds=Buscar fuentes search-field-is-empty=El campo de búsqueda está vacío. Se muestran todos los campos. -search-fields=Search Fields (Automatic Copy) +search-fields=Buscar campos search-file-entries=Buscar archivos search-folder=Buscar en esta carpeta search-folders=Buscar carpetas @@ -17427,7 +17432,7 @@ source=Origen source-address=Dirección del origen source-code=Código fuente source-code-url=URL de código fuente -source-company-id=Source Company ID (Automatic Copy) +source-company-id=Identificador de la compañía origen source-file=Archivo de origen source-file-field=Campo del archivo de origen source-folder=Carpeta fuente @@ -17462,7 +17467,7 @@ spacer-9=Espaciador 9 spacer-10=Espaciador 10 spacer-options=Opciones de espaciador spacers=Espaciadores -spaces=Spaces (Automatic Copy) +spaces=Espacios spaces-are-not-allowed=No se permiten espacios. spacing=Espaciado spam=Correo no deseado @@ -17709,7 +17714,7 @@ structure-restrictions-help=Las carpetas pueden ser restringidas para permitir s structure-type=Tipo de estructura structures=Estructuras structures-and-types=Estructuras y tipos -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Nombres de las clases de estructuras student-capacity=Capacidad del estudiante students=Estudiantes style=Estilo @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=La URL amigable tiene demasiadas barras. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=La URL descriptiva ya está en uso. Escriba una URL descriptiva única. the-friendly-url-is-appended-to-x-for-pages=La URL descriptiva se anexará a {0} para las páginas. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=La URL amigable se añade al prefijo {0} para las páginas públicas y al prefijo {1} para las páginas privadas. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=La URL descriptiva se genera automáticamente según el campo del título de la entrada. the-friendly-url-is-too-long=La URL descriptiva es demasiado larga. the-friendly-url-may-be-modified-to-ensure-uniqueness=La URL descriptiva puede modificarse para garantizar la unicidad. the-friendly-url-may-conflict-with-another-page=Es posible que la URL descriptiva entre en conflicto con otra página. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=La cantidad supera e the-quantity-is-required=La cantidad es obligatoria. the-question-could-not-be-found=La pregunta no ha podido ser encontrada. the-question-is-not-found=No se encuentra la pregunta. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=La URL sin script de reCAPTCHA no es correcta. the-recaptcha-private-key-is-not-valid=La clave privada de reCAPTCHA no es correcta. the-recaptcha-public-key-is-not-valid=La clave pública de reCAPTCHA no es correcta. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=La URL del script de reCAPTCHA no es correcta. +the-recaptcha-verify-url-is-not-valid=La URL de verificación de reCAPTCHA no es correcta. the-record-could-not-be-found=El registro no puede ser encontrado. the-recordSet-could-not-be-found=El conjunto de registros no puede ser encontrado. the-recycle-bin=la papelera de reciclaje @@ -20766,7 +20771,7 @@ untitled-rule=Regla sin título untitled-scheduled-publish-process=Proceso de publicación programado sin título untitled-segment=Segmento sin título untitled-set=Conjunto sin título -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Estructura sin título untitled-workflow=Flujo de trabajo sin título untitled-x=Sin título {0} untracked=Sin seguimiento @@ -21561,8 +21566,8 @@ warnings=Advertencias was=Era was-this-information-helpful=¿Le ha resultado útil esta información? watcher=Vigilante -we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=We are excited to share that Marketplace is now part of Fragments! Browse, install, and manage new fragments and fragment sets without ever leaving the Fragment Administration. (Automatic Copy) -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=¡Nos complace compartir que el Marketplace ahora forma parte de Fragmentos! Busque, instale y administre nuevos fragmentos y conjuntos de fragmentos sin salir de la Administración de fragmentos. +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=¡Nos complace anunciar que Marketplace ahora es parte del Generador de páginas! Busque, instale y administre componentes sin salir de la Página. we-will-not-send-you-emails-to-x-anymore=Ya no le enviaremos correos electrónicos a {0}. weather=Clima weather-condition-id=Identificador de condición meteorológica diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_CO.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_CO.properties index bc0ecb052ae2ac..eaf7bb71089ab6 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_CO.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_CO.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Añadir un voto action.ADD_WAREHOUSE=Añadir almacén action.ADMINISTRATE=Administrar action.ADMINISTRATOR=Administrador -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Actualización avanzada action.APPLY_SXP_BLUEPRINT=Aplicar plano action.APPROVE_ARTICLE=Aprobar un contenido web action.APPROVE_OPEN_COMMERCE_ORDERS=Aprobar pedidos abiertos @@ -962,7 +962,7 @@ add-new-attribute=Añadir nuevo atributo add-new-categories-or-remove-common-categories=Añada nuevas categorías o quite categorías comunes. add-new-category=Añadir una categoría add-new-entry-to-x=Añadir nueva entrada a {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Añada nuevos campos para comenzar a crear su estructura. add-new-group=Añadir nuevo grupo add-new-grouped-entry-to-x=Añadir nueva entrada agrupada a {0} add-new-in-x=Añadir nuevo en {0} @@ -1429,7 +1429,7 @@ allow-origin-port=Permitir puerto de origen allow-origin-port-description=Habilite esta opción para permitir cualquier número de puerto en la regla de coincidencia de origen. allow-origin-subdomain=Permitir subdominio de origen allow-origin-subdomain-description=Habilite esta opción para que la regla de coincidencia de origen permita cualquier subdominio de cualquier profundidad. -allow-overriding-an-entry's-friendly-url=Allow Overriding an Entry's Friendly URL (Automatic Copy) +allow-overriding-an-entry's-friendly-url=Permitir sobreescribir la URL descriptiva de una entrada allow-pingbacks=Permitir Pingbacks allow-request-a-quote-on-a-fully-priced-cart=Permitir la petición de un presupuesto para una cesta con el precio completo allow-respondents-to-see-the-current-forms-report-data=Permite a los participantes ver los datos de informes de formularios actuales. No solicite datos personales o confidenciales. @@ -3122,7 +3122,7 @@ categories-for-this-item=Categorías para este elemento categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Las categorías solo aparecerán en la URL cuando la entrada del blog está asociada a una página de visualización. categories[message-board]=Categorías categorization=Categorización -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Nombres de las clases de categorización categorization-configuration-name=Categorización categorization-is-disabled-for-the-selected-content=La categorización está deshabilitada para el contenido seleccionado. La categorización se debe habilitar para mostrar las categorías en este fragmento. categorization-of-object-entries=Categorización de entradas del objeto @@ -3360,6 +3360,7 @@ certificate-path-name=Ruta del certificado certificate-url=URL de certificado chain-method=Método encadenado change=Cambiar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Cambiar asignación change-clickable-element=Cambiar elemento interactivo change-collection=Cambiar colección @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Aunque se cambie la plantilla, esto no afectará a la plantilla por defecto de contenido web original. El cambio solo se aplica en esta visualización de contenido web. changing-the-value-of-this-field-reloads-the-page=Cambiar el valor de este campo provocará que se recargue la página. changing-this-setting-will-reset-all-mappings-for-this-collection=El cambio de esta configuración restaurará todas las asignaciones de esta colección. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gestores de cuentas de canal channel-defaults=Valores por defecto del canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Haga clic aquí para consultar la documentación. click-here-to-preview-the-form-in-a-new-window=Haga clic aquí para previsualizar el formulario en una nueva ventana click-here-to-save-it-now=Pulse aquí para salvarlo ahora. click-new-to-create-your-first-asset=Haga clic en «Nuevo» para crear su primer activo. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Haga clic en «Nuevo» para crear su primer archivo. +click-new-to-create-your-first-piece-of-content=Haga clic en «Nuevo» para crear su primer contenido. click-ok-to-create-a-new-thread-with-the-following-messages=Haga clic en Aceptar para crear un hilo de discusión con los siguientes mensajes. click-on-any-tag-to-edit-it=Pulse en una etiqueta para editarla. click-on-the-object-fields-in-the-sidebar-to-add-properties=Haga clic en los campos de objeto de la barra lateral para añadir propiedades. @@ -3799,7 +3801,7 @@ close-search=Cerrar búsqueda close-sidebar=Cerrar barra lateral close-x=Cerrar {0} closed=Cerrado -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=Cerrar la ventana no cancelará el proceso. cloud=Nube club-event=Evento del club cluster=Clúster @@ -3808,7 +3810,7 @@ cluster-name=Nombre del clúster cluster-name-help=El nombre del clúster al que unirse. El nombre debe coincidir con el clúster remoto cuando el modo de operación se establece en REMOTE (remoto). cluster-node-address-timeout=Tiempo de espera de la dirección del nodo del clúster cmis-repository-configuration-name=Repositorio CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Inicializador del sitio CMS code=Código code-file-mime-types=Tipos MIME de archivo de código code-of-the-element=Código del elemento @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Monedas de comercio currency=Moneda currency-code=Código de divisa currency-id=Identificador de divisa +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos de moneda currency.AED=Dirham de los EAU currency.ALL=Lek Albanés @@ -5879,7 +5882,7 @@ desktop=Escritorio desktop-view=Vista de escritorio destination=Destino destination-address=Dirección de destino -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=Identificador de la compañía de destino destination-directory=Directorio de destino destination-field=Campo de destino destination-name=Nombre de destino @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Los usuarios pueden crear jerarquías de definiciones de objeto al definir una definición del objeto raíz. Las definiciones de objetos hijo están ligadas a la raíz y heredan la configuración de widgets y permisos de la definición del objeto raíz. Los endpoints de la API de las definiciones de objetos hijo están fusionados con los endpoints raíz. feature.flag.LPD-34594.title=Definiciones de objetos raíz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=La wiki está en desuso y se quitará en el futuro. Para evitar la pérdida de datos, debe migrarlos a Objeto. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permitir que los usuarios de los canales B2B y B2X utilicen la finalización de compra de invitado o que inicien sesión y transfieran su cesta a una cuenta empresarial. @@ -7594,8 +7599,8 @@ feature.flag.LPD-48372.description=El cargador AMD está en desuso y se quitará feature.flag.LPD-48372.title=Cargador AMD feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48975.description=Quita la habilitación de Lodash del administrador del sistema. +feature.flag.LPD-48975.title=Habilitar Lodash feature.flag.LPS-96845.description=Los clientes SCIM configurados pueden utilizar las API de REST para sincronizar la información de identidad de usuarios y grupos con aplicaciones externas. feature.flag.LPS-96845.title=Sistema para la gestión de la identidad entre dominios (SCIM) feature.flag.LPS-122920.description=Cree una experiencia de búsqueda que comprenda el significado y el contexto de su contenido y las búsquedas de usuarios gracias a modelos de aprendizaje automático del idioma a través de proveedores de inserción de texto de terceros y Search Blueprints. Una vez habilitada, comience la configuración en Configuración de instancia > Experiencias de búsqueda > Búsqueda semántica. @@ -7816,7 +7821,7 @@ file-url=URL del archivo file-version-is-invalid=La versión del archivo no es válida. files=Archivos files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Los archivos se pueden almacenar en cualquier entrada de objeto o en una carpeta específica de Documentos y Multimedia. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Nombres de las clases de archivos fill-out-the-following-form-to-get-driving-directions-to=Rellene el siguiente formulario para solicitar instrucciones sobre como llegar a filter=Filtro filter-and-order=Filtrar y ordenar @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragmentos y widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Los fragmentos y widgets no pueden colocarse dentro de esta área. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Los fragmentos y widgets de las páginas basadas en esta página maestra se colocarán aquí. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Los conjuntos de fragmentos y widgets pueden ordenarse para acceder fácilmente a los más usados. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Los fragmentos solo se pueden soltar en el primer elemento de la colección. fragments-cannot-be-placed-inside-a-form-step-container=El fragmento no se puede colocar dentro del contenedor de pasos de un formulario. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Los fragmentos no pueden colocarse dentro de un fragmento de visualización de colección sin asignar. fragments-cannot-be-placed-inside-an-unmapped-form-container=Los fragmentos no pueden colocarse dentro de un contenedor de formulario sin asignar. @@ -10749,7 +10754,7 @@ marked-text-background-color=Color de fondo de texto marcado marketing-banner=Banner comercial marketplace-connection=Conexión con Marketplace marketplace-is-now-in-fragments=Marketplace Is Now in Fragments (Automatic Copy) -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=El Marketplace ahora está en Generador de páginas marking-messages-as-read=Marcando mensajes como leídos... marking-messages-as-unread=Marcando mensajes como no leídos... mass=Masa @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Definiciones de objeto model.resource.com.liferay.object.model.ObjectAction=Acción de objeto model.resource.com.liferay.object.model.ObjectDefinition=Definición de objeto model.resource.com.liferay.object.model.ObjectEntry=Objeto -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Carpeta de entradas de objetos model.resource.com.liferay.object.model.ObjectField=Campo de objeto model.resource.com.liferay.object.model.ObjectFolder=Carpeta del objeto model.resource.com.liferay.object.model.ObjectLayout=Diseño de objeto @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Margen horizontal del enlace de navegación nav-link-vertical-active-indicator-length=Longitud del indicador activo vertical del enlace de navegación nav-link-vertical-active-indicator-thickness=Grosor del indicador activo vertical del enlace de navegación nav-link-vertical-margin=Margen vertical del enlace de navegación -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Navegar por otras secciones no cancelará el proceso. navigation=Navegación navigation-bars=Barras de navegación navigation-exception-selectors-description=Definir los selectores CSS que debe ignorar el SPA. @@ -12178,7 +12183,7 @@ no-components-were-found=No se ha encontrado ningún componente. no-configurations-were-found=No se ha encontrado ninguna configuración. no-connected-applications-were-found=No se encontraron aplicaciones conectadas. no-content-was-found-that-matched-keyword-x=No se ha encontrado ningún contenido que coincida con las palabras clave: {0}. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Aún no hay contenido no-continue=No, continuar no-coupons-were-found=No se ha encontrado ningún cupón. no-css-client-extensions-were-loaded=No se cargaron extensiones de cliente de CSS. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=No hay campos disponibles para este tipo. no-fields-are-available-for-x-editable=No hay campos disponibles para el elemento editable {0}. no-fields-available=No hay campos disponibles no-fields-were-found=No se encontraron campos. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Aún no hay campos no-file-is-selected=Ningún archivo seleccionado. no-file-selected=Ningún archivo seleccionado. no-files-selected=Ningún fichero seleccionado. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Aún no hay archivos no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=No hay fuentes de filtros disponibles. Cree una lista desplegable o un vocabulario para este tipo de filtro. no-filter-was-created-yet=Aún no se ha creado ningún filtro. no-filters=Sin filtros @@ -12926,7 +12931,7 @@ open-in-a-new-tab=Se abre en una pestaña nueva. open-in-ms-office=Abrir en MS Office open-keyboard-shortcuts=Abrir métodos abreviados de teclado open-localizations=Abrir localizaciones -open-marketplace-explorer=Open Marketplace Explorer (Automatic Copy) +open-marketplace-explorer=Abrir el explorador del Marketplace open-page-in-a-new-tab=Abrir la página en una nueva pestaña open-page-options-menu=Abrir menú de opciones de página open-page-template=Abrir la plantilla de página @@ -14168,9 +14173,9 @@ portal-instance=Instancia de portal portal-instance-help=Objeto que representa la instancia actual del portal. portal-instance-id=Identificador de instancia del portal portal-instance-id-help=El identificador de la instancia actual del portal. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Copia de instancia del portal +portal-instances-extraction-configuration-name=Extracción de instancia del portal +portal-instances-insertion-configuration-name=Inserción de instancia del portal portal-name=Nombre del portal portal-properties=Configuración del portal portal-properties-analysis=Análisis de las propiedades del portal @@ -16023,7 +16028,7 @@ search-everywhere=Buscar en todo search-experiences=Experiencias de búsqueda search-feeds=Buscar fuentes search-field-is-empty=El campo de búsqueda está vacío. Se muestran todos los campos. -search-fields=Search Fields (Automatic Copy) +search-fields=Buscar campos search-file-entries=Buscar archivos search-folder=Buscar en esta carpeta search-folders=Buscar carpetas @@ -17427,7 +17432,7 @@ source=Origen source-address=Dirección del origen source-code=Código fuente source-code-url=URL de código fuente -source-company-id=Source Company ID (Automatic Copy) +source-company-id=Identificador de la compañía origen source-file=Archivo de origen source-file-field=Campo del archivo de origen source-folder=Carpeta fuente @@ -17462,7 +17467,7 @@ spacer-9=Espaciador 9 spacer-10=Espaciador 10 spacer-options=Opciones de espaciador spacers=Espaciadores -spaces=Spaces (Automatic Copy) +spaces=Espacios spaces-are-not-allowed=No se permiten espacios. spacing=Espaciado spam=Correo no deseado @@ -17709,7 +17714,7 @@ structure-restrictions-help=Las carpetas pueden ser restringidas para permitir s structure-type=Tipo de estructura structures=Estructuras structures-and-types=Estructuras y tipos -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Nombres de las clases de estructuras student-capacity=Capacidad del estudiante students=Estudiantes style=Estilo @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=La URL amigable tiene demasiadas barras. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=La URL descriptiva ya está en uso. Escriba una URL descriptiva única. the-friendly-url-is-appended-to-x-for-pages=La URL descriptiva se anexará a {0} para las páginas. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=La URL amigable se añade al prefijo {0} para las páginas públicas y al prefijo {1} para las páginas privadas. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=La URL descriptiva se genera automáticamente según el campo del título de la entrada. the-friendly-url-is-too-long=La URL descriptiva es demasiado larga. the-friendly-url-may-be-modified-to-ensure-uniqueness=La URL descriptiva puede modificarse para garantizar la unicidad. the-friendly-url-may-conflict-with-another-page=Es posible que la URL descriptiva entre en conflicto con otra página. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=La cantidad supera e the-quantity-is-required=La cantidad es obligatoria. the-question-could-not-be-found=La pregunta no ha podido ser encontrada. the-question-is-not-found=No se encuentra la pregunta. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=La URL sin script de reCAPTCHA no es correcta. the-recaptcha-private-key-is-not-valid=La clave privada de reCAPTCHA no es correcta. the-recaptcha-public-key-is-not-valid=La clave pública de reCAPTCHA no es correcta. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=La URL del script de reCAPTCHA no es correcta. +the-recaptcha-verify-url-is-not-valid=La URL de verificación de reCAPTCHA no es correcta. the-record-could-not-be-found=El registro no puede ser encontrado. the-recordSet-could-not-be-found=El conjunto de registros no puede ser encontrado. the-recycle-bin=la papelera de reciclaje @@ -20766,7 +20771,7 @@ untitled-rule=Regla sin título untitled-scheduled-publish-process=Proceso de publicación programado sin título untitled-segment=Segmento sin título untitled-set=Conjunto sin título -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Estructura sin título untitled-workflow=Flujo de trabajo sin título untitled-x=Sin título {0} untracked=Sin seguimiento @@ -21561,8 +21566,8 @@ warnings=Advertencias was=Era was-this-information-helpful=¿Le ha resultado útil esta información? watcher=Vigilante -we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=We are excited to share that Marketplace is now part of Fragments! Browse, install, and manage new fragments and fragment sets without ever leaving the Fragment Administration. (Automatic Copy) -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=¡Nos complace compartir que el Marketplace ahora forma parte de Fragmentos! Busque, instale y administre nuevos fragmentos y conjuntos de fragmentos sin salir de la Administración de fragmentos. +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=¡Nos complace anunciar que Marketplace ahora es parte del Generador de páginas! Busque, instale y administre componentes sin salir de la Página. we-will-not-send-you-emails-to-x-anymore=Ya no le enviaremos correos electrónicos a {0}. weather=Clima weather-condition-id=Identificador de condición meteorológica diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_MX.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_MX.properties index 56e983783574f4..e0e3e4dbb1cac8 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_MX.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_es_MX.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Añadir un voto action.ADD_WAREHOUSE=Añadir almacén action.ADMINISTRATE=Administrar action.ADMINISTRATOR=Administrador -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Actualización avanzada action.APPLY_SXP_BLUEPRINT=Aplicar plano action.APPROVE_ARTICLE=Aprobar un contenido web action.APPROVE_OPEN_COMMERCE_ORDERS=Aprobar pedidos abiertos @@ -962,7 +962,7 @@ add-new-attribute=Añadir nuevo atributo add-new-categories-or-remove-common-categories=Añada nuevas categorías o quite categorías comunes. add-new-category=Añadir una categoría add-new-entry-to-x=Añadir nueva entrada a {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Añada nuevos campos para comenzar a crear su estructura. add-new-group=Añadir nuevo grupo add-new-grouped-entry-to-x=Añadir nueva entrada agrupada a {0} add-new-in-x=Añadir nuevo en {0} @@ -1429,7 +1429,7 @@ allow-origin-port=Permitir puerto de origen allow-origin-port-description=Habilite esta opción para permitir cualquier número de puerto en la regla de coincidencia de origen. allow-origin-subdomain=Permitir subdominio de origen allow-origin-subdomain-description=Habilite esta opción para que la regla de coincidencia de origen permita cualquier subdominio de cualquier profundidad. -allow-overriding-an-entry's-friendly-url=Allow Overriding an Entry's Friendly URL (Automatic Copy) +allow-overriding-an-entry's-friendly-url=Permitir sobreescribir la URL descriptiva de una entrada allow-pingbacks=Permitir Pingbacks allow-request-a-quote-on-a-fully-priced-cart=Permitir la petición de un presupuesto para una cesta con el precio completo allow-respondents-to-see-the-current-forms-report-data=Permite a los participantes ver los datos de informes de formularios actuales. No solicite datos personales o confidenciales. @@ -3122,7 +3122,7 @@ categories-for-this-item=Categorías para este elemento categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Las categorías solo aparecerán en la URL cuando la entrada del blog está asociada a una página de visualización. categories[message-board]=Categorías categorization=Categorización -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Nombres de las clases de categorización categorization-configuration-name=Categorización categorization-is-disabled-for-the-selected-content=La categorización está deshabilitada para el contenido seleccionado. La categorización se debe habilitar para mostrar las categorías en este fragmento. categorization-of-object-entries=Categorización de entradas del objeto @@ -3360,6 +3360,7 @@ certificate-path-name=Ruta del certificado certificate-url=URL de certificado chain-method=Método encadenado change=Cambiar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Cambiar asignación change-clickable-element=Cambiar elemento interactivo change-collection=Cambiar colección @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Aunque se cambie la plantilla, esto no afectará a la plantilla por defecto de contenido web original. El cambio solo se aplica en esta visualización de contenido web. changing-the-value-of-this-field-reloads-the-page=Cambiar el valor de este campo provocará que se recargue la página. changing-this-setting-will-reset-all-mappings-for-this-collection=El cambio de esta configuración restaurará todas las asignaciones de esta colección. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gestores de cuentas de canal channel-defaults=Valores por defecto del canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Haga clic aquí para consultar la documentación. click-here-to-preview-the-form-in-a-new-window=Haga clic aquí para previsualizar el formulario en una nueva ventana click-here-to-save-it-now=Pulse aquí para salvarlo ahora. click-new-to-create-your-first-asset=Haga clic en «Nuevo» para crear su primer activo. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Haga clic en «Nuevo» para crear su primer archivo. +click-new-to-create-your-first-piece-of-content=Haga clic en «Nuevo» para crear su primer contenido. click-ok-to-create-a-new-thread-with-the-following-messages=Haga clic en Aceptar para crear un hilo de discusión con los siguientes mensajes. click-on-any-tag-to-edit-it=Pulse en una etiqueta para editarla. click-on-the-object-fields-in-the-sidebar-to-add-properties=Haga clic en los campos de objeto de la barra lateral para añadir propiedades. @@ -3799,7 +3801,7 @@ close-search=Cerrar búsqueda close-sidebar=Cerrar barra lateral close-x=Cerrar {0} closed=Cerrado -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=Cerrar la ventana no cancelará el proceso. cloud=Nube club-event=Evento del club cluster=Clúster @@ -3808,7 +3810,7 @@ cluster-name=Nombre del clúster cluster-name-help=El nombre del clúster al que unirse. El nombre debe coincidir con el clúster remoto cuando el modo de operación se establece en REMOTE (remoto). cluster-node-address-timeout=Tiempo de espera de la dirección del nodo del clúster cmis-repository-configuration-name=Repositorio CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Inicializador del sitio CMS code=Código code-file-mime-types=Tipos MIME de archivo de código code-of-the-element=Código del elemento @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Monedas de comercio currency=Moneda currency-code=Código de divisa currency-id=Identificador de divisa +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos de moneda currency.AED=Dirham de los EAU currency.ALL=Lek Albanés @@ -5879,7 +5882,7 @@ desktop=Escritorio desktop-view=Vista de escritorio destination=Destino destination-address=Dirección de destino -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=Identificador de la compañía de destino destination-directory=Directorio de destino destination-field=Campo de destino destination-name=Nombre de destino @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Los usuarios pueden crear jerarquías de definiciones de objeto al definir una definición del objeto raíz. Las definiciones de objetos hijo están ligadas a la raíz y heredan la configuración de widgets y permisos de la definición del objeto raíz. Los endpoints de la API de las definiciones de objetos hijo están fusionados con los endpoints raíz. feature.flag.LPD-34594.title=Definiciones de objetos raíz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=La wiki está en desuso y se quitará en el futuro. Para evitar la pérdida de datos, debe migrarlos a Objeto. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permitir que los usuarios de los canales B2B y B2X utilicen la finalización de compra de invitado o que inicien sesión y transfieran su cesta a una cuenta empresarial. @@ -7594,8 +7599,8 @@ feature.flag.LPD-48372.description=El cargador AMD está en desuso y se quitará feature.flag.LPD-48372.title=Cargador AMD feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48975.description=Quita la habilitación de Lodash del administrador del sistema. +feature.flag.LPD-48975.title=Habilitar Lodash feature.flag.LPS-96845.description=Los clientes SCIM configurados pueden utilizar las API de REST para sincronizar la información de identidad de usuarios y grupos con aplicaciones externas. feature.flag.LPS-96845.title=Sistema para la gestión de la identidad entre dominios (SCIM) feature.flag.LPS-122920.description=Cree una experiencia de búsqueda que comprenda el significado y el contexto de su contenido y las búsquedas de usuarios gracias a modelos de aprendizaje automático del idioma a través de proveedores de inserción de texto de terceros y Search Blueprints. Una vez habilitada, comience la configuración en Configuración de instancia > Experiencias de búsqueda > Búsqueda semántica. @@ -7816,7 +7821,7 @@ file-url=URL del archivo file-version-is-invalid=La versión del archivo no es válida. files=Archivos files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Los archivos se pueden almacenar en cualquier entrada de objeto o en una carpeta específica de Documentos y Multimedia. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Nombres de las clases de archivos fill-out-the-following-form-to-get-driving-directions-to=Rellene el siguiente formulario para solicitar instrucciones sobre como llegar a filter=Filtro filter-and-order=Filtrar y ordenar @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragmentos y widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Los fragmentos y widgets no pueden colocarse dentro de esta área. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Los fragmentos y widgets de las páginas basadas en esta página maestra se colocarán aquí. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Los conjuntos de fragmentos y widgets pueden ordenarse para acceder fácilmente a los más usados. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Los fragmentos solo se pueden soltar en el primer elemento de la colección. fragments-cannot-be-placed-inside-a-form-step-container=El fragmento no se puede colocar dentro del contenedor de pasos de un formulario. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Los fragmentos no pueden colocarse dentro de un fragmento de visualización de colección sin asignar. fragments-cannot-be-placed-inside-an-unmapped-form-container=Los fragmentos no pueden colocarse dentro de un contenedor de formulario sin asignar. @@ -10749,7 +10754,7 @@ marked-text-background-color=Color de fondo de texto marcado marketing-banner=Banner comercial marketplace-connection=Conexión con Marketplace marketplace-is-now-in-fragments=Marketplace Is Now in Fragments (Automatic Copy) -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=El Marketplace ahora está en Generador de páginas marking-messages-as-read=Marcando mensajes como leídos... marking-messages-as-unread=Marcando mensajes como no leídos... mass=Masa @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Definiciones de objeto model.resource.com.liferay.object.model.ObjectAction=Acción de objeto model.resource.com.liferay.object.model.ObjectDefinition=Definición de objeto model.resource.com.liferay.object.model.ObjectEntry=Objeto -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Carpeta de entradas de objetos model.resource.com.liferay.object.model.ObjectField=Campo de objeto model.resource.com.liferay.object.model.ObjectFolder=Carpeta del objeto model.resource.com.liferay.object.model.ObjectLayout=Diseño de objeto @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Margen horizontal del enlace de navegación nav-link-vertical-active-indicator-length=Longitud del indicador activo vertical del enlace de navegación nav-link-vertical-active-indicator-thickness=Grosor del indicador activo vertical del enlace de navegación nav-link-vertical-margin=Margen vertical del enlace de navegación -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Navegar por otras secciones no cancelará el proceso. navigation=Navegación navigation-bars=Barras de navegación navigation-exception-selectors-description=Definir los selectores CSS que debe ignorar el SPA. @@ -12178,7 +12183,7 @@ no-components-were-found=No se ha encontrado ningún componente. no-configurations-were-found=No se ha encontrado ninguna configuración. no-connected-applications-were-found=No se encontraron aplicaciones conectadas. no-content-was-found-that-matched-keyword-x=No se ha encontrado ningún contenido que coincida con las palabras clave: {0}. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Aún no hay contenido no-continue=No, continuar no-coupons-were-found=No se ha encontrado ningún cupón. no-css-client-extensions-were-loaded=No se cargaron extensiones de cliente de CSS. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=No hay campos disponibles para este tipo. no-fields-are-available-for-x-editable=No hay campos disponibles para el elemento editable {0}. no-fields-available=No hay campos disponibles no-fields-were-found=No se encontraron campos. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Aún no hay campos no-file-is-selected=Ningún archivo seleccionado. no-file-selected=Ningún archivo seleccionado. no-files-selected=Ningún fichero seleccionado. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Aún no hay archivos no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=No hay fuentes de filtros disponibles. Cree una lista desplegable o un vocabulario para este tipo de filtro. no-filter-was-created-yet=Aún no se ha creado ningún filtro. no-filters=Sin filtros @@ -12926,7 +12931,7 @@ open-in-a-new-tab=Se abre en una pestaña nueva. open-in-ms-office=Abrir en MS Office open-keyboard-shortcuts=Abrir métodos abreviados de teclado open-localizations=Abrir localizaciones -open-marketplace-explorer=Open Marketplace Explorer (Automatic Copy) +open-marketplace-explorer=Abrir el explorador del Marketplace open-page-in-a-new-tab=Abrir la página en una nueva pestaña open-page-options-menu=Abrir menú de opciones de página open-page-template=Abrir la plantilla de página @@ -14168,9 +14173,9 @@ portal-instance=Instancia de portal portal-instance-help=Objeto que representa la instancia actual del portal. portal-instance-id=Identificador de instancia del portal portal-instance-id-help=El identificador de la instancia actual del portal. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Copia de instancia del portal +portal-instances-extraction-configuration-name=Extracción de instancia del portal +portal-instances-insertion-configuration-name=Inserción de instancia del portal portal-name=Nombre del portal portal-properties=Configuración del portal portal-properties-analysis=Análisis de las propiedades del portal @@ -16023,7 +16028,7 @@ search-everywhere=Buscar en todo search-experiences=Experiencias de búsqueda search-feeds=Buscar fuentes search-field-is-empty=El campo de búsqueda está vacío. Se muestran todos los campos. -search-fields=Search Fields (Automatic Copy) +search-fields=Buscar campos search-file-entries=Buscar archivos search-folder=Buscar en esta carpeta search-folders=Buscar carpetas @@ -17427,7 +17432,7 @@ source=Origen source-address=Dirección del origen source-code=Código fuente source-code-url=URL de código fuente -source-company-id=Source Company ID (Automatic Copy) +source-company-id=Identificador de la compañía origen source-file=Archivo de origen source-file-field=Campo del archivo de origen source-folder=Carpeta fuente @@ -17462,7 +17467,7 @@ spacer-9=Espaciador 9 spacer-10=Espaciador 10 spacer-options=Opciones de espaciador spacers=Espaciadores -spaces=Spaces (Automatic Copy) +spaces=Espacios spaces-are-not-allowed=No se permiten espacios. spacing=Espaciado spam=Correo no deseado @@ -17709,7 +17714,7 @@ structure-restrictions-help=Las carpetas pueden ser restringidas para permitir s structure-type=Tipo de estructura structures=Estructuras structures-and-types=Estructuras y tipos -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Nombres de las clases de estructuras student-capacity=Capacidad del estudiante students=Estudiantes style=Estilo @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=La URL amigable tiene demasiadas barras. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=La URL descriptiva ya está en uso. Escriba una URL descriptiva única. the-friendly-url-is-appended-to-x-for-pages=La URL descriptiva se anexará a {0} para las páginas. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=La URL amigable se añade al prefijo {0} para las páginas públicas y al prefijo {1} para las páginas privadas. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=La URL descriptiva se genera automáticamente según el campo del título de la entrada. the-friendly-url-is-too-long=La URL descriptiva es demasiado larga. the-friendly-url-may-be-modified-to-ensure-uniqueness=La URL descriptiva puede modificarse para garantizar la unicidad. the-friendly-url-may-conflict-with-another-page=Es posible que la URL descriptiva entre en conflicto con otra página. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=La cantidad supera e the-quantity-is-required=La cantidad es obligatoria. the-question-could-not-be-found=La pregunta no ha podido ser encontrada. the-question-is-not-found=No se encuentra la pregunta. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=La URL sin script de reCAPTCHA no es correcta. the-recaptcha-private-key-is-not-valid=La clave privada de reCAPTCHA no es correcta. the-recaptcha-public-key-is-not-valid=La clave pública de reCAPTCHA no es correcta. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=La URL del script de reCAPTCHA no es correcta. +the-recaptcha-verify-url-is-not-valid=La URL de verificación de reCAPTCHA no es correcta. the-record-could-not-be-found=El registro no puede ser encontrado. the-recordSet-could-not-be-found=El conjunto de registros no puede ser encontrado. the-recycle-bin=la papelera de reciclaje @@ -20766,7 +20771,7 @@ untitled-rule=Regla sin título untitled-scheduled-publish-process=Proceso de publicación programado sin título untitled-segment=Segmento sin título untitled-set=Conjunto sin título -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Estructura sin título untitled-workflow=Flujo de trabajo sin título untitled-x=Sin título {0} untracked=Sin seguimiento @@ -21561,8 +21566,8 @@ warnings=Advertencias was=Era was-this-information-helpful=¿Le ha resultado útil esta información? watcher=Vigilante -we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=We are excited to share that Marketplace is now part of Fragments! Browse, install, and manage new fragments and fragment sets without ever leaving the Fragment Administration. (Automatic Copy) -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=¡Nos complace compartir que el Marketplace ahora forma parte de Fragmentos! Busque, instale y administre nuevos fragmentos y conjuntos de fragmentos sin salir de la Administración de fragmentos. +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=¡Nos complace anunciar que Marketplace ahora es parte del Generador de páginas! Busque, instale y administre componentes sin salir de la Página. we-will-not-send-you-emails-to-x-anymore=Ya no le enviaremos correos electrónicos a {0}. weather=Clima weather-condition-id=Identificador de condición meteorológica diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_et.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_et.properties index 59118232f96aa8..6bc211e9adea38 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_et.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_et.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Serdi tee (Automatic Translation) certificate-url=Sertifikaadi URL (Automatic Translation) chain-method=Keti meetod (Automatic Translation) change=Muuda +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Muuda klõpsatavat elementi (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Selle välja väärtuse muutmine laadib lehe uuesti. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce'i valuutad (Automatic Translation currency=Valuuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valuutasümbolid currency.AED=Araabia ühendemiraatide dirhem currency.ALL=Albaania lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wikid feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_eu.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_eu.properties index 764b19a902b01f..3b0058f7e7738e 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_eu.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_eu.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Aldatu +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Bilduma aldatu @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Eremu honen balioa aldatzeak orria berriz kargatzea eragingo du. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Moneta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Moneta ikurrak currency.AED=Arabiar Emirerri Batuetako dirhama currency.ALL=Albaniako leka @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki-a feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fa.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fa.properties index 6776975dee0377..aaa3ec344c8ba0 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fa.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fa.properties @@ -3360,6 +3360,7 @@ certificate-path-name=مسیر گواهینامه certificate-url=آدرس گواهی (Automatic Translation) chain-method=روش زنجیره ای (Automatic Translation) change=تغيير +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=تغییر عنصر قابل کلیک (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=در صورتی که گزینه‌ی دیگری را انتخاب نمایید، صفحه دوباره بارگذاری می‌شود. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=کانال channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=ارزهای تجاری currency=واحد پولی currency-code=Currency Code (Automatic Copy) currency-id=شناسه واحد پولی +currency-selector=Currency Selector (Automatic Copy) currency-symbols=علائم پولی currency.AED=درهم currency.ALL=لک آلبانی @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=راهنما feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fi.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fi.properties index 80b1b6de0613fb..64fcea4206075f 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fi.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fi.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Varmenteen Polku certificate-url=Varmenteen URL chain-method=Ketjumenetelmä change=Muuta +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Muuta nimeämistä change-clickable-element=Vaihda Napsautettavaa Elementtiä change-collection=Vaihda kokoelmaa @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Mallin muuttaminen ei vaikuta alkuperäiseen Web-sisällön oletusmalliin. Muutos koskee vain tämän web sisällön näyttämistä. changing-the-value-of-this-field-reloads-the-page=Tämän arvon muokkaaminen aiheuttaa sivun uudelleen latauksen. changing-this-setting-will-reset-all-mappings-for-this-collection=Tämän asetuksen muuttaminen nollaa tämän kokoelman kaikki kartoitukset. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanava channel-account-managers=Kanavatilien hallinnoijat channel-defaults=Kanavaoletukset @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Kaupankäyntivaluutat currency=Valuutta currency-code=Valuuttatunnus currency-id=Valuuttatunniste +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valuuttasymbolit currency.AED=Yhdistyneiden arabiemiirikuntien dirhami currency.ALL=Albanian lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Näytä ja hallinnoi tiloja uudessa CMS:ssä. feature.flag.LPD-32649.title=Tilaosio feature.flag.LPD-34594.description=Käyttäjät voivat luoda objektimääritelmähierarkioita määrittämällä päätason objektin määritelmän. Alatason objektimääritelmät sidotaan päätasolle, ja ne perivät oikeudet ja pienoisohjelmamäärityksen päätason objektimääritelmästä. Alatason objektimääritelmien API-päätepisteet yhdistetään päätason päätepisteisiin. feature.flag.LPD-34594.title=Päätason objektin määritelmät +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki on vanhentunut ja poistetaan tulevaisuudessa. Sinun täytyy siirtää tietosi Liferay Objectiin tietojen menettämisen välttämiseksi. feature.flag.LPD-35013.title=Wikit feature.flag.LPD-35678.description=Salli B2B- ja B2X-kanavien käyttäjien käyttää vierasmaksua tai kirjautua sisään ja siirtää korinsa yritystilille. @@ -18874,7 +18879,7 @@ the-friendly-url-has-too-many-slashes=Käyttäjäystävällisessä osoitteessa o the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=Ystävällinen URL on jo käytössä. Anna yksikäsitteinen ystävällinen URL. the-friendly-url-is-appended-to-x-for-pages=Ystävällinen URL on lisätty kohteeseen {0} sivuille. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=Käyttäjäystävällinen URL-osoite liitetään {0} perään julkisille sivuille ja {1} perään jäsensivuille. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=Ystävällinen url luodaan automaattisesti merkinnän otsikkokentän mukaan. +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=Ystävällinen URL luodaan automaattisesti merkinnän otsikkokentän mukaan. the-friendly-url-is-too-long=Ystävällinen URL on liian pitkä. the-friendly-url-may-be-modified-to-ensure-uniqueness=Ystävällistä URL:ää voidaan muuttaa varmistamaan yksikäsitteisyys. the-friendly-url-may-conflict-with-another-page=Käyttäjäystävällinen URL-osoite saattaa olla ristiriidassa toisen sivun kanssa. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr.properties index 139107971176c5..a912e095e3cef4 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Chemin d'accès du certificat certificate-url=URL du certificat chain-method=Méthode chaîne change=Changer +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Modifier l'affectation change-clickable-element=Modifier l'élément cliquable change-collection=Changer la collection @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changer le modèle n'affectera pas le modèle par défaut des contenus Web d'origine. La modification ne s'appliquera qu'à cet affichage de contenu web. changing-the-value-of-this-field-reloads-the-page=Le changement de la valeur de ce champ rechargera la page. changing-this-setting-will-reset-all-mappings-for-this-collection=La modification de ce paramétrage réinitialisera tous les mappages de cette collection. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Responsables de compte de canal channel-defaults=Valeurs par défaut du canal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Devises commerciales currency=Monnaie currency-code=Code devise currency-id=ID de devise +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symboles monétaires currency.AED=Dirham des EAU currency.ALL=Lek Albanais @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Afficher et gérer les espaces dans le nouvea feature.flag.LPD-32649.title=Section Espaces feature.flag.LPD-34594.description=Les utilisateurs peuvent créer des hiérarchies de définitions d'objets en définissant une définition d'objet racine. Les définitions d'objets enfants sont liées à la racine et héritent des autorisations et de la configuration des widgets de la définition d'objet racine. Les points de terminaison d'API des définitions d'objets enfants sont fusionnés avec les points de terminaison de la racine. feature.flag.LPD-34594.title=Définitions d'objet racine +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Le wiki est obsolète et sera supprimé à l'avenir. Pour éviter la perte de données, vous devez migrer vos données vers Liferay Object. feature.flag.LPD-35013.title=Noeud de page Wiki feature.flag.LPD-35678.description=Autorisez les utilisateurs des canaux B2B et B2X à utiliser le paiement en tant qu'invité ou à se connecter et à transférer leur panier vers un compte professionnel. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_BE.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_BE.properties index 97267da2475df0..b769c96a0bf337 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_BE.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_BE.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Ajouter un vote action.ADD_WAREHOUSE=Ajouter un entrepôt action.ADMINISTRATE=Administrer action.ADMINISTRATOR=Administrateur -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Mise à jour avancée action.APPLY_SXP_BLUEPRINT=Appliquer un plan action.APPROVE_ARTICLE=Approuver un contenu action.APPROVE_OPEN_COMMERCE_ORDERS=Approuver les commandes ouvertes @@ -962,7 +962,7 @@ add-new-attribute=Ajouter un nouvel attribut add-new-categories-or-remove-common-categories=Ajouter de nouvelles catégories ou supprimer des catégories communes. add-new-category=Ajouter une catégorie add-new-entry-to-x=Ajouter une nouvelle entrée à {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Ajoutez de nouveaux champs pour commencer à construire votre structure. add-new-group=Ajouter un nouveau groupe add-new-grouped-entry-to-x=Ajouter une nouvelle entrée groupée à {0} add-new-in-x=Ajouter Nouveau dans {0} @@ -3122,7 +3122,7 @@ categories-for-this-item=Catégories pour cet objet categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Les catégories n'apparaissent dans l'URL que lorsque l'article de blog est associé à une page d'affichage. categories[message-board]=Catégories categorization=Catégorisation -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Noms des classes de catégorisation categorization-configuration-name=Catégorisation categorization-is-disabled-for-the-selected-content=La catégorisation est désactivée pour le contenu sélectionné. Pour afficher les catégories dans ce fragment, la catégorisation doit être activée. categorization-of-object-entries=Catégorisation des entrées d'objet @@ -3360,6 +3360,7 @@ certificate-path-name=Chemin d'accès du certificat certificate-url=URL du certificat chain-method=Méthode chaîne change=Changer +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Modifier l'affectation change-clickable-element=Modifier l'élément cliquable change-collection=Changer la collection @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changer le modèle n'affectera pas le modèle par défaut des contenus Web d'origine. La modification ne s'appliquera qu'à cet affichage de contenu web. changing-the-value-of-this-field-reloads-the-page=Le changement de la valeur de ce champ rechargera la page. changing-this-setting-will-reset-all-mappings-for-this-collection=La modification de ce paramétrage réinitialisera tous les mappages de cette collection. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Responsables de compte de canal channel-defaults=Valeurs par défaut du canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Cliquez ici pour la documentation. click-here-to-preview-the-form-in-a-new-window=Cliquer ici pour prévisualiser le formulaire dans une nouvellement fenêtre. click-here-to-save-it-now=Cliquez ici pour sauvegarder immédiatement. click-new-to-create-your-first-asset=Cliquez sur « Nouveau » pour créer votre premier actif. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Cliquez sur « Nouveau » pour créer votre premier fichier. +click-new-to-create-your-first-piece-of-content=Cliquez sur « Nouveau » pour créer votre premier élément de contenu. click-ok-to-create-a-new-thread-with-the-following-messages=Cliquer sur OK pour créer un nouveau sujet avec les messages suivants. click-on-any-tag-to-edit-it=Cliquer sur une étiquette pour la modifier. click-on-the-object-fields-in-the-sidebar-to-add-properties=Cliquez sur les champs d'objet dans la barre latérale pour ajouter des propriétés. @@ -3799,7 +3801,7 @@ close-search=Fermer la recherche close-sidebar=Fermer la barre latérale close-x=Fermer {0} closed=Fermé -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=La fermeture de la fenêtre n'annulera pas le processus. cloud=Nuage club-event=Événement du club cluster=Faisceau @@ -3808,7 +3810,7 @@ cluster-name=Nom de grappe cluster-name-help=Le nom de la grappe à rejoindre. Le nom doit correspondre à la grappe distante quand le mode d'opération est réglé sur distant. cluster-node-address-timeout=Expiration de l'adresse du nœud de groupage cmis-repository-configuration-name=Dépositaire CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Initialiseur de site CMS code=Noeud code-file-mime-types=Types MIME de fichier de code code-of-the-element=Code de l'élément @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Devises commerciales currency=Monnaie currency-code=Code devise currency-id=ID de devise +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symboles monétaires currency.AED=Dirham des EAU currency.ALL=Lek Albanais @@ -5879,7 +5882,7 @@ desktop=Bureau desktop-view=Vue Bureau destination=Destination destination-address=Adresse du destinataire -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=ID d'entreprise de destination destination-directory=Annuaire de destination destination-field=Champ de destination destination-name=Nom de la destination @@ -7550,10 +7553,12 @@ feature.flag.LPD-31212.description=Les utilisateurs peuvent créer du contenu te feature.flag.LPD-31212.title=Désactiver les validations XSS dans l'éditeur de texte enrichi feature.flag.LPD-31789.description=Autoriser les administrateurs à configurer Google Vertex AI en tant que fournisseur d'intégration de texte pour la recherche sémantique. feature.flag.LPD-31789.title=Fournisseur d'intégration de texte Google Vertex AI -feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Automatic Copy) -feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) +feature.flag.LPD-32649.description=Afficher et gérer les espaces dans le nouveau CMS. +feature.flag.LPD-32649.title=Section Espaces feature.flag.LPD-34594.description=Les utilisateurs peuvent créer des hiérarchies de définitions d'objets en définissant une définition d'objet racine. Les définitions d'objets enfants sont liées à la racine et héritent des autorisations et de la configuration des widgets de la définition d'objet racine. Les points de terminaison d'API des définitions d'objets enfants sont fusionnés avec les points de terminaison de la racine. feature.flag.LPD-34594.title=Définitions d'objet racine +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Le wiki est obsolète et sera supprimé à l'avenir. Pour éviter la perte de données, vous devez migrer vos données vers Liferay Object. feature.flag.LPD-35013.title=Noeud de page Wiki feature.flag.LPD-35678.description=Autorisez les utilisateurs des canaux B2B et B2X à utiliser le paiement en tant qu'invité ou à se connecter et à transférer leur panier vers un compte professionnel. @@ -7590,12 +7595,12 @@ feature.flag.LPD-46393.description=Affichez ou masquez dynamiquement les champs feature.flag.LPD-46393.title=Visibilité des champs de configuration conditionnelle dans les fragments personnalisés feature.flag.LPD-47713.description=La prise en charge du composant d'onglets JavaScript global fourni par Liferay est obsolète. feature.flag.LPD-47713.title=Prise en charge des composants JS : onglets -feature.flag.LPD-48372.description=The AMD loader is deprecated and will be removed in the future. (Automatic Copy) -feature.flag.LPD-48372.title=AMD Loader (Automatic Copy) -feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) -feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48372.description=Le chargeur AMD est obsolète et sera supprimé à l'avenir. +feature.flag.LPD-48372.title=Chargeur AMD +feature.flag.LPD-48862.description=Les propriétés JavaScript globales, Liferay.OAuth2 et Liferay.OAuth2Client sont obsolètes. Elles doivent être utilisées via des import maps. +feature.flag.LPD-48862.title=Client JavaScript OAuth2 +feature.flag.LPD-48975.description=Supprime l'activation de Lodash de l'administrateur système. +feature.flag.LPD-48975.title=Activation Lodash feature.flag.LPS-96845.description=Les clients SCIM configurés peuvent exploiter les API REST pour synchroniser les informations d'identité des utilisateurs et des groupes avec des applications externes. feature.flag.LPS-96845.title=Système de gestion des identités inter-domaines (SCIM) feature.flag.LPS-122920.description=Créez une expérience de recherche qui comprend la signification et le contexte de vos recherches de contenu et d'utilisateurs en tirant parti des modèles de langage ML via des fournisseurs tiers d'intégration de texte et des plans de recherche. Une fois activé, commencez la configuration dans Paramètres d'instance > Expériences de recherche > Recherche sémantique. @@ -7816,7 +7821,7 @@ file-url=URL du fichier file-version-is-invalid=La version du fichier est invalide. files=Dossiers files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Les fichiers peuvent être stockés dans une entrée d'objet ou dans un dossier spécifique dans Documents et médias. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Noms de classe de fichiers fill-out-the-following-form-to-get-driving-directions-to=Complétez le formulaire suivant afin obtenir des informations pour aller dans la direction de filter=Filtre filter-and-order=Filtrer et trier @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragments et widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Les fragments et les widgets ne peuvent pas être placés à l'intérieur de cette zone. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Les fragments et les widgets des pages basées sur ce maître sont placés ici. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Des ensembles de fragments et de widgets peuvent être ordonnés pour vous donner un accès facile à ceux que vous utilisez le plus. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Les fragments ne peuvent être déposés que dans le premier élément de la collection. fragments-cannot-be-placed-inside-a-form-step-container=Le fragment ne peut pas être placé dans un conteneur d'étape de formulaire. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Les fragments ne peuvent pas être placés dans un fragment d'affichage de collection non mappé. fragments-cannot-be-placed-inside-an-unmapped-form-container=Les fragments ne peuvent pas être placés dans un conteneur de formulaire non mappé. @@ -10700,7 +10705,7 @@ map-content=Contenu de la carte map-new-location=Nouvelle localisation sur la carte map-the-error-message-to-be-displayed-next-to-the-validated-field=Mappez le message d'erreur à afficher à côté du champ ou affichez-le placé en haut du formulaire. map-the-selected-content-to-the-x-structure-fields=Mapper le contenu sélectionné vers les champs de structure « {0} ». -map-your-collection=Map Your Collection (Automatic Copy) +map-your-collection=Mappez votre collection map-your-form=Mappez votre formulaire map[relational]=Carte mapped-products=Produits cartographiés @@ -10749,7 +10754,7 @@ marked-text-background-color=Couleur de fond de texte marqué marketing-banner=Bannière commerciale marketplace-connection=Connexion au Marketplace marketplace-is-now-in-fragments=Le Marketplace est maintenant dans Fragments -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=Marketplace est maintenant dans Page Builder marking-messages-as-read=Messages d'inscription comme lu… marking-messages-as-unread=Messages d'inscription comme non lus… mass=La masse @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Définitions d'objet model.resource.com.liferay.object.model.ObjectAction=Action d'objet model.resource.com.liferay.object.model.ObjectDefinition=Définition d'objet model.resource.com.liferay.object.model.ObjectEntry=Objet -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Dossier d'entrée d'objet model.resource.com.liferay.object.model.ObjectField=Champ d'objet model.resource.com.liferay.object.model.ObjectFolder=Dossier d'objet model.resource.com.liferay.object.model.ObjectLayout=Disposition d'objet @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Marge horizontale du lien de navigation nav-link-vertical-active-indicator-length=Longueur de l'indicateur actif vertical du lien de navigation nav-link-vertical-active-indicator-thickness=Épaisseur de l'indicateur actif vertical du lien de navigation nav-link-vertical-margin=Marge verticale du lien de navigation -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Naviguer vers d'autres sections n'annulera pas le processus. navigation=Navigation navigation-bars=Barres de navigation navigation-exception-selectors-description=Définissez les sélectionneurs CSS que le SPA doit ignorer. @@ -12178,7 +12183,7 @@ no-components-were-found=Aucun composant n'a été trouvé. no-configurations-were-found=Aucun configuration n'a été trouvée. no-connected-applications-were-found=Aucune application connectée n'a été trouvée. no-content-was-found-that-matched-keyword-x=Aucun contenu correspondant aux mots-clés : {0} n'a été trouvé. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Aucun contenu pour le moment no-continue=Non, continuer. no-coupons-were-found=Aucun bon n'a été trouvé. no-css-client-extensions-were-loaded=Aucune extension client CSS n'a été chargée. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=Aucun champ n'est disponible pour ce type. no-fields-are-available-for-x-editable=Aucun champ n'est disponible pour le modifiable {0}. no-fields-available=Aucun champ disponible no-fields-were-found=Aucun champ n'a été trouvé. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Aucun champ pour l'instant no-file-is-selected=Aucun fichier n'est sélectionné. no-file-selected=Aucun fichier sélectionné. no-files-selected=Aucun fichier sélectionné. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Aucun fichier pour l'instant no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=Aucune source de filtre n'est disponible. Créez une liste de sélection ou un vocabulaire pour ce type de filtre. no-filter-was-created-yet=Aucun filtre n'a encore été créé. no-filters=Aucun filtre @@ -13318,7 +13323,7 @@ page-variations-x=Variation de page {0} page-versioning=Versionnage de page page-versioning-help=Le versioning de page vous permet de travailler en parallèle dans différentes variantes de ces pages. Il vous permet également de garder un historique de modifications de ces pages. page-with-permissions=Page avec permissions -page-x=Page {0} (Automatic Copy) +page-x=Page {0} page-x-has-not-been-published-to-live-yet=La page {0} n'a pas encore été publiée en production. page-x-of-approximately-x-results=Page {0} d'environ {1} résultats. page-x-of-x=Page {0} sur {1} @@ -14168,9 +14173,9 @@ portal-instance=Instance de portail portal-instance-help=Objet qui représente l'instance de portail actuelle. portal-instance-id=ID de l'Instance de portail portal-instance-id-help=L'identifiant de l'instance de portail actuelle. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Copie d'instance de portail +portal-instances-extraction-configuration-name=Extraction d'instance de portail +portal-instances-insertion-configuration-name=Insertion d'instance de portail portal-name=Nom du portail portal-properties=Propriétés du portail portal-properties-analysis=Analyse des propriétés du portail @@ -16023,7 +16028,7 @@ search-everywhere=Rechercher partout search-experiences=Rechercher des expériences search-feeds=Rechercher des flux search-field-is-empty=Le champ de recherche est vide. Tous les champs sont répertoriés. -search-fields=Search Fields (Automatic Copy) +search-fields=Champs de recherche search-file-entries=Rechercher des fichiers search-folder=Rechercher dans le répertoire search-folders=Rechercher dans les répertoires @@ -16196,7 +16201,7 @@ segments-service-company-configuration-name=Service des segments segments-service-configuration-name=Service des segments select=Sélectionner select-a-blueprint-or-element-json-file-to-import=Sélectionnez un fichier JSON de plan ou d'élément à importer. -select-a-collection-to-display=Select a collection to display. (Automatic Copy) +select-a-collection-to-display=Sélectionnez une collection à afficher. select-a-collection-to-make-it-visible=Sélectionnez une collection pour la rendre visible. select-a-content-type-to-start-creating-the-form=Sélectionnez un type de contenu pour commencer à créer le formulaire. select-a-data-set-view=Sélectionnez une vue d'ensemble de données. @@ -17427,7 +17432,7 @@ source=Source source-address=Adresse De la Source source-code=Code source source-code-url=URL de code source -source-company-id=Source Company ID (Automatic Copy) +source-company-id=ID d'entreprise source source-file=Fichier source source-file-field=Champ du fichier source source-folder=Dossier source @@ -17462,7 +17467,7 @@ spacer-9=Espaceur 9 spacer-10=Espaceur 10 spacer-options=Options d'espacement spacers=Espaceurs -spaces=Spaces (Automatic Copy) +spaces=Espaces spaces-are-not-allowed=Les espaces ne sont pas autorisés. spacing=Espacement spam=Pourriel @@ -17709,7 +17714,7 @@ structure-restrictions-help=Les dossier peuvent être restreints pour autoriser structure-type=Type de structure structures=Structures structures-and-types=Structures et types -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Noms des classes de structures student-capacity=Capacité d'étudiant students=Étudiants style=Modèle @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=L'URL conviviale compte trop de slashs. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=Cette URL simplifiée est déjà utilisée. Veuillez saisir une URL simplifiée unique. the-friendly-url-is-appended-to-x-for-pages=L'URL simplifiée est ajoutée à {0} pour les pages. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=l'URL simplifié est concaténé à {0} pour les pages publiques et à {1} pour les pages privées. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=L'URL simplifiée est automatiquement générée en fonction du champ de titre de l'entrée. the-friendly-url-is-too-long=L'URL conviviale est trop longue. the-friendly-url-may-be-modified-to-ensure-uniqueness=L'URL simplifiée peut être modifiée pour garantir l'unicité. the-friendly-url-may-conflict-with-another-page=L'URL conviviale peut entrer en conflit avec une autre page. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=La quantité dépass the-quantity-is-required=La quantité est requise. the-question-could-not-be-found=La question n'a pu être trouvée. the-question-is-not-found=La question n'a pas été trouvée. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=L'URL sans script reCAPTCHA n'est pas valide. the-recaptcha-private-key-is-not-valid=La clé privée de reCAPTCHA est invalide. the-recaptcha-public-key-is-not-valid=La clé publique de reCAPTCHA est invalide. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=L'URL avec script reCAPTCHA n'est pas valide. +the-recaptcha-verify-url-is-not-valid=L'URL de vérification reCAPTCHA n'est pas valide. the-record-could-not-be-found=L'enregistrement n'a pas été trouvé. the-recordSet-could-not-be-found=L'ensemble d'enregistrements n'a pas été trouvé. the-recycle-bin=La Corbeille @@ -20766,7 +20771,7 @@ untitled-rule=Règle sans titre untitled-scheduled-publish-process=Processus de publication programmée sans titre untitled-segment=Segment sans intitulé untitled-set=Ensemble sans titre -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Structure sans titre untitled-workflow=Flux de travail sans titre untitled-x={0} sans titre untracked=Non suivi @@ -21562,7 +21567,7 @@ was=Était was-this-information-helpful=Cette information était-elle utile ? watcher=Observateur we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=Nous sommes ravis de vous annoncer que Marketplace fait désormais partie de Fragments ! Parcourez, installez et gérez de nouveaux fragments et ensembles de fragments sans jamais quitter l'administration de Fragments. -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=Nous sommes ravis de vous annoncer que Marketplace fait désormais partie de Page Builder ! Parcourez, installez et gérez les composants sans quitter la page. we-will-not-send-you-emails-to-x-anymore=Nous ne vous enverrons plus d'e-mails à {0}. weather=Météo weather-condition-id=ID de condition météorologique diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CA.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CA.properties index 173e5a56dfbc5f..99147b62b89c8e 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CA.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CA.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Chemin d'accès du certificat certificate-url=URL du certificat chain-method=Méthode chaîne change=Changer +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Modifier l'élément cliquable change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changer le modèle n'affectera pas le modèle par défaut des contenus Web d'origine. La modification ne s'appliquera qu'à cet affichage de contenu web. changing-the-value-of-this-field-reloads-the-page=Le changement de la valeur de ce champ rechargera la page. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Devises commerciales currency=Monnaie currency-code=Currency Code (Automatic Copy) currency-id=ID de devise +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symboles monétaires currency.AED=Dirham des EAU currency.ALL=Lek Albanais @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Noeud de page Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CH.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CH.properties index 97267da2475df0..b769c96a0bf337 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CH.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_fr_CH.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Ajouter un vote action.ADD_WAREHOUSE=Ajouter un entrepôt action.ADMINISTRATE=Administrer action.ADMINISTRATOR=Administrateur -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Mise à jour avancée action.APPLY_SXP_BLUEPRINT=Appliquer un plan action.APPROVE_ARTICLE=Approuver un contenu action.APPROVE_OPEN_COMMERCE_ORDERS=Approuver les commandes ouvertes @@ -962,7 +962,7 @@ add-new-attribute=Ajouter un nouvel attribut add-new-categories-or-remove-common-categories=Ajouter de nouvelles catégories ou supprimer des catégories communes. add-new-category=Ajouter une catégorie add-new-entry-to-x=Ajouter une nouvelle entrée à {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Ajoutez de nouveaux champs pour commencer à construire votre structure. add-new-group=Ajouter un nouveau groupe add-new-grouped-entry-to-x=Ajouter une nouvelle entrée groupée à {0} add-new-in-x=Ajouter Nouveau dans {0} @@ -3122,7 +3122,7 @@ categories-for-this-item=Catégories pour cet objet categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Les catégories n'apparaissent dans l'URL que lorsque l'article de blog est associé à une page d'affichage. categories[message-board]=Catégories categorization=Catégorisation -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Noms des classes de catégorisation categorization-configuration-name=Catégorisation categorization-is-disabled-for-the-selected-content=La catégorisation est désactivée pour le contenu sélectionné. Pour afficher les catégories dans ce fragment, la catégorisation doit être activée. categorization-of-object-entries=Catégorisation des entrées d'objet @@ -3360,6 +3360,7 @@ certificate-path-name=Chemin d'accès du certificat certificate-url=URL du certificat chain-method=Méthode chaîne change=Changer +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Modifier l'affectation change-clickable-element=Modifier l'élément cliquable change-collection=Changer la collection @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changer le modèle n'affectera pas le modèle par défaut des contenus Web d'origine. La modification ne s'appliquera qu'à cet affichage de contenu web. changing-the-value-of-this-field-reloads-the-page=Le changement de la valeur de ce champ rechargera la page. changing-this-setting-will-reset-all-mappings-for-this-collection=La modification de ce paramétrage réinitialisera tous les mappages de cette collection. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Responsables de compte de canal channel-defaults=Valeurs par défaut du canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Cliquez ici pour la documentation. click-here-to-preview-the-form-in-a-new-window=Cliquer ici pour prévisualiser le formulaire dans une nouvellement fenêtre. click-here-to-save-it-now=Cliquez ici pour sauvegarder immédiatement. click-new-to-create-your-first-asset=Cliquez sur « Nouveau » pour créer votre premier actif. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Cliquez sur « Nouveau » pour créer votre premier fichier. +click-new-to-create-your-first-piece-of-content=Cliquez sur « Nouveau » pour créer votre premier élément de contenu. click-ok-to-create-a-new-thread-with-the-following-messages=Cliquer sur OK pour créer un nouveau sujet avec les messages suivants. click-on-any-tag-to-edit-it=Cliquer sur une étiquette pour la modifier. click-on-the-object-fields-in-the-sidebar-to-add-properties=Cliquez sur les champs d'objet dans la barre latérale pour ajouter des propriétés. @@ -3799,7 +3801,7 @@ close-search=Fermer la recherche close-sidebar=Fermer la barre latérale close-x=Fermer {0} closed=Fermé -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=La fermeture de la fenêtre n'annulera pas le processus. cloud=Nuage club-event=Événement du club cluster=Faisceau @@ -3808,7 +3810,7 @@ cluster-name=Nom de grappe cluster-name-help=Le nom de la grappe à rejoindre. Le nom doit correspondre à la grappe distante quand le mode d'opération est réglé sur distant. cluster-node-address-timeout=Expiration de l'adresse du nœud de groupage cmis-repository-configuration-name=Dépositaire CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Initialiseur de site CMS code=Noeud code-file-mime-types=Types MIME de fichier de code code-of-the-element=Code de l'élément @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Devises commerciales currency=Monnaie currency-code=Code devise currency-id=ID de devise +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symboles monétaires currency.AED=Dirham des EAU currency.ALL=Lek Albanais @@ -5879,7 +5882,7 @@ desktop=Bureau desktop-view=Vue Bureau destination=Destination destination-address=Adresse du destinataire -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=ID d'entreprise de destination destination-directory=Annuaire de destination destination-field=Champ de destination destination-name=Nom de la destination @@ -7550,10 +7553,12 @@ feature.flag.LPD-31212.description=Les utilisateurs peuvent créer du contenu te feature.flag.LPD-31212.title=Désactiver les validations XSS dans l'éditeur de texte enrichi feature.flag.LPD-31789.description=Autoriser les administrateurs à configurer Google Vertex AI en tant que fournisseur d'intégration de texte pour la recherche sémantique. feature.flag.LPD-31789.title=Fournisseur d'intégration de texte Google Vertex AI -feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Automatic Copy) -feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) +feature.flag.LPD-32649.description=Afficher et gérer les espaces dans le nouveau CMS. +feature.flag.LPD-32649.title=Section Espaces feature.flag.LPD-34594.description=Les utilisateurs peuvent créer des hiérarchies de définitions d'objets en définissant une définition d'objet racine. Les définitions d'objets enfants sont liées à la racine et héritent des autorisations et de la configuration des widgets de la définition d'objet racine. Les points de terminaison d'API des définitions d'objets enfants sont fusionnés avec les points de terminaison de la racine. feature.flag.LPD-34594.title=Définitions d'objet racine +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Le wiki est obsolète et sera supprimé à l'avenir. Pour éviter la perte de données, vous devez migrer vos données vers Liferay Object. feature.flag.LPD-35013.title=Noeud de page Wiki feature.flag.LPD-35678.description=Autorisez les utilisateurs des canaux B2B et B2X à utiliser le paiement en tant qu'invité ou à se connecter et à transférer leur panier vers un compte professionnel. @@ -7590,12 +7595,12 @@ feature.flag.LPD-46393.description=Affichez ou masquez dynamiquement les champs feature.flag.LPD-46393.title=Visibilité des champs de configuration conditionnelle dans les fragments personnalisés feature.flag.LPD-47713.description=La prise en charge du composant d'onglets JavaScript global fourni par Liferay est obsolète. feature.flag.LPD-47713.title=Prise en charge des composants JS : onglets -feature.flag.LPD-48372.description=The AMD loader is deprecated and will be removed in the future. (Automatic Copy) -feature.flag.LPD-48372.title=AMD Loader (Automatic Copy) -feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) -feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48372.description=Le chargeur AMD est obsolète et sera supprimé à l'avenir. +feature.flag.LPD-48372.title=Chargeur AMD +feature.flag.LPD-48862.description=Les propriétés JavaScript globales, Liferay.OAuth2 et Liferay.OAuth2Client sont obsolètes. Elles doivent être utilisées via des import maps. +feature.flag.LPD-48862.title=Client JavaScript OAuth2 +feature.flag.LPD-48975.description=Supprime l'activation de Lodash de l'administrateur système. +feature.flag.LPD-48975.title=Activation Lodash feature.flag.LPS-96845.description=Les clients SCIM configurés peuvent exploiter les API REST pour synchroniser les informations d'identité des utilisateurs et des groupes avec des applications externes. feature.flag.LPS-96845.title=Système de gestion des identités inter-domaines (SCIM) feature.flag.LPS-122920.description=Créez une expérience de recherche qui comprend la signification et le contexte de vos recherches de contenu et d'utilisateurs en tirant parti des modèles de langage ML via des fournisseurs tiers d'intégration de texte et des plans de recherche. Une fois activé, commencez la configuration dans Paramètres d'instance > Expériences de recherche > Recherche sémantique. @@ -7816,7 +7821,7 @@ file-url=URL du fichier file-version-is-invalid=La version du fichier est invalide. files=Dossiers files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Les fichiers peuvent être stockés dans une entrée d'objet ou dans un dossier spécifique dans Documents et médias. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Noms de classe de fichiers fill-out-the-following-form-to-get-driving-directions-to=Complétez le formulaire suivant afin obtenir des informations pour aller dans la direction de filter=Filtre filter-and-order=Filtrer et trier @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragments et widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Les fragments et les widgets ne peuvent pas être placés à l'intérieur de cette zone. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Les fragments et les widgets des pages basées sur ce maître sont placés ici. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Des ensembles de fragments et de widgets peuvent être ordonnés pour vous donner un accès facile à ceux que vous utilisez le plus. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Les fragments ne peuvent être déposés que dans le premier élément de la collection. fragments-cannot-be-placed-inside-a-form-step-container=Le fragment ne peut pas être placé dans un conteneur d'étape de formulaire. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Les fragments ne peuvent pas être placés dans un fragment d'affichage de collection non mappé. fragments-cannot-be-placed-inside-an-unmapped-form-container=Les fragments ne peuvent pas être placés dans un conteneur de formulaire non mappé. @@ -10700,7 +10705,7 @@ map-content=Contenu de la carte map-new-location=Nouvelle localisation sur la carte map-the-error-message-to-be-displayed-next-to-the-validated-field=Mappez le message d'erreur à afficher à côté du champ ou affichez-le placé en haut du formulaire. map-the-selected-content-to-the-x-structure-fields=Mapper le contenu sélectionné vers les champs de structure « {0} ». -map-your-collection=Map Your Collection (Automatic Copy) +map-your-collection=Mappez votre collection map-your-form=Mappez votre formulaire map[relational]=Carte mapped-products=Produits cartographiés @@ -10749,7 +10754,7 @@ marked-text-background-color=Couleur de fond de texte marqué marketing-banner=Bannière commerciale marketplace-connection=Connexion au Marketplace marketplace-is-now-in-fragments=Le Marketplace est maintenant dans Fragments -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=Marketplace est maintenant dans Page Builder marking-messages-as-read=Messages d'inscription comme lu… marking-messages-as-unread=Messages d'inscription comme non lus… mass=La masse @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Définitions d'objet model.resource.com.liferay.object.model.ObjectAction=Action d'objet model.resource.com.liferay.object.model.ObjectDefinition=Définition d'objet model.resource.com.liferay.object.model.ObjectEntry=Objet -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Dossier d'entrée d'objet model.resource.com.liferay.object.model.ObjectField=Champ d'objet model.resource.com.liferay.object.model.ObjectFolder=Dossier d'objet model.resource.com.liferay.object.model.ObjectLayout=Disposition d'objet @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Marge horizontale du lien de navigation nav-link-vertical-active-indicator-length=Longueur de l'indicateur actif vertical du lien de navigation nav-link-vertical-active-indicator-thickness=Épaisseur de l'indicateur actif vertical du lien de navigation nav-link-vertical-margin=Marge verticale du lien de navigation -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Naviguer vers d'autres sections n'annulera pas le processus. navigation=Navigation navigation-bars=Barres de navigation navigation-exception-selectors-description=Définissez les sélectionneurs CSS que le SPA doit ignorer. @@ -12178,7 +12183,7 @@ no-components-were-found=Aucun composant n'a été trouvé. no-configurations-were-found=Aucun configuration n'a été trouvée. no-connected-applications-were-found=Aucune application connectée n'a été trouvée. no-content-was-found-that-matched-keyword-x=Aucun contenu correspondant aux mots-clés : {0} n'a été trouvé. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Aucun contenu pour le moment no-continue=Non, continuer. no-coupons-were-found=Aucun bon n'a été trouvé. no-css-client-extensions-were-loaded=Aucune extension client CSS n'a été chargée. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=Aucun champ n'est disponible pour ce type. no-fields-are-available-for-x-editable=Aucun champ n'est disponible pour le modifiable {0}. no-fields-available=Aucun champ disponible no-fields-were-found=Aucun champ n'a été trouvé. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Aucun champ pour l'instant no-file-is-selected=Aucun fichier n'est sélectionné. no-file-selected=Aucun fichier sélectionné. no-files-selected=Aucun fichier sélectionné. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Aucun fichier pour l'instant no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=Aucune source de filtre n'est disponible. Créez une liste de sélection ou un vocabulaire pour ce type de filtre. no-filter-was-created-yet=Aucun filtre n'a encore été créé. no-filters=Aucun filtre @@ -13318,7 +13323,7 @@ page-variations-x=Variation de page {0} page-versioning=Versionnage de page page-versioning-help=Le versioning de page vous permet de travailler en parallèle dans différentes variantes de ces pages. Il vous permet également de garder un historique de modifications de ces pages. page-with-permissions=Page avec permissions -page-x=Page {0} (Automatic Copy) +page-x=Page {0} page-x-has-not-been-published-to-live-yet=La page {0} n'a pas encore été publiée en production. page-x-of-approximately-x-results=Page {0} d'environ {1} résultats. page-x-of-x=Page {0} sur {1} @@ -14168,9 +14173,9 @@ portal-instance=Instance de portail portal-instance-help=Objet qui représente l'instance de portail actuelle. portal-instance-id=ID de l'Instance de portail portal-instance-id-help=L'identifiant de l'instance de portail actuelle. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Copie d'instance de portail +portal-instances-extraction-configuration-name=Extraction d'instance de portail +portal-instances-insertion-configuration-name=Insertion d'instance de portail portal-name=Nom du portail portal-properties=Propriétés du portail portal-properties-analysis=Analyse des propriétés du portail @@ -16023,7 +16028,7 @@ search-everywhere=Rechercher partout search-experiences=Rechercher des expériences search-feeds=Rechercher des flux search-field-is-empty=Le champ de recherche est vide. Tous les champs sont répertoriés. -search-fields=Search Fields (Automatic Copy) +search-fields=Champs de recherche search-file-entries=Rechercher des fichiers search-folder=Rechercher dans le répertoire search-folders=Rechercher dans les répertoires @@ -16196,7 +16201,7 @@ segments-service-company-configuration-name=Service des segments segments-service-configuration-name=Service des segments select=Sélectionner select-a-blueprint-or-element-json-file-to-import=Sélectionnez un fichier JSON de plan ou d'élément à importer. -select-a-collection-to-display=Select a collection to display. (Automatic Copy) +select-a-collection-to-display=Sélectionnez une collection à afficher. select-a-collection-to-make-it-visible=Sélectionnez une collection pour la rendre visible. select-a-content-type-to-start-creating-the-form=Sélectionnez un type de contenu pour commencer à créer le formulaire. select-a-data-set-view=Sélectionnez une vue d'ensemble de données. @@ -17427,7 +17432,7 @@ source=Source source-address=Adresse De la Source source-code=Code source source-code-url=URL de code source -source-company-id=Source Company ID (Automatic Copy) +source-company-id=ID d'entreprise source source-file=Fichier source source-file-field=Champ du fichier source source-folder=Dossier source @@ -17462,7 +17467,7 @@ spacer-9=Espaceur 9 spacer-10=Espaceur 10 spacer-options=Options d'espacement spacers=Espaceurs -spaces=Spaces (Automatic Copy) +spaces=Espaces spaces-are-not-allowed=Les espaces ne sont pas autorisés. spacing=Espacement spam=Pourriel @@ -17709,7 +17714,7 @@ structure-restrictions-help=Les dossier peuvent être restreints pour autoriser structure-type=Type de structure structures=Structures structures-and-types=Structures et types -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Noms des classes de structures student-capacity=Capacité d'étudiant students=Étudiants style=Modèle @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=L'URL conviviale compte trop de slashs. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=Cette URL simplifiée est déjà utilisée. Veuillez saisir une URL simplifiée unique. the-friendly-url-is-appended-to-x-for-pages=L'URL simplifiée est ajoutée à {0} pour les pages. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=l'URL simplifié est concaténé à {0} pour les pages publiques et à {1} pour les pages privées. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=L'URL simplifiée est automatiquement générée en fonction du champ de titre de l'entrée. the-friendly-url-is-too-long=L'URL conviviale est trop longue. the-friendly-url-may-be-modified-to-ensure-uniqueness=L'URL simplifiée peut être modifiée pour garantir l'unicité. the-friendly-url-may-conflict-with-another-page=L'URL conviviale peut entrer en conflit avec une autre page. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=La quantité dépass the-quantity-is-required=La quantité est requise. the-question-could-not-be-found=La question n'a pu être trouvée. the-question-is-not-found=La question n'a pas été trouvée. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=L'URL sans script reCAPTCHA n'est pas valide. the-recaptcha-private-key-is-not-valid=La clé privée de reCAPTCHA est invalide. the-recaptcha-public-key-is-not-valid=La clé publique de reCAPTCHA est invalide. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=L'URL avec script reCAPTCHA n'est pas valide. +the-recaptcha-verify-url-is-not-valid=L'URL de vérification reCAPTCHA n'est pas valide. the-record-could-not-be-found=L'enregistrement n'a pas été trouvé. the-recordSet-could-not-be-found=L'ensemble d'enregistrements n'a pas été trouvé. the-recycle-bin=La Corbeille @@ -20766,7 +20771,7 @@ untitled-rule=Règle sans titre untitled-scheduled-publish-process=Processus de publication programmée sans titre untitled-segment=Segment sans intitulé untitled-set=Ensemble sans titre -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Structure sans titre untitled-workflow=Flux de travail sans titre untitled-x={0} sans titre untracked=Non suivi @@ -21562,7 +21567,7 @@ was=Était was-this-information-helpful=Cette information était-elle utile ? watcher=Observateur we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=Nous sommes ravis de vous annoncer que Marketplace fait désormais partie de Fragments ! Parcourez, installez et gérez de nouveaux fragments et ensembles de fragments sans jamais quitter l'administration de Fragments. -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=Nous sommes ravis de vous annoncer que Marketplace fait désormais partie de Page Builder ! Parcourez, installez et gérez les composants sans quitter la page. we-will-not-send-you-emails-to-x-anymore=Nous ne vous enverrons plus d'e-mails à {0}. weather=Météo weather-condition-id=ID de condition météorologique diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_gl.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_gl.properties index 15fbf5ade44f15..ad4525826e9fe4 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_gl.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_gl.properties @@ -3176,7 +3176,7 @@ category.batch-planner=Planificador por lotes category.bi=Intelixencia empresarial e informes category.blogs=Blogs category.breadcrumbs=Camiños de navegación -category.captcha=Captcha +category.captcha=CAPTCHA category.catalog=Catálogo category.channel=Canle category.chat=Conversa @@ -3360,6 +3360,7 @@ certificate-path-name=Ruta do certificado certificate-url=URL de certificado chain-method=Método de cadea change=Cambiar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Cambiar asignación change-clickable-element=Cambiar o elemento clicable change-collection=Cambiar colección @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Cambiar o modelo non afectará ao modelo predeterminado de contido web orixinal. O cambio só se aplica a esta pantalla de contido web. changing-the-value-of-this-field-reloads-the-page=Cambiar o valor de este campo fará que a páxina se recargue. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canle channel-account-managers=Xestores de contas de canles channel-defaults=Predeterminado da canle @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Moedas de comercio currency=Moeda currency-code=Código de divisa currency-id=ID da moeda +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos de moeda currency.AED=Dirham dos EAU currency.ALL=Lek Albanés @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Os usuarios poden crear xerarquías de definicións de obxecto ao definir unha definición do obxecto raíz. As definicións de obxectos fillos están vinculadas á raíz e herdan a configuración de widgets e permisos da definición do obxecto raíz. Os endpoints da API das definicións de obxectos fillos están combinados cos endpoints raíz. feature.flag.LPD-34594.title=Definicións de obxecto raíz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Nodo do Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hi_IN.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hi_IN.properties index 7ff68d936e2399..e5d2ab5734a68f 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hi_IN.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hi_IN.properties @@ -3360,6 +3360,7 @@ certificate-path-name=सर्टिफिकेट पाथ (Automatic Transl certificate-url=सर्टिफिकेट यूआरएल (Automatic Translation) chain-method=चेन विधि change=बदलना +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=क्लिक करने योग्य तत्व बदलें (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=इस फील्ड की वॅल्यू को चेंज करने के लिए पेज दुबारा रिलोड करेगा changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=चैनल channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=वाणिज्य मुद्रा currency=करेन्सी currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=करेन्सी सिंबल्स currency.AED=संयुक्त अरब अमीरात दिर्हाम currency.ALL=अल्बानियाई लेक @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=विकी feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hr.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hr.properties index e561c8354136b3..cc0a1b9974d727 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hr.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hr.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Promijeni +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Promjena vrijednosti ovog polja će ponovno učitati stranicu. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simoboli valuta currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanski lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki čvorovi feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hu.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hu.properties index 81642442bf254a..51fd017e3dbc94 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hu.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_hu.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Tanúsítvány útvonala certificate-url=Tanúsítvány URL-címe chain-method=Láncmódszer change=Módosítás +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Hozzárendelés megváltoztatása change-clickable-element=Rákattintható elem megváltoztatása change-collection=Gyűjtemény megváltoztatása @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=A sablon megváltoztatása nincs hatással az eredeti webes tartalom alapértelmezett sablonjára. A változás csak a jelen webes tartalom megjelenítésére vonatkozik. changing-the-value-of-this-field-reloads-the-page=Ennek a mezőnek a megváltoztatásakor az oldal újratöltődik. changing-this-setting-will-reset-all-mappings-for-this-collection=A beállítás megváltoztatása visszaállítja a gyűjtemény összes hozzárendelését. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Csatorna channel-account-managers=Csatorna fiókmenedzserei channel-defaults=Csatorna alapértelmezett értékei @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Kereskedelmi pénznemek currency=Pénznem currency-code=Pénznemkód currency-id=Pénznem azonosító +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Pénznem jelek currency.AED=UAE dirham currency.ALL=Albán lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Helyközök megjelenítése és kezelése az feature.flag.LPD-32649.title=Helyközök szakasza feature.flag.LPD-34594.description=A felhasználók objektumdefiníciós hierarchiákat hozhatnak létre gyökérobjektum-definíció meghatározásával. Az alárendelt objektumdefiníciók a gyökérhez kapcsolódnak, és a jogosultságokat és a widget konfigurációját a gyökérobjektum-definíciótól öröklik. Az alárendelt objektumok definícióinak API végpontjai összevonásra kerülnek a gyökér végpontjaival. feature.flag.LPD-34594.title=Gyökérobjektum-definíciók +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=A Wiki elavult, és a jövőben eltávolításra kerül. Az adatvesztés elkerülése érdekében migrálja adatait a Liferay Objectbe. feature.flag.LPD-35013.title=Wiki csomópontok feature.flag.LPD-35678.description=Lehetővé teszi a B2B és B2X csatornákon lévő felhasználók számára a pénztár vendégként történő használatát vagy a bejelentkezést és a kosár üzleti fiókba való átvitelét. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_in.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_in.properties index ec511c44d9d9c3..7e6496f664c667 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_in.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_in.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Jalur Sertifikat (Automatic Translation) certificate-url=URL Sertifikat (Automatic Translation) chain-method=Metode Rantai (Automatic Translation) change=Mengubah +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Ubah Elemen yang Dapat Diklik (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Merubah nilai dari field ini akan mereload halaman. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Mata Uang Perdagangan (Automatic Translati currency=Mata Uang currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simbol Mata Uang currency.AED=Dirham UEA (Automatic Translation) currency.ALL=Lek Albania @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Control Panel) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it.properties index db8789260f1bc5..fedfe1dac725f7 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it.properties @@ -3359,6 +3359,7 @@ certificate-path-name=Password certificato certificate-url=URL certificato (Automatic Translation) chain-method=Metodo Chain (Automatic Translation) change=Modifica +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Modifica elemento selezionabile (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3434,6 +3435,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Modificando il valore di questo campo la pagina verrà ricaricata. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=canale (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5055,6 +5057,7 @@ currencies.commerce.health.status.key=Valute commerciali (Automatic Translation) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simboli di Valuta currency.AED=Dirham degli EAU currency.ALL=Lek Albanese @@ -7553,6 +7556,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Nodi Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it_CH.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it_CH.properties index e7050c9b20cec3..1ed6c2fa31ab6d 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it_CH.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_it_CH.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Password certificato certificate-url=URL certificato (Automatic Translation) chain-method=Metodo Chain (Automatic Translation) change=Modifica +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Modifica elemento selezionabile (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Modificando il valore di questo campo la pagina verrà ricaricata. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=canale (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Valute commerciali (Automatic Translation) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simboli di Valuta currency.AED=Dirham degli EAU currency.ALL=Lek Albanese @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Nodi Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_iw.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_iw.properties index a10fcf18ae7826..714ea9b57a4cc8 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_iw.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_iw.properties @@ -3360,6 +3360,7 @@ certificate-path-name=נתיב האישור certificate-url=כתובת URL של האישור chain-method=שיטת שרשרת (Automatic Translation) change=לשנות +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=שנה רכיב הניתן ללחיצה (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=שינוי התבנית לא ישפיע על התבנית המקורית של תוכן אתר האינטרנט המוגדרת כברירת מחדל. השינוי חל רק על תצוגת התוכן של אתר אינטרנט זה. changing-the-value-of-this-field-reloads-the-page=שינוי ערך שדה זה יטעין מחדש את הדף. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=ערוץ (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=מטבעות מסחר currency=מטבע currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=סמל המטבע currency.AED=דירהם של איגוד הנסיכויות הערביות currency.ALL=לק אלבני @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=צמתי ויקי feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ja.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ja.properties index 9023a1c92209f9..5cbb85965a0537 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ja.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ja.properties @@ -3360,6 +3360,7 @@ certificate-path-name=証明書へのパス certificate-url=証明書URL chain-method=連鎖方法 change=変更 +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=割り当ての変更 change-clickable-element=クリック可能要素の変更 change-collection=コレクションを変更 @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=テンプレートの変更は デフォルトのWeb コンテンツに影響を与えることはありません。変更は、この web コンテンツ表示にのみ適用されます。 changing-the-value-of-this-field-reloads-the-page=この値を変更するとページをリロードします。 changing-this-setting-will-reset-all-mappings-for-this-collection=この設定を変更すると、このコレクションのすべてのマッピングがリセットされます。 +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=チャンネル channel-account-managers=チャンネルアカウントマネージャー channel-defaults=チャンネルのデフォルト @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=コマース通貨 currency=為替レート currency-code=通貨コード currency-id=通貨ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=通貨文字 currency.AED=UAE ディルハム currency.ALL=アルバニア レク @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=新しい CMS 内のスペースを表示し feature.flag.LPD-32649.title=スペースセクション feature.flag.LPD-34594.description=ユーザーはルートオブジェクト定義を定義することでオブジェクト定義階層を作成できます。子オブジェクト定義はルートにバインドされ、ルートオブジェクト定義の権限とウィジェット設定を継承します。子オブジェクト定義の API エンドポイントはルートのエンドポイントとマージされます。 feature.flag.LPD-34594.title=ルートオブジェクト定義 +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki は廃止予定であり、今後削除される予定です。データの消失を回避するには、データを Liferay オブジェクトに移行してください。 feature.flag.LPD-35013.title=Wikiノード feature.flag.LPD-35678.description=B2B および B2X チャンネルのユーザーがゲストチェックアウトを使用したり、またはログインして自分のカートをビジネスアカウントに転送したりできるようにします。 diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_kk.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_kk.properties index c2eae8032cf594..0206ba34267a9c 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_kk.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_kk.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Currency (Automatic Copy) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols (Automatic Copy) currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki Nodes feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_km.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_km.properties index 34b87b3b354b4b..8c56e75a216bc9 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_km.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_km.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path certificate-url=Certificate URL chain-method=Chain Method change=Change +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel channel-account-managers=Channel Account Managers channel-defaults=Channel Defaults @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies currency=Currency currency-code=Currency Code currency-id=Currency ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols currency.AED=UAE Dirham currency.ALL=Albanian Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ko.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ko.properties index 60be20eafe90e4..0ff839f69416c1 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ko.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ko.properties @@ -3360,6 +3360,7 @@ certificate-path-name=인증서 경로 certificate-url=인증서 URL chain-method=체인 방식 change=변경 +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=클릭할 수 있는 요소 변경 change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=템플릿을 변경해도 원본 웹 콘텐츠 기본 템플릿에는 영향을 미치지 않습니다. 변경 사항은 이 웹 컨텐츠 표시에만 적용됩니다. changing-the-value-of-this-field-reloads-the-page=이 필드 값의 변경은 페이지를 다시 로딩 합니다. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=채널 channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=커머스 통화 currency=통화 currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=통화 기호 currency.AED=아랍 에미리트 연방 Dirham currency.ALL=알바니아 Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki마디 feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lo.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lo.properties index 3a269dc4f554a5..5a1ad701b0b342 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lo.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lo.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=ປ່ຽນ +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=ການປ່ຽນແປງຄ່າຟິວນີ້ຕ້ອງໄດ້ລີໂຫລດໜ້ານີ້ changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=ສະກຸນເງິນ currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=ເຄື່ອງໝາຍ ສະກຸນເງິນ currency.AED=ສະກຸນເງິນ UAE Dirham currency.ALL=ສະກຸນເງິນ Albanian Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=ວີກີ feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lt.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lt.properties index ca2a1b5f26a905..7aaf3e1897795a 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lt.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_lt.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Sertifikato maršrutas (Automatic Translation) certificate-url=Sertifikato URL (Automatic Translation) chain-method=Grandinės metodas (Automatic Translation) change=Pakeisti (Automatic Translation) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Keisti spustelėtiną elementą (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Pakeitus šio lauko reikšmę, puslapis įkeliamas iš naujo. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanalas (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Komercijos valiutos (Automatic Translation currency=Valiuta (Automatic Translation) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valiutos simboliai (Automatic Translation) currency.AED=JAE Dirhamas (Automatic Translation) currency.ALL=Albanų Lek (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki Nodes feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_mk.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_mk.properties index dec91126c26995..12ea4de848b919 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_mk.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_mk.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Change (Automatic Copy) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Currency (Automatic Copy) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Currency Symbols (Automatic Copy) currency.AED=UAE Dirham (Automatic Copy) currency.ALL=Albanian Lek (Automatic Copy) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ms.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ms.properties index df83c49b208eec..c11f032aea8a14 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ms.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ms.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Laluan Sijil (Automatic Translation) certificate-url=URL Sijil (Automatic Translation) chain-method=Kaedah Rantaian (Automatic Translation) change=Menukar (Automatic Translation) +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Tukar Elemen Boleh Diklik (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Mengubah nilai medan ini memuatkan semula halaman. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Saluran (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Mata Wang Perdagangan (Automatic Translati currency=Mata wang (Automatic Translation) currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simbol Mata Wang (Automatic Translation) currency.AED=UAE Dirham (Automatic Translation) currency.ALL=Lek Albania (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nb.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nb.properties index 3949cc95ca33c6..79b618324658b4 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nb.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nb.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Bane til sertifikat (Automatic Translation) certificate-url=URL-adresse for sertifikat (Automatic Translation) chain-method=Kjede metode (Automatic Translation) change=Endre +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Endre klikkbart element (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Endring av malen vil ikke påvirke den originale standardmalen for webinnhold. Endringen gjelder bare denne webinnholdsvisningen. changing-the-value-of-this-field-reloads-the-page=Endre verdien på dette feltet vil laste siden på nytt. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Handelsvalutaer currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymboler currency.AED=Arabiske Dirham currency.ALL=Albansk Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wikier feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl.properties index 22b58e38699889..858f33c5c42e8f 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificaatpad certificate-url=URL certificaat chain-method=Kettingmethode change=Wijzigen +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Toewijzing wijzigen change-clickable-element=Klikbaar element wijzigen change-collection=Collectie wijzigen @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Wijziging van de sjabloon heeft geen invloed op standaardsjabloon van de oorspronkelijke webinhoud. De wijziging als alleen van toepassing voor de weergave van deze webinhoud. changing-the-value-of-this-field-reloads-the-page=Als de waarde van dit veld verandert, wordt de pagina herladen. changing-this-setting-will-reset-all-mappings-for-this-collection=Als u deze instelling wijzigt, worden alle toewijzingen voor deze collectie gereset. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanaal channel-account-managers=Kanaalaccountbeheerders channel-defaults=Standaardwaarden kanaal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Winkelvaluta's currency=Valuta currency-code=Valutacode currency-id=Valuta-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymbolen currency.AED=Dirham van de V.A.E currency.ALL=Albanese lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Ruimten weergeven en beheren in het nieuwe CM feature.flag.LPD-32649.title=Sectie Ruimten feature.flag.LPD-34594.description=Gebruikers kunnen hiërarchieën voor objectdefinities maken door een hoofdobjectdefinitie te definiëren. Definities van onderliggende objecten zijn gebonden aan het hoofdobject en nemen de machtigingen en widgetconfiguratie van de hoofdobjectdefinitie over. De API-eindpunten van definities van onderliggende objecten worden samengevoegd met de eindpunten van het hoofdobject. feature.flag.LPD-34594.title=Hoofdobjectdefinities +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is afgeschaft en wordt verwijderd in de toekomst. Migreer uw gegevens naar Liferay Object om gegevensverlies te vermijden. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Sta gebruikers op B2B- en B2X-kanalen toe om af te rekenen als gast of om in te loggen en hun winkelwagen over te zetten naar een zakelijk account. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl_BE.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl_BE.properties index 789563568de6ce..0e7d730eefd429 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl_BE.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_nl_BE.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Stem toevoegen action.ADD_WAREHOUSE=Magazijn toevoegen action.ADMINISTRATE=Administratie action.ADMINISTRATOR=Beheerder -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Geavanceerde update action.APPLY_SXP_BLUEPRINT=Blauwdruk toepassen action.APPROVE_ARTICLE=Artikel goedkeuren action.APPROVE_OPEN_COMMERCE_ORDERS=Openstaande orders goedkeuren @@ -962,7 +962,7 @@ add-new-attribute=Nieuw kenmerk toevoegen add-new-categories-or-remove-common-categories=Voeg nieuwe categorieën toe of verwijder gemeenschappelijke categorieën. add-new-category=Categorie toevoegen add-new-entry-to-x=Nieuwe invoer toevoegen aan {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Voeg nieuwe velden toe om te beginnen met het bouwen van uw structuur. add-new-group=Nieuwe groep toevoegen add-new-grouped-entry-to-x=Nieuwe gegroepeerde invoer toevoegen aan {0} add-new-in-x=Nieuw toevoegen in {0} @@ -3122,7 +3122,7 @@ categories-for-this-item=Categorieën voor dit item categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=Categorieën worden alleen weergegeven in de URL als het blogartikel aan een weergavepagina gekoppeld is. categories[message-board]=Categorieën categorization=Categorisatie -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Namen van categoriseringsklassen categorization-configuration-name=Categorisatie categorization-is-disabled-for-the-selected-content=Categorisering is uitgeschakeld voor de geselecteerde inhoud. Om categorieën in dit fragment te tonen, moet categorisering zijn ingeschakeld. categorization-of-object-entries=Categorisering van objectinvoer @@ -3360,6 +3360,7 @@ certificate-path-name=Certificaatpad certificate-url=URL certificaat chain-method=Kettingmethode change=Wijzigen +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Toewijzing wijzigen change-clickable-element=Klikbaar element wijzigen change-collection=Collectie wijzigen @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Wijziging van de sjabloon heeft geen invloed op standaardsjabloon van de oorspronkelijke webinhoud. De wijziging als alleen van toepassing voor de weergave van deze webinhoud. changing-the-value-of-this-field-reloads-the-page=Indien dit veld wordt gewijzigd zal de pagina worden herladen. changing-this-setting-will-reset-all-mappings-for-this-collection=Als u deze instelling wijzigt, worden alle toewijzingen voor deze collectie gereset. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanaal channel-account-managers=Kanaalaccountbeheerders channel-defaults=Standaardwaarden kanaal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Klik hier voor documentatie. click-here-to-preview-the-form-in-a-new-window=Klik hier voor een voorbeeld van het formulier in een nieuw venster. click-here-to-save-it-now=Klik hier om nu op te slaan. click-new-to-create-your-first-asset=Klik op "Nieuw" om uw eerste asset te maken. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Klik op "Nieuw" om uw eerste bestand te maken. +click-new-to-create-your-first-piece-of-content=Klik op "Nieuw" om uw eerste inhoud te maken. click-ok-to-create-a-new-thread-with-the-following-messages=Klik op OK om een nieuwe thread met de volgende berichten te maken. click-on-any-tag-to-edit-it=Klik op een tag om het aan te passen. click-on-the-object-fields-in-the-sidebar-to-add-properties=Klik op de objectvelden in de zijbalk om eigenschappen toe te voegen. @@ -3799,7 +3801,7 @@ close-search=Zoekopdracht sluiten close-sidebar=Zijbalk sluiten close-x={0} sluiten closed=Gesloten -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=Het proces wordt niet geannuleerd als u het venster sluit. cloud=Wolk club-event=Clubevenement cluster=Cluster @@ -3808,7 +3810,7 @@ cluster-name=Clusternaam cluster-name-help=De naam van de cluster voor deelname. De naam moet overeenstemmen met de remote cluster wanneer de werkingsmodus is ingesteld op remote. cluster-node-address-timeout=Time-out adres clusterknooppunt cmis-repository-configuration-name=CMIS Bewaarplaats -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=CMS site-intitializer code=Meer code-file-mime-types=MIME-types code bestand code-of-the-element=Code van het element @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Winkelvaluta's currency=Valuta currency-code=Valutacode currency-id=Valuta-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymbolen currency.AED=Dirham van de V.A.E currency.ALL=Albanese Lek @@ -5879,7 +5882,7 @@ desktop=Bureaublad desktop-view=Bureaubladweergave destination=Doel destination-address=Destination Addres -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=ID doelbedrijf destination-directory=Doelmap destination-field=Doelveld destination-name=Naam bestemming @@ -7550,10 +7553,12 @@ feature.flag.LPD-31212.description=Gebruikers kunnen Rich Text-inhoud maken die feature.flag.LPD-31212.title=XSS-validaties uitschakelen in Rich Text-editor feature.flag.LPD-31789.description=Sta beheerders toe om Google Vertex AI te configureren als tekstinsluitingsprovider voor semantische zoekopdrachten. feature.flag.LPD-31789.title=Google Vertex AI als provider voor tekstinsluiting -feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Automatic Copy) -feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) +feature.flag.LPD-32649.description=Ruimten weergeven en beheren in het nieuwe CMS. +feature.flag.LPD-32649.title=Sectie Ruimten feature.flag.LPD-34594.description=Gebruikers kunnen hiërarchieën voor objectdefinities maken door een hoofdobjectdefinitie te definiëren. Definities van onderliggende objecten zijn gebonden aan het hoofdobject en nemen de machtigingen en widgetconfiguratie van de hoofdobjectdefinitie over. De API-eindpunten van definities van onderliggende objecten worden samengevoegd met de eindpunten van het hoofdobject. feature.flag.LPD-34594.title=Hoofdobjectdefinities +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is afgeschaft en wordt verwijderd in de toekomst. Migreer uw gegevens naar Liferay Object om gegevensverlies te vermijden. feature.flag.LPD-35013.title=Wiki's feature.flag.LPD-35678.description=Sta gebruikers op B2B- en B2X-kanalen toe om af te rekenen als gast of om in te loggen en hun winkelwagen over te zetten naar een zakelijk account. @@ -7590,12 +7595,12 @@ feature.flag.LPD-46393.description=Toon of verberg configuratievelden dynamisch feature.flag.LPD-46393.title=Voorwaardelijke zichtbaarheid van configuratievelden in aangepaste fragmenten feature.flag.LPD-47713.description=De ondersteuning voor de globale JavaScript-tabbladencomponent van Liferay is obsoleet. feature.flag.LPD-47713.title=Ondersteuning JS-component: tabbladen -feature.flag.LPD-48372.description=The AMD loader is deprecated and will be removed in the future. (Automatic Copy) -feature.flag.LPD-48372.title=AMD Loader (Automatic Copy) -feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) -feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48372.description=De AMD-lader is obsoleet en zal in de toekomst verwijderd worden. +feature.flag.LPD-48372.title=AMD-lader +feature.flag.LPD-48862.description=De globale JavaScript-eigenschappen, Liferay.OAuth2 en Liferay.OAuth2Client zijn obsoleet. Deze moeten gebruikt worden via importkaarten. +feature.flag.LPD-48862.title=OAuth2 JavaScript-client +feature.flag.LPD-48975.description=Verwijdert Lodash-inschakeling uit de systeembeheerder. +feature.flag.LPD-48975.title=Lodash-inschakeling feature.flag.LPS-96845.description=Geconfigureerde SCIM-clients kunnen REST-API's gebruiken om identiteitsgegevens voor gebruikers en groepen te synchroniseren met externe toepassingen. feature.flag.LPS-96845.title=Systeem voor domeinoverkoepelend identiteitsbeheer (SCIM) feature.flag.LPS-122920.description=Creëer een zoekervaring die de betekenis en de context van uw inhoud en zoekopdrachten van gebruikers begrijpt door gebruik te maken van ML-taalmodellen via providers van derden voor tekstinsluiting en zoekblauwdrukken. Eenmaal ingeschakeld, begint u met de configuratie in Instantie-instellingen > Zoekervaringen > Semantische zoekopdrachten. @@ -7816,7 +7821,7 @@ file-url=Bestands-URL file-version-is-invalid=De bestandsversie is ongeldig. files=Bestanden files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Bestanden kunnen worden bewaard in een objectrecord of in een specifieke map in Documenten en Media. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Namen van bestandsklassen fill-out-the-following-form-to-get-driving-directions-to=Vul het formulier in voor een routebeschrijving. filter=Filter filter-and-order=Filteren en Rangschikken @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragmenten en widgets fragments-and-widgets-cannot-be-placed-inside-this-area=Fragmenten en widgets kunnen niet in dit gebied geplaatst worden. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Fragmenten en widgets voor pagina's die op deze basispagina zijn gebaseerd, komen hier. fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Fragment- en widgetsets kunnen gerangschikt worden, zodat u gemakkelijk toegang hebt tot deze die u het meest gebruikt. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Fragmenten kunnen alleen in het eerste collectie-item worden neergezet. fragments-cannot-be-placed-inside-a-form-step-container=Fragmenten kunnen niet in een houder voor formulierstappen geplaatst worden. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Fragmenten kunnen niet in een niet-toegewezen fragment van een verzamelingsweergave geplaatst worden. fragments-cannot-be-placed-inside-an-unmapped-form-container=Fragmenten kunnen niet in een niet-toegewezen formulierhouder geplaatst worden. @@ -10701,7 +10706,7 @@ map-content=Folderinhoud map-new-location=Nieuwe locatie toewijzen map-the-error-message-to-be-displayed-next-to-the-validated-field=Breng het foutbericht in kaart zodat het naast het veld wordt weergegeven, of laat het bovenaan het formulier zien. map-the-selected-content-to-the-x-structure-fields=Wijs de geselecteerde inhoud toe aan de structuurvelden "{0}". -map-your-collection=Map Your Collection (Automatic Copy) +map-your-collection=Wijs uw collectie toe map-your-form=Wijs uw formulier toe map[relational]=Kaarten mapped-products=Gemappeerde producten @@ -10750,7 +10755,7 @@ marked-text-background-color=Achtergrondkleur gemarkeerde tekst marketing-banner=Marketingbanner marketplace-connection=Verbinding met Marketplace marketplace-is-now-in-fragments=Marketplace is nu in fragmenten -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=Marketplace is nu in Page Builder marking-messages-as-read=Markeert berichten als gelezen: marking-messages-as-unread=Markeert berichten als ongelezen: mass=Massa @@ -11555,7 +11560,7 @@ model.resource.com.liferay.object=Objectdefinities model.resource.com.liferay.object.model.ObjectAction=Objectactie model.resource.com.liferay.object.model.ObjectDefinition=Objectdefinitie model.resource.com.liferay.object.model.ObjectEntry=Object -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Invoermap voor objecten model.resource.com.liferay.object.model.ObjectField=Objectveld model.resource.com.liferay.object.model.ObjectFolder=Objectmap model.resource.com.liferay.object.model.ObjectLayout=Objectlay-out @@ -11887,7 +11892,7 @@ nav-link-horizontal-margin=Horizontale marge navigatielink nav-link-vertical-active-indicator-length=Lengte verticale actieve indicator navigatielink nav-link-vertical-active-indicator-thickness=Dikte verticale actieve indicator navigatielink nav-link-vertical-margin=Verticale marge navigatielink -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Het proces wordt niet geannuleerd als u naar andere secties gaat. navigation=Navigatie navigation-bars=Navigatiebalken navigation-exception-selectors-description=Geef op welke CSS-kiezers de SPA moet negeren. @@ -12179,7 +12184,7 @@ no-components-were-found=Er zijn geen componenten gevonden. no-configurations-were-found=Geen configuraties gevonden. no-connected-applications-were-found=Geen verbonden applicaties gevonden. no-content-was-found-that-matched-keyword-x=Er is geen inhoud gevonden die overeenkomt met de sleutelwoorden: {0}. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Nog geen inhoud no-continue=Nee, ga verder. no-coupons-were-found=Er zijn geen coupons gevonden. no-css-client-extensions-were-loaded=Geen CSS-clientextensies geladen. @@ -12237,11 +12242,11 @@ no-fields-are-available-for-this-type=Er zijn geen velden beschikbaar voor dit t no-fields-are-available-for-x-editable=Er zijn geen velden beschikbaar voor {0} bewerkbaar element. no-fields-available=Geen velden beschikbaar no-fields-were-found=Geen velden gevonden. -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Nog geen velden no-file-is-selected=Geen bestand geselecteerd. no-file-selected=Geen bestand geselecteerd. no-files-selected=Geen veld geselecteerd -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Nog geen bestanden no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=Er zijn geen filterbronnen beschikbaar. Maak een keuzelijst of woordenlijst voor dit filtertype. no-filter-was-created-yet=Er is nog geen filter gemaakt. no-filters=Geen filters @@ -13319,7 +13324,7 @@ page-variations-x=Paginavariaties {0} page-versioning=Paginaversiebeheer page-versioning-help=Pagina versiebeheer laat u parallel werken in verschillende variaties van de pagina's. Het laat u ook de geschiedenis van wijzigingen van deze pagina's bijhouden. page-with-permissions=Pagina met machtigingen -page-x=Page {0} (Automatic Copy) +page-x=Pagina {0} page-x-has-not-been-published-to-live-yet=Pagina {0} is nog niet gepubliceerd naar productie. page-x-of-approximately-x-results=Pagina {0} van ongeveer {1} resultaten. page-x-of-x=Pagina {0} van {1} @@ -14169,9 +14174,9 @@ portal-instance=Instanties portal-instance-help=Object wat de huidige portal-instantie weergeeft. portal-instance-id=Instanties portal-instance-id-help=De identificatie van de huidige portalinstantie. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Kopie portalinstantie +portal-instances-extraction-configuration-name=Extractie portalinstantie +portal-instances-insertion-configuration-name=Invoeging portalinstantie portal-name=Portlet naam portal-properties=Portaaleigenschappen portal-properties-analysis=Analyse portaaleigenschappen @@ -16024,7 +16029,7 @@ search-everywhere=Overal zoeken search-experiences=Ervaringen zoeken search-feeds=Feeds zoeken search-field-is-empty=Het zoekveld is leeg. Alle velden zijn weergegeven. -search-fields=Search Fields (Automatic Copy) +search-fields=Zoekvelden search-file-entries=Zoek bestanden search-folder=Zoek map search-folders=Zoek mappen @@ -16197,7 +16202,7 @@ segments-service-company-configuration-name=Segmentenservice segments-service-configuration-name=Segmentenservice select=Selecteren select-a-blueprint-or-element-json-file-to-import=Selecteer een blauwdruk of element-JSON-bestand om te importeren. -select-a-collection-to-display=Select a collection to display. (Automatic Copy) +select-a-collection-to-display=Selecteer een collectie om weer te geven. select-a-collection-to-make-it-visible=Selecteer een collectie om ze zichtbaar te maken. select-a-content-type-to-start-creating-the-form=Selecteer een inhoudtype om te beginnen met het formulier te maken. select-a-data-set-view=Selecteer een gegevenssetweergave. @@ -17428,7 +17433,7 @@ source=Bron source-address=Bronadres source-code=Broncode source-code-url=URL broncode -source-company-id=Source Company ID (Automatic Copy) +source-company-id=ID bronbedrijf source-file=Bronbestand source-file-field=Bronbestandveld source-folder=Bronmap @@ -17463,7 +17468,7 @@ spacer-9=Afstandselement 9 spacer-10=Afstandselement 10 spacer-options=Afstandselementopties spacers=Afstandselementen -spaces=Spaces (Automatic Copy) +spaces=Ruimten spaces-are-not-allowed=Spaties zijn niet toegestaan. spacing=Spatiëring spam=Spam @@ -17710,7 +17715,7 @@ structure-restrictions-help=Mappen kunnen beperkt worden zodat ze alleen bepaald structure-type=Type structuur structures=Structuren structures-and-types=Structuren en types -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Namen van structuurklassen student-capacity=Studentcapaciteit students=Studenten style=Stijl @@ -18879,7 +18884,7 @@ the-friendly-url-has-too-many-slashes=De gebruiksvriendelijke URL bevat te veel the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=De beschrijvende URL wordt al gebruikt. Voer een unieke beschrijvende URL in. the-friendly-url-is-appended-to-x-for-pages=De beschrijvende URL is toegevoegd aan {0} voor pagina's. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=De gebruiksvriendelijke URL is toegevoegd aan {0} voor de openbare pagina's en {1} voor de private pagina's. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=De beschrijvende URL wordt automatisch gegenereerd op basis van het titelveld van de invoer. the-friendly-url-is-too-long=De beschrijvende URL is te lang. the-friendly-url-may-be-modified-to-ensure-uniqueness=De beschrijvende URL kan worden gewijzigd om deze uniek te maken. the-friendly-url-may-conflict-with-another-page=De gebruiksvriendelijke URL is mogelijk in strijd met een andere pagina. @@ -19132,11 +19137,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=De hoeveelheid overs the-quantity-is-required=De hoeveelheid is vereist. the-question-could-not-be-found=De vraag kon niet worden gevonden. the-question-is-not-found=Vraag niet gevonden. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=De no-script-URL van de reCAPTCHA is ongeldig. the-recaptcha-private-key-is-not-valid=De privésleutel van reCAPTCHA is ongeldig. the-recaptcha-public-key-is-not-valid=De openbaresleutel van reCAPTCHA is ongeldig. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=De script-URL van de reCAPTCHA is ongeldig. +the-recaptcha-verify-url-is-not-valid=De verificatie-URL van de reCAPTCHA is ongeldig. the-record-could-not-be-found=De rij werd niet gevonden. the-recordSet-could-not-be-found=De rijen werden niet gevonden. the-recycle-bin=Prullenbak @@ -20767,7 +20772,7 @@ untitled-rule=Naamloze regel untitled-scheduled-publish-process=Naamloos gepland publicatieproces untitled-segment=Segment zonder titel untitled-set=Set zonder titel -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Structuur zonder titel untitled-workflow=Workflow zonder Titel untitled-x=Naamloos {0} untracked=Niet bijgehouden @@ -21563,7 +21568,7 @@ was=Was was-this-information-helpful=Was deze informatie nuttig? watcher=Kijker we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=We zijn verheugd te kunnen melden dat Marketplace nu deel uitmaakt van Fragmenten! Blader, installeer en beheer nieuwe fragmenten en fragmentensets zonder ooit het fragmentbeheer te verlaten. -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We zijn verheugd te kunnen melden dat Marketplace nu deel uitmaakt van Page Builder! Blader, installeer en beheer onderdelen zonder de pagina te verlaten. we-will-not-send-you-emails-to-x-anymore=We zullen u geen e-mails voor {0} meer sturen. weather=Weer weather-condition-id=ID weersomstandigheid diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_no.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_no.properties index b94631c2c964e6..d27a9bb1f12bd9 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_no.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_no.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Bane til sertifikat (Automatic Translation) certificate-url=URL-adresse for sertifikat (Automatic Translation) chain-method=Kjede metode (Automatic Translation) change=Endre +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Endre klikkbart element (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Endring av malen vil ikke påvirke den originale standardmalen for webinnhold. Endringen gjelder bare denne webinnholdsvisningen. changing-the-value-of-this-field-reloads-the-page=Endre verdien på dette feltet vil laste siden på nytt. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Handelsvalutaer currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymboler currency.AED=Arabiske Dirham currency.ALL=Albansk Lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wikier feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) @@ -7585,7 +7590,7 @@ feature.flag.LPD-40535.title=Embedded Widgets in Fragments (Automatic Copy) feature.flag.LPD-44091.description=Walkthrough is deprecated and will be removed in the future. (Automatic Copy) feature.flag.LPD-44091.title=Walkthrough (Automatic Copy) feature.flag.LPD-45375.description=Synchronizes the user deletion between DXP and Analytics Cloud. (Automatic Copy) -feature.flag.LPD-45375.title=Synchronous User Deletion in DXP and Analytics Cloud (Automatic Copy) +feature.flag.LPD-45375.title=Analytics Cloud Synchronized User Deletion (Automatic Copy) feature.flag.LPD-46393.description=Dynamically show or hide configuration fields in a custom fragment based on user input values. (Automatic Copy) feature.flag.LPD-46393.title=Conditional Configuration Field Visibility in Custom Fragments (Automatic Copy) feature.flag.LPD-47713.description=The support for the global JavaScript tabs component provided by Liferay is deprecated. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pl.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pl.properties index cb7e8dd0358027..5c761c2cd9ae76 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pl.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pl.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Ścieżka certyfikatu (Automatic Translation) certificate-url=Adres URL certyfikatu (Automatic Translation) chain-method=Metoda łańcucha (Automatic Translation) change=Zmień +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Zmień klikalny element (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Zmiana wartości tego pola spowoduje przeładowanie strony. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanał (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Waluty handlowe (Automatic Translation) currency=Waluta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symbole waluty currency.AED=Diram ZEA currency.ALL=Lek albański @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Panel Sterowania) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_BR.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_BR.properties index 1831ca2fbca335..ceb70cbd4c6a23 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_BR.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_BR.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Caminho do Certificado certificate-url=URL do Certificado chain-method=Método de cadeia change=Alterar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Alterar atribuição change-clickable-element=Alterar elemento clicável change-collection=Alterar coleção @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Alterar o modelo não afetará o modelo padrão do Conteúdo Web original. A alteração só aplica-se a esta exibição de conteúdo web. changing-the-value-of-this-field-reloads-the-page=Mudar o valor deste campo provocará o recarregamento da página. changing-this-setting-will-reset-all-mappings-for-this-collection=Alterar essa configuração redefinirá todos os mapeamentos para esta coleção. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gerentes de conta do canal channel-defaults=Padrões do canal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Moedas do comércio currency=Moeda currency-code=Código da moeda currency-id=ID da moeda +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos monetários currency.AED=Dirham dos UAE currency.ALL=Lek Albanian @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Exiba e gerencie espaços no novo CMS. feature.flag.LPD-32649.title=Seção de espaços feature.flag.LPD-34594.description=Os usuários podem criar hierarquias de definições de objetos ao definir um objeto raiz. Os objetos filhos ficam vinculados à raiz e herdam suas permissões e configurações de widgets. Os pontos de extremidade da API dos objetos filhos são combinados com os da raiz. feature.flag.LPD-34594.title=Definições de objetos raiz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=O Wiki foi descontinuado e será removidas no futuro. Para evitar a perda de dados, você deve migrar seus dados para o Liferay Objects. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Permitir que usuários em canais B2B e B2X usem o checkout como convidado ou façam login e transfiram seu carrinho para uma conta empresarial. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_PT.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_PT.properties index d5b1633ed00e9d..078a32716aa309 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_PT.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_pt_PT.properties @@ -376,7 +376,7 @@ action.ADD_VOTE=Adicionar Voto action.ADD_WAREHOUSE=Adicionar Armazém (Automatic Translation) action.ADMINISTRATE=Administrar action.ADMINISTRATOR=Administrador -action.ADVANCED_UPDATE=Advanced Update (Automatic Copy) +action.ADVANCED_UPDATE=Atualização avançada action.APPLY_SXP_BLUEPRINT=Aplicar blueprint action.APPROVE_ARTICLE=Aprovar Conteúdo action.APPROVE_OPEN_COMMERCE_ORDERS=Aprovar ordens abertas (Automatic Translation) @@ -962,7 +962,7 @@ add-new-attribute=Adicionar novo atributo add-new-categories-or-remove-common-categories=Adicione novas categorias ou remova categorias comuns. (Automatic Translation) add-new-category=Adicionar Categoria add-new-entry-to-x=Adicionar Nova Entrada a {0} -add-new-fields-to-start-building-your-structure=Add new fields to start building your structure. (Automatic Copy) +add-new-fields-to-start-building-your-structure=Adicione novos campos para começar a construir sua estrutura. add-new-group=Adicionar Novo Grupo add-new-grouped-entry-to-x=Adicionar Nova Entrada Agrupada a {0} add-new-in-x=Adicionar Novo em {0} @@ -3122,7 +3122,7 @@ categories-for-this-item=Categorias para este item (Automatic Translation) categories-will-only-appear-in-the-url-when-the-blog-entry-is-associated-to-a-display-page=As categorias só aparecerão no URL quando a entrada do blog estiver associada a uma página de exibição. categories[message-board]=Categorias categorization=Categorização -categorization-class-names=Categorization Class Names (Automatic Copy) +categorization-class-names=Nome de classe de categorização categorization-configuration-name=Categorização categorization-is-disabled-for-the-selected-content=A categorização está desativada para o conteúdo selecionado. Para exibir as categorias neste fragmento, a categorização deve ser ativada. categorization-of-object-entries=Categorização de entradas de Objeto @@ -3360,6 +3360,7 @@ certificate-path-name=Caminho do Certificado (Automatic Translation) certificate-url=URL do certificado (Automatic Translation) chain-method=Método de cadeia (Automatic Translation) change=Alterar +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Alterar atribuição change-clickable-element=Alterar elemento clicável (Automatic Translation) change-collection=Alterar coleção @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Alterar o modelo não afetará o modelo padrão do Conteúdo Web original. A alteração só aplica-se a esta exibição de conteúdo web. changing-the-value-of-this-field-reloads-the-page=Alterar o valor deste campo provocará o recarregamento da página. changing-this-setting-will-reset-all-mappings-for-this-collection=Alterar essa configuração redefinirá todos os mapeamentos para esta coleção. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Canal channel-account-managers=Gerentes de conta do canal channel-defaults=Padrões do canal @@ -3734,8 +3736,8 @@ click-here-for-documentation=Clique aqui para obter os documentos. click-here-to-preview-the-form-in-a-new-window=Clique aqui para pré-visualizar o formulário numa nova janela. click-here-to-save-it-now=Clique aqui para guardar agora. click-new-to-create-your-first-asset=Clique em "Novo" para criar o primeiro item. -click-new-to-create-your-first-file=Click "New" to create your first file. (Automatic Copy) -click-new-to-create-your-first-piece-of-content=Click "New" to create your first piece of content. (Automatic Copy) +click-new-to-create-your-first-file=Clique em "Novo" para criar o primeiro arquivo. +click-new-to-create-your-first-piece-of-content=Clique em "Novo" para criar o primeiro trecho de conteúdo. click-ok-to-create-a-new-thread-with-the-following-messages=Clique OK para criar um novo tópico com as seguintes mensagens. click-on-any-tag-to-edit-it=Clique em qualquer tag para editá-lo. click-on-the-object-fields-in-the-sidebar-to-add-properties=Clique nos campos de assunto na barra lateral para adicionar propriedades. @@ -3799,7 +3801,7 @@ close-search=Fechar busca close-sidebar=Fechar barra lateral close-x=Fechar {0} closed=Fechado -closing-the-window-will-not-cancel-the-process=Closing the window will not cancel the process. (Automatic Copy) +closing-the-window-will-not-cancel-the-process=Fechar a janela não cancelará o processo. cloud=Nuvem club-event=Evento do Clube cluster=Conjunto @@ -3808,7 +3810,7 @@ cluster-name=Nome do cluster (Automatic Translation) cluster-name-help=Esta configuração só se aplica ao modo EMBEDDED (Desenvolvimento). Defina o nome do cluster para participar. (Automatic Translation) cluster-node-address-timeout=Tempo limite de endereço do nó de cluster (Automatic Translation) cmis-repository-configuration-name=Repositório de CMIS -cms-site-initializer-configuration-name=CMS Site Initializer (Automatic Copy) +cms-site-initializer-configuration-name=Inicializador de site CMS code=Código code-file-mime-types=Tipos DE MIME de arquivo de código (Automatic Translation) code-of-the-element=Código do Elemento (Automatic Translation) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Moedas do comércio currency=Moeda currency-code=Código da moeda currency-id=ID da moeda +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Símbolos Monetários currency.AED=Dirham dos UAE currency.ALL=Lek da Albania @@ -5879,7 +5882,7 @@ desktop=Ambiente de trabalho desktop-view=Visualização de ambiente de trabalho destination=destino (Automatic Translation) destination-address=Endereço de destino -destination-company-id=Destination Company ID (Automatic Copy) +destination-company-id=ID da empresa de destino destination-directory=Directoria de destino destination-field=Campo de destino destination-name=Nome do destino (Automatic Translation) @@ -7550,10 +7553,12 @@ feature.flag.LPD-31212.description=Os usuários podem criar conteúdo de rich te feature.flag.LPD-31212.title=Desativar validações XSS no editor de Rich Text feature.flag.LPD-31789.description=Permita que os administradores configurem o Google Vertex AI como provedor de incorporação de texto para pesquisa semântica. feature.flag.LPD-31789.title=Provedor de incorporação de texto do Google Vertex AI -feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Automatic Copy) -feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) +feature.flag.LPD-32649.description=Exiba e gerencie espaços no novo CMS. +feature.flag.LPD-32649.title=Seção de espaços feature.flag.LPD-34594.description=Os usuários podem criar hierarquias de definições de objetos ao definir um objeto raiz. Os objetos filhos ficam vinculados à raiz e herdam suas permissões e configurações de widgets. Os pontos de extremidade da API dos objetos filhos são combinados com os da raiz. feature.flag.LPD-34594.title=Definições de objetos raiz +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=O Wiki foi descontinuado e será removidas no futuro. Para evitar a perda de dados, você deve migrar seus dados para o Liferay Objects. feature.flag.LPD-35013.title=Nós de Wiki feature.flag.LPD-35678.description=Permitir que usuários em canais B2B e B2X usem o checkout como convidado ou façam login e transfiram seu carrinho para uma conta empresarial. @@ -7592,10 +7597,10 @@ feature.flag.LPD-47713.description=O suporte para o componente global de abas Ja feature.flag.LPD-47713.title=Suporte para componente JS: Abas feature.flag.LPD-48372.description=O carregador AMD foi descontinuado e será removido em breve. feature.flag.LPD-48372.title=Carregador AMD -feature.flag.LPD-48862.description=The global JavaScript properties, Liferay.OAuth2 and Liferay.OAuth2Client are deprecated. These should be used via import maps. (Automatic Copy) -feature.flag.LPD-48862.title=OAuth2 JavaScript Client (Automatic Copy) -feature.flag.LPD-48975.description=Removes Lodash enablement from the system admin. (Automatic Copy) -feature.flag.LPD-48975.title=Lodash Enablement (Automatic Copy) +feature.flag.LPD-48862.description=As propriedades globais do JavaScript, Liferay.OAuth2 e Liferay.OAuth2Client, estão obsoletas. Elas devem ser usadas por meio de mapas de importação. +feature.flag.LPD-48862.title=Cliente JavaScript OAuth2 +feature.flag.LPD-48975.description=Remove a habilitação do Lodash do administrador do sistema. +feature.flag.LPD-48975.title=Habilitação do Lodash feature.flag.LPS-96845.description=Os clientes SCIM configurados podem desfrutar das APIs REST para sincronizar informações de identidade para usuários e grupos com aplicativos externos. feature.flag.LPS-96845.title=Sistema de gerenciamento de identidade entre domínios (SCIM) feature.flag.LPS-122920.description=Crie uma experiência de pesquisa que entenda o significado e o contexto de suas buscas de conteúdo e de usuários, aproveitando os modelos ML de idioma por meio de provedores de integração de texto de terceiros e blueprints de pesquisa. Uma vez ativado, comece a configuração em Configurações de instância > Experiências de busca > Busca semântica. @@ -7816,7 +7821,7 @@ file-url=URL do arquivo (Automatic Translation) file-version-is-invalid=A versão do ficheiro é inválida. files=Ficheiros files-can-be-stored-in-an-object-entry-or-in-a-specific-folder-in-documents-and-media=Os arquivos podem ser armazenados em uma entrada de objeto ou em uma pasta específica em Documentos e Mídia. -files-class-names=Files Class Names (Automatic Copy) +files-class-names=Nomes de classe do arquivo fill-out-the-following-form-to-get-driving-directions-to=Preencha o seguinte formulário para obter direcções para filter=Filtro filter-and-order=Filtro e Ordem @@ -8159,7 +8164,7 @@ fragments-and-widgets=Fragmentos e Widgets (Automatic Translation) fragments-and-widgets-cannot-be-placed-inside-this-area=Não foi possível posicionar os fragmentos e widget nesta área. fragments-and-widgets-for-pages-based-on-this-master-will-be-placed-here=Fragmentos e widgets para páginas com base neste mestre serão colocados aqui. (Automatic Translation) fragments-and-widgets-sets-can-be-ordered-to-give-you-easy-access-to-the-ones-you-use-the-most=Os conjuntos de fragmentos e widgets podem ser organizados para dar a você um acesso rápido aos que você mais deseja utilizar. -fragments-can-only-be-dropped-in-the-first-collection-item=Fragments can only be dropped in the first collection item. (Automatic Copy) +fragments-can-only-be-dropped-in-the-first-collection-item=Os fragmentos só podem ser descartados no primeiro item de coleção. fragments-cannot-be-placed-inside-a-form-step-container=Fragmento não pode ser posicionado dentro de um contêiner de etapa do formulário. fragments-cannot-be-placed-inside-an-unmapped-collection-display-fragment=Os fragmentos não podem ser posicionados em um fragmento de exibição de coleção não mapeado. fragments-cannot-be-placed-inside-an-unmapped-form-container=Fragmentos não podem ser colocados em um contêiner de formulário não mapeado. @@ -10700,7 +10705,7 @@ map-content=Conteúdo do mapa map-new-location=Mapa de Nova Localização. map-the-error-message-to-be-displayed-next-to-the-validated-field=Mapeie a mensagem de erro para ser exibida ao lado do campo ou exiba-a posicionada na parte superior do formulário. map-the-selected-content-to-the-x-structure-fields=Mapeie o conteúdo selecionado para o campo de estrutura "{0}". -map-your-collection=Map Your Collection (Automatic Copy) +map-your-collection=Mapeie sua coleção map-your-form=Mapeie seu formulário map[relational]=Mapa mapped-products=Produtos mapeados @@ -10749,7 +10754,7 @@ marked-text-background-color=Cor de fundo de texto marcado marketing-banner=Banner de Marketing marketplace-connection=Conexão do Marketplace marketplace-is-now-in-fragments=Marketplace agora está nos fragmentos -marketplace-is-now-in-page-builder=Marketplace Is Now In Page Builder (Automatic Copy) +marketplace-is-now-in-page-builder=O Marketplace agora está no construtor de páginas marking-messages-as-read=A marcar mensagens como lidas… marking-messages-as-unread=A marcar mensagens como não lidas… mass=Massa @@ -11554,7 +11559,7 @@ model.resource.com.liferay.object=Definições de objeto model.resource.com.liferay.object.model.ObjectAction=Ação do objeto model.resource.com.liferay.object.model.ObjectDefinition=Definição de objeto model.resource.com.liferay.object.model.ObjectEntry=Objeto -model.resource.com.liferay.object.model.ObjectEntryFolder=Object Entry Folder (Automatic Copy) +model.resource.com.liferay.object.model.ObjectEntryFolder=Pasta de entrada de objeto model.resource.com.liferay.object.model.ObjectField=Campo de objeto model.resource.com.liferay.object.model.ObjectFolder=Pasta de objeto model.resource.com.liferay.object.model.ObjectLayout=Layout do objeto @@ -11886,7 +11891,7 @@ nav-link-horizontal-margin=Margem horizontal do link de navegação nav-link-vertical-active-indicator-length=O comprimento do indicador ativo vertical do link de navegação nav-link-vertical-active-indicator-thickness=A espessura do indicador ativo vertical do link de navegação nav-link-vertical-margin=Margem vertical do link de navegação -navigating-to-other-sections-will-not-cancel-the-process=Navigating to other sections will not cancel the process. (Automatic Copy) +navigating-to-other-sections-will-not-cancel-the-process=Navegar para outras seções não cancelará o processo. navigation=Navegação navigation-bars=Barras de navegação (Automatic Translation) navigation-exception-selectors-description=Defina os seletores CSS que o SPA deve ignorar. (Automatic Translation) @@ -12178,7 +12183,7 @@ no-components-were-found=Não foram encontrados componentes no-configurations-were-found=Nenhuma configuração foi encontrada. no-connected-applications-were-found=Não foram encontrados aplicativos conectados. (Automatic Translation) no-content-was-found-that-matched-keyword-x=Não foi encontrado nenhum conteúdo que corresponda à palavra-chave: {0}. -no-content-yet=No Content Yet (Automatic Copy) +no-content-yet=Ainda sem conteúdo no-continue=Não, continuar. no-coupons-were-found=Nenhum coupons foi encontrado. no-css-client-extensions-were-loaded=Nenhuma extensão CSS Client foi carregada. @@ -12236,11 +12241,11 @@ no-fields-are-available-for-this-type=Nenhum campo está disponível para este t no-fields-are-available-for-x-editable=Nenhum campo está disponível para {0} editável. no-fields-available=Nenhum campo disponível no-fields-were-found=Não foram encontrados campos. (Automatic Translation) -no-fields-yet=No Fields Yet (Automatic Copy) +no-fields-yet=Ainda sem campos no-file-is-selected=Nenhum arquivo selecionado. no-file-selected=Nenhum arquivo selecionado. no-files-selected=Nenhum ficheiro selecionado. -no-files-yet=No Files Yet (Automatic Copy) +no-files-yet=Ainda sem arquivos no-filter-sources-are-available.-create-a-picklist-or-a-vocabulary-for-this-type-of-filter=Nenhuma fonte de filtro está disponível. Crie uma lista de opções ou vocabulário para esse tipo de filtro. no-filter-was-created-yet=Nenhum filtro foi criada até o momento. no-filters=Sem filtros (Automatic Translation) @@ -14168,9 +14173,9 @@ portal-instance=Instância do Portal portal-instance-help=Objeto que representa a instância atual do portal. portal-instance-id=ID da Instância do Portal portal-instance-id-help=O identificador da instância atual do portal. -portal-instances-copy-configuration-name=Portal Instance Copy (Automatic Copy) -portal-instances-extraction-configuration-name=Portal Instance Extraction (Automatic Copy) -portal-instances-insertion-configuration-name=Portal Instance Insertion (Automatic Copy) +portal-instances-copy-configuration-name=Cópia da instância do portal +portal-instances-extraction-configuration-name=Extração da instância do portal +portal-instances-insertion-configuration-name=Inserção da instância do portal portal-name=Nome do Portal portal-properties=Propriedades do Portal portal-properties-analysis=Análise de propriedades do portal @@ -16023,7 +16028,7 @@ search-everywhere=Pesquisar Tudo search-experiences=Experiência de busca search-feeds=Pesquisar Feeds search-field-is-empty=Campo de pesquisa vazio. Todos os campos são listados. -search-fields=Search Fields (Automatic Copy) +search-fields=Campos de pesquisa search-file-entries=Pesquisar Ficheiros search-folder=Pesquisar Pasta search-folders=Pesquisar Pastas @@ -16196,7 +16201,7 @@ segments-service-company-configuration-name=Serviço de segmentos segments-service-configuration-name=Serviço de segmentos select=Selecionar select-a-blueprint-or-element-json-file-to-import=Selecionar um arquivo de blueprint ou elemento JSON para importar. -select-a-collection-to-display=Select a collection to display. (Automatic Copy) +select-a-collection-to-display=Selecione uma coleção para exibir. select-a-collection-to-make-it-visible=Selecione uma coleção para torná-la visível. (Automatic Translation) select-a-content-type-to-start-creating-the-form=Selecione um tipo de conteúdo para iniciar a criação de um formulário. select-a-data-set-view=Selecionar uma exibição de conjunto de dados. @@ -17427,7 +17432,7 @@ source=Fonte source-address=Endereço da Fonte source-code=Código fonte source-code-url=URL de código fonte -source-company-id=Source Company ID (Automatic Copy) +source-company-id=ID da empresa de origem source-file=Arquivo de origem (Automatic Translation) source-file-field=Campo de arquivo de origem source-folder=Pasta fonte @@ -17462,7 +17467,7 @@ spacer-9=Espaçador 9 (Automatic Translation) spacer-10=Espaçador 10 (Automatic Translation) spacer-options=Opções de espaçador spacers=Espaçadores (Automatic Translation) -spaces=Spaces (Automatic Copy) +spaces=Espaços spaces-are-not-allowed=Espaços não são permitidos. spacing=Espaçamento spam=Spam @@ -17709,7 +17714,7 @@ structure-restrictions-help=As pastas podem ser restringidas para apenas permiti structure-type=Tipo de estrutura (Automatic Translation) structures=Estruturas structures-and-types=Estruturas e Tipos (Automatic Translation) -structures-class-names=Structures Class Names (Automatic Copy) +structures-class-names=Nomes das classes de estruturas student-capacity=Capacidade do Estudante students=Estudantes style=Estilo @@ -18878,7 +18883,7 @@ the-friendly-url-has-too-many-slashes=O URL amigável possui muitas barras. the-friendly-url-is-already-in-use.-please-enter-a-unique-friendly-url=A URL amigável já está em uso. Por favor, insira uma URL amigável única. (Automatic Translation) the-friendly-url-is-appended-to-x-for-pages=O URL amigável é anexado a {0} para as páginas. the-friendly-url-is-appended-to-x-for-public-pages-and-x-for-private-pages=O URL amigável é adicionado à {0} para páginas públicas e à {1} para páginas privadas. -the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=The friendly URL is automatically generated based on the entry title field. (Automatic Copy) +the-friendly-url-is-automatically-generated-based-on-the-entry-title-field=O URL amigável é gerado automaticamente com base no campo de título da entrada. the-friendly-url-is-too-long=A URL amigável é muito longa. (Automatic Translation) the-friendly-url-may-be-modified-to-ensure-uniqueness=A URL amigável pode ser modificada para garantir a exclusividade. (Automatic Translation) the-friendly-url-may-conflict-with-another-page=O URL amigável pode entrar em conflito com outra página. @@ -19131,11 +19136,11 @@ the-quantity-exceeds-the-maximum-number-of-returnable-items=A quantidade excede the-quantity-is-required=A quantidade é necessária. the-question-could-not-be-found=A questão não pode ser encontrada. the-question-is-not-found=A pergunta não foi encontrada. -the-recaptcha-no-script-url-is-not-valid=The reCAPTCHA no script URL is not valid. (Automatic Copy) +the-recaptcha-no-script-url-is-not-valid=O URL do reCAPTCHA no script não é válido. the-recaptcha-private-key-is-not-valid=A chave privada de reCAPTCHA é inválida. the-recaptcha-public-key-is-not-valid=A chave pública de reCAPTCHA é inválida. -the-recaptcha-script-url-is-not-valid=The reCAPTCHA script URL is not valid. (Automatic Copy) -the-recaptcha-verify-url-is-not-valid=The reCAPTCHA verify URL is not valid. (Automatic Copy) +the-recaptcha-script-url-is-not-valid=O URL do script do reCAPTCHA não é válido. +the-recaptcha-verify-url-is-not-valid=O URL de verificação do reCAPTCHA não é válido. the-record-could-not-be-found=O registo não foi encontrado. the-recordSet-could-not-be-found=O conjunto de registos não foi encontrado. the-recycle-bin=A Reciclagem @@ -20766,7 +20771,7 @@ untitled-rule=Regra sem título (Automatic Translation) untitled-scheduled-publish-process=Processo de publicação programado sem título (Automatic Translation) untitled-segment=Segmento sem título (Automatic Translation) untitled-set=Conjunto sem título -untitled-structure=Untitled Structure (Automatic Copy) +untitled-structure=Estrutura sem título untitled-workflow=Fluxo de trabalho sem título (Automatic Translation) untitled-x=Sem título {0} untracked=Sem rastreamento (Automatic Translation) @@ -21562,7 +21567,7 @@ was=Foi (Automatic Translation) was-this-information-helpful=Esta informação foi útil? watcher=Observador we-are-excited-to-share-that-marketplace-is-now-part-of-fragments=Estamos animados em anunciar que o Marketplace agora está integrado aos Fragmentos! Você pode navegar, instalar e gerenciar novos fragmentos e conjuntos de fragmentos diretamente na Administração de Fragmentos. -we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=We are excited to share that Marketplace is now part of Page Builder! Browse, install, and manage components without leaving the Page. (Automatic Copy) +we-are-excited-to-share-that-marketplace-is-now-part-of-page-builder=Estamos empolgados em compartilhar que o Marketplace agora faz parte do Construtor de página! Navegue, instale e gerencie os componentes sem sair da página. we-will-not-send-you-emails-to-x-anymore=Não enviaremos mais e-mails para {0}. weather=Clima weather-condition-id=ID de condição meteorológica diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ro.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ro.properties index 95544da1a4c487..b1c3b80bc9b09c 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ro.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ro.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Cale certificat (Automatic Translation) certificate-url=URL certificat (Automatic Translation) chain-method=Metoda lanțului (Automatic Translation) change=Schimbă +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Modificare element pe care se poate face clic (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Schimbarea valorii acestui câmp va reîncărca pagina. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=canal (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Valute comerciale (Automatic Translation) currency=Monedă currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simboluri Valută currency.AED=Eau Dirham (Automatic Translation) currency.ALL=Albaneză Lek (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki-uri feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ru.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ru.properties index cfbf1c1e6a1174..79af9cefb213bc 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ru.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ru.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Путь сертификата (Automatic Translation) certificate-url=URL-адрес сертификата (Automatic Translation) chain-method=Цепной метод (Automatic Translation) change=Изменить +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Изменение кликабельного элемента (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Изменение значения этого поля вызовет перезагрузку страницы. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=канал (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Торговые валюты (Automatic T currency=Валюта currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Денежные знаки currency.AED=Дирхам ОАЭ currency.ALL=Албанский лек @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Узлы Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sk.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sk.properties index c66052432ac4ce..c4f61649799789 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sk.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sk.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Cesta k certifikátu (Automatic Translation) certificate-url=Adresa URL certifikátu (Automatic Translation) chain-method=Reťazová metóda (Automatic Translation) change=Zmeň +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Zmeniť prvok, na ktorý sa kliká (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Zmena hodnoty tohoto poľa znovu načíta stránku. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanál (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Obchodné meny (Automatic Translation) currency=Mena currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Symboly meny currency.AED=Dirham currency.ALL=Albánsky lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki (Automatic Copy) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sl.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sl.properties index 36a86fb35045e2..979f85a8245163 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sl.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sl.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Pot potrdila (Automatic Translation) certificate-url=URL potrdila (Automatic Translation) chain-method=Način verige (Automatic Translation) change=Spremeni +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Spremeni element, ki ga je mogoče klikati (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Spreminjanje vrednosti tega polja ponovno naloži stran. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanal (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Trgovinske valute (Automatic Translation) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simbol za valuto currency.AED=UAE Dirham (Automatic Translation) currency.ALL=Albanski Lek (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wikiji feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS.properties index 50606cbaa56754..4aab36e802a88b 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Промени +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Промена вредности овог поља ће поново учитати страницу. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Валута currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Симболи Валуте currency.AED=УАЕ дирхам currency.ALL=Албански лек @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Вики feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS_latin.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS_latin.properties index d4bfc650185a26..111aacd5c7f445 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS_latin.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sr_RS_latin.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certificate Path (Automatic Copy) certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=Promeni +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Changing the value of this field reloads the page. (Automatic Copy) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=Valuta currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Simboli Valute currency.AED=UAE dirham currency.ALL=Albanski lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Viki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sv.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sv.properties index 5df36a30a0bf3e..795fd272cca771 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sv.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_sv.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Certifikatsökväg certificate-url=Certifikat-URL chain-method=Kedjemetod change=Ändra +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Ändra tilldelning change-clickable-element=Ändra klickbart element change-collection=Ändra samling @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Ändring av mallen påverkar inte det ursprungliga webbinnehållets standardmall. Ändringen gäller bara för visningen av det här webbinnehållet. changing-the-value-of-this-field-reloads-the-page=En justering av värdet i det här fältet kommer resultera i att sidan laddas om. changing-this-setting-will-reset-all-mappings-for-this-collection=Om du ändrar inställningen återställs alla mappningar för samlingen. +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Kanal channel-account-managers=Ansvariga för kanalkonton channel-defaults=Standard för kanal @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Handelsvalutor currency=Valuta currency-code=Valutakod currency-id=Valuta-ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Valutasymboler currency.AED=arabiska dirham currency.ALL=Albansk lek @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Visa och hantera utrymmen i nya CMS. feature.flag.LPD-32649.title=Utrymmesavsnitt feature.flag.LPD-34594.description=Användare kan skapa objektdefinitionshierarkier genom att definiera en rotobjektdefinition. Underordnade objektdefinitioner är bundna till roten och ärver behörigheter och widgetkonfiguration från rotobjektdefinitionen. API-slutpunkter för underordnade objektdefinitioner slås samman med rotens slutpunkter. feature.flag.LPD-34594.title=Rotobjektdefinition +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki blir inaktuell och kommer att tas bort i framtiden. För att undvika dataförlust måste du flytta över dina data till Liferay Object. feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Tillåt användare på B2B- och B2X-kanaler att använda gästbetalning eller för att logga in och överföra sin kundvagn till ett företagskonto. diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ta_IN.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ta_IN.properties index 40fdbd449a2438..9cf887baaa1c30 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ta_IN.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_ta_IN.properties @@ -3360,6 +3360,7 @@ certificate-path-name=சான்றிதழ் பாதை certificate-url=Certificate URL (Automatic Copy) chain-method=Chain Method (Automatic Copy) change=மாற்றம் +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Change Clickable Element (Automatic Copy) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=டெம்ப்ளேட்டை மாற்றுவது original Web Content default டெம்ப்ளேட்டை பாதிக்காது. மாற்றம் இந்த web content display-க்கு மட்டுமே பொருந்தும். changing-the-value-of-this-field-reloads-the-page=இந்த field மதிப்பை மாற்றுவது பக்கத்தை reloads செய்கிறது. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=Channel (Automatic Copy) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce Currencies (Automatic Copy) currency=நாணயம் currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=நாணய சின்னங்கள் currency.AED=யூஏஈ திராம் currency.ALL=அல்பேனிய லெக் @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=விக்கி Nodes feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_th.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_th.properties index 7655dc26e66f63..d010915b7d80b8 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_th.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_th.properties @@ -3360,6 +3360,7 @@ certificate-path-name=หนังสือรับรองพาธ certificate-url=หนังสือรับรอง URL chain-method=Chain เมธอด change=เปลี่ยน +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=เปลี่ยนองค์ประกอบที่คลิกได้ change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=การเปลี่ยนแปลงเท็มเพลตจะไม่ส่งผลต่อค่าเริ่มต้นเท็มเพลตเว็บคอนเท็นต์ดั้งเดิม การเปลี่ยนแปลงจะถูกนำไปใช้กับการแสดงผลเว็บคอนเท็นต์นี้เท่านั้น changing-the-value-of-this-field-reloads-the-page=การเปลี่ยนแปลงแวลูของฟิลด์นี้จะมีการรีโหลดเพจ changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=ชาแนล channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=สกุลเงินคอมเมิ currency=สกุลเงิน currency-code=Currency Code (Automatic Copy) currency-id=รหัสสกุลเงิน +currency-selector=Currency Selector (Automatic Copy) currency-symbols=สัญลักษณ์สกุลเงิน currency.AED=เดอร์แฮมสหรัฐอาหรับเอมิเรตส์ currency.ALL=เลคแอลเบเนีย @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki Nodes feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_tr.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_tr.properties index db1da5451fcedc..dc1162071d04f5 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_tr.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_tr.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Sertifika Yolu (Automatic Translation) certificate-url=Sertifika URL'si (Automatic Translation) chain-method=Zincir Yöntemi (Automatic Translation) change=Değiştir +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Tıklatılabilir Öğeyi Değiştir (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Bu alanın değerini değiştirmek sayfayı yeniden yükler. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kanal (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Ticaret Para Birimleri (Automatic Translat currency=Para Birimi currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Para Birimi Sembolleri currency.AED=BAE Dirhemi (Automatic Translation) currency.ALL=Arnavut Lek (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wikiler feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_uk.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_uk.properties index a9cdd2e6133c65..8353fb2e8a937d 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_uk.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_uk.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Шлях до сертифіката (Automatic Translatio certificate-url=URL-адреса сертифіката (Automatic Translation) chain-method=Ланцюговий метод (Automatic Translation) change=Змінити +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Змінити елемент, який можна натискати (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Зміна значення цього поля перезавантажує сторінку. (Automatic Translation) changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=канал (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Валюти торгівлі (Automatic T currency=Валюта currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Грошові знаки currency.AED=Дирхам ОАЕ (Automatic Translation) currency.ALL=Албанський лек (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Вікі feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_vi.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_vi.properties index def878cf2ebe4a..fc1fcda76ba50b 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_vi.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_vi.properties @@ -3360,6 +3360,7 @@ certificate-path-name=Đường dẫn Chứng chỉ (Automatic Translation) certificate-url=URL chứng chỉ (Automatic Translation) chain-method=Phương pháp chuỗi (Automatic Translation) change=Thay đổi +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=Thay đổi phần tử có thể nhấp (Automatic Translation) change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=Changing the template will not affect the original web content default template. The change only applies to this web content display. (Automatic Copy) changing-the-value-of-this-field-reloads-the-page=Thay đổi giá trị của trường này sẽ làm trang được tải lại. changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=kênh (Automatic Translation) channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Đơn vị tiền tệ thương mại (Aut currency=Tiền tệ currency-code=Currency Code (Automatic Copy) currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=Ký hiệu tiền tệ currency.AED=UAE Dirham (Automatic Translation) currency.ALL=Lek Albania (Automatic Translation) @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Từ điển bách khoa (Wiki) feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_CN.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_CN.properties index 38b0f742cfe0f8..b3e1b211fd30d5 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_CN.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_CN.properties @@ -3360,6 +3360,7 @@ certificate-path-name=凭证路径 certificate-url=证书 URL chain-method=联算法 change=更改 +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=更改分配 change-clickable-element=更改可点击元素 change-collection=更改集合 @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=更改模板将不会影响原始的 Web 内容默认模板。更改仅适用于其 Web 内容显示。 changing-the-value-of-this-field-reloads-the-page=改变此字段的值将重新加载本页。 changing-this-setting-will-reset-all-mappings-for-this-collection=更改此设置将重置此集合的所有映射。 +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=渠道 channel-account-managers=渠道客户经理 channel-defaults=渠道默认值 @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=商务币种 currency=货币 currency-code=货币代码 currency-id=货币ID +currency-selector=Currency Selector (Automatic Copy) currency-symbols=货币符号 currency.AED=阿联酋迪拉姆 currency.ALL=阿尔巴尼亚列克 @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=用户可以通过定义根对象定义来创建对象定义层次结构。子对象定义绑定到根对象定义,并继承根对象定义的权限和微件配置。子对象定义的 API 端点与根的端点合并。 feature.flag.LPD-34594.title=根对象定义 +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki 已弃用,未来将被移除。为了避免数据丢失,您必须将数据迁移到 Liferay 对象。 feature.flag.LPD-35013.title=Wiki节点 feature.flag.LPD-35678.description=允许 B2B 和 B2X 渠道的用户使用访客结账或登录并将其购物车转到企业帐户。 diff --git a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_TW.properties b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_TW.properties index a7e81404e5e299..bca07cfc5c5874 100644 --- a/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_TW.properties +++ b/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language_zh_TW.properties @@ -3360,6 +3360,7 @@ certificate-path-name=憑證路徑 certificate-url=憑證 URL chain-method=Chain Method change=改變 +change-active-currency=Change Active Currency (Automatic Copy) change-assignment=Change Assignment (Automatic Copy) change-clickable-element=變更可點擊的元素 change-collection=Change Collection (Automatic Copy) @@ -3435,6 +3436,7 @@ changing-the-structure-key-will-reindex-all-the-web-content-articles-with-this-s changing-the-template-will-not-affect-the-original-web-content-default-template.-the-change-only-applies-to-this-web-content-display=變更範本不會影響原始網站內容的預設範本。 此更改僅適用於此網站內容的顯示。 changing-the-value-of-this-field-reloads-the-page=改變這個欄位值將會重新載入此頁面。 changing-this-setting-will-reset-all-mappings-for-this-collection=Changing this setting will reset all mappings for this collection. (Automatic Copy) +changing-your-currency-will-automatically-create-a-new-order-with-the-selected-currency.-your-current-order-will-be-saved-and-accessible.-are-you-sure-you-want-to-proceed=Changing your currency will automatically create a new order with the selected currency. Your current order will be saved and accessible. Are you sure you want to proceed? (Automatic Copy) channel=渠道 channel-account-managers=Channel Account Managers (Automatic Copy) channel-defaults=Channel Defaults (Automatic Copy) @@ -5056,6 +5058,7 @@ currencies.commerce.health.status.key=Commerce 幣別 currency=貨幣 currency-code=幣別代碼 currency-id=Currency ID (Automatic Copy) +currency-selector=Currency Selector (Automatic Copy) currency-symbols=貨幣符號 currency.AED=阿聯迪拉姆 currency.ALL=阿爾巴尼亞列克 @@ -7554,6 +7557,8 @@ feature.flag.LPD-32649.description=Show and manage spaces in the new CMS. (Autom feature.flag.LPD-32649.title=Spaces Section (Automatic Copy) feature.flag.LPD-34594.description=Users can create object definition hierarchies by defining a root object definition. Child object definitions are bound to the root and inherit permissions and widget configuration from the root object definition. The API endpoints of child object definitions are merged with the root's endpoints. (Automatic Copy) feature.flag.LPD-34594.title=Root Object Definitions (Automatic Copy) +feature.flag.LPD-34908.description=Buyers can select their preferred currency during the shopping experience. Ensure products can be sold in different currencies without the need to create multiple products. (Automatic Copy) +feature.flag.LPD-34908.title=Currency Selector/Multicurrency Product Support (Automatic Copy) feature.flag.LPD-35013.description=Wiki is deprecated and will be removed in the future. To avoid data loss, you must migrate your data to Liferay Object. (Automatic Copy) feature.flag.LPD-35013.title=Wiki feature.flag.LPD-35678.description=Allow users on B2B and B2X channels to use guest checkout or to login and transfer their cart to a business account. (Automatic Copy) diff --git a/modules/test/playwright/fixtures/commercePagesTest.ts b/modules/test/playwright/fixtures/commercePagesTest.ts index 49f78669b6d2d0..adaaf61cc346ac 100644 --- a/modules/test/playwright/fixtures/commercePagesTest.ts +++ b/modules/test/playwright/fixtures/commercePagesTest.ts @@ -10,6 +10,7 @@ import {CommerceChannelDefaultsPage} from '../pages/commerce/commerce-account-we import {CommerceCartPage} from '../pages/commerce/commerce-cart-content-web/commerceCartPage'; import {CommerceCartSummaryPage} from '../pages/commerce/commerce-cart-content-web/commerceCartSummaryPage'; import {CommerceAdminChannelDetailsCountriesPage} from '../pages/commerce/commerce-channel-web/commerceAdminChannelDetailsCountriesPage'; +import {CommerceAdminChannelDetailsCurrenciesPage} from '../pages/commerce/commerce-channel-web/commerceAdminChannelDetailsCurrenciesPage'; import {CommerceAdminChannelDetailsPage} from '../pages/commerce/commerce-channel-web/commerceAdminChannelDetailsPage'; import {CommerceAdminChannelsPage} from '../pages/commerce/commerce-channel-web/commerceAdminChannelsPage'; import {CheckoutPage} from '../pages/commerce/commerce-checkout-web/checkoutPage'; @@ -59,6 +60,7 @@ const commercePagesTest = test.extend<{ checkoutPage: CheckoutPage; commerceAccountManagementPage: CommerceAccountManagementPage; commerceAdminChannelDetailsCountriesPage: CommerceAdminChannelDetailsCountriesPage; + commerceAdminChannelDetailsCurrenciesPage: CommerceAdminChannelDetailsCurrenciesPage; commerceAdminChannelDetailsPage: CommerceAdminChannelDetailsPage; commerceAdminChannelsPage: CommerceAdminChannelsPage; commerceAdminCurrenciesPage: CommerceAdminCurrenciesPage; @@ -116,6 +118,9 @@ const commercePagesTest = test.extend<{ commerceAdminChannelDetailsCountriesPage: async ({page}, use) => { await use(new CommerceAdminChannelDetailsCountriesPage(page)); }, + commerceAdminChannelDetailsCurrenciesPage: async ({page}, use) => { + await use(new CommerceAdminChannelDetailsCurrenciesPage(page)); + }, commerceAdminChannelDetailsPage: async ({page}, use) => { await use(new CommerceAdminChannelDetailsPage(page)); }, diff --git a/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsCurrenciesPage.ts b/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsCurrenciesPage.ts new file mode 100644 index 00000000000000..dba557dcfb9302 --- /dev/null +++ b/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsCurrenciesPage.ts @@ -0,0 +1,87 @@ +/** + * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com + * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06 + */ + +import {FrameLocator, Locator, Page} from '@playwright/test'; + +import {ApplicationsMenuPage} from '../../product-navigation-applications-menu/ApplicationsMenuPage'; +import {searchTableRowByValue} from '../commerceDNDTablePage'; + +export class CommerceAdminChannelDetailsCurrenciesPage { + readonly addCurrencyAddButton: Locator; + readonly addCurrencyButton: Locator; + readonly addCurrencyFrame: FrameLocator; + readonly applicationsMenuPage: ApplicationsMenuPage; + readonly currenciesTable: Locator; + readonly currenciesTableRow: ( + colPosition: number, + value: number | string, + strictEqual?: boolean + ) => Promise<{column: Locator; row: Locator}>; + readonly currenciesTableRows: () => Promise; + readonly currenciesTableRowAction: ( + currencyName: string, + action: string + ) => Promise; + readonly currencyFrameCurrency: (currencyName: string) => Promise; + readonly page: Page; + + constructor(page: Page) { + this.addCurrencyButton = page + .getByTestId('management-toolbar') + .locator('[data-testid="fdsCreationActionButton"]'); + this.addCurrencyAddButton = page.getByRole('button', { + exact: true, + name: 'Add', + }); + this.addCurrencyFrame = page.frameLocator( + 'iframe[title="Add Currency"]' + ); + this.applicationsMenuPage = new ApplicationsMenuPage(page); + this.currenciesTable = page.locator( + '#_com_liferay_commerce_channel_web_internal_portlet_CommerceChannelsPortlet_editChannelContainer .fds table' + ); + this.currenciesTableRow = async ( + colPosition: number, + value: number | string, + strictEqual: boolean = false + ) => { + return await searchTableRowByValue( + this.currenciesTable, + colPosition, + String(value), + strictEqual + ); + }; + this.currenciesTableRows = async () => { + await this.currenciesTable.elementHandle(); + + return await this.currenciesTable.locator('tbody tr').all(); + }; + this.currenciesTableRowAction = async ( + currencyName: string, + action: string + ) => { + const currenciesTableRow = await this.currenciesTableRow( + 0, + currencyName, + true + ); + + if (currenciesTableRow && currenciesTableRow.column) { + return currenciesTableRow.row.getByRole('link', { + name: action, + }); + } + + throw new Error( + `Cannot locate currency row with name ${currencyName}` + ); + }; + this.currencyFrameCurrency = async (currencyName: string) => { + return this.addCurrencyFrame.getByLabel(currencyName); + }; + this.page = page; + } +} diff --git a/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsPage.ts b/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsPage.ts index 54fdb3f359a6e6..3507b2a9f8e9d7 100644 --- a/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsPage.ts +++ b/modules/test/playwright/pages/commerce/commerce-channel-web/commerceAdminChannelDetailsPage.ts @@ -31,6 +31,7 @@ export class CommerceAdminChannelDetailsPage { pageName: string ) => Promise; readonly countryTab: Locator; + readonly currencyTab: Locator; readonly detailsButton: (tableName: string) => Promise; readonly eligibilityTab: ( isNestedFrame: boolean, @@ -153,6 +154,7 @@ export class CommerceAdminChannelDetailsPage { throw new Error(`Cannot locate table row with name ${pageName}`); }; this.countryTab = page.getByRole('link', {name: 'Countries'}); + this.currencyTab = page.getByRole('link', {name: 'Currencies'}); this.generalCommerceAdminChannelTableLink = async (name: string) => { return page.getByRole('link', {exact: true, name}); }; @@ -569,4 +571,8 @@ export class CommerceAdminChannelDetailsPage { async goToCountries() { await this.countryTab.click(); } + + async goToCurrencies() { + await this.currencyTab.click(); + } } diff --git a/modules/test/playwright/pages/commerce/commerce-currency-web/commerceAdminCurrenciesPage.ts b/modules/test/playwright/pages/commerce/commerce-currency-web/commerceAdminCurrenciesPage.ts index 81adad5790500f..cd54aff3779580 100644 --- a/modules/test/playwright/pages/commerce/commerce-currency-web/commerceAdminCurrenciesPage.ts +++ b/modules/test/playwright/pages/commerce/commerce-currency-web/commerceAdminCurrenciesPage.ts @@ -51,20 +51,14 @@ export class CommerceAdminCurrenciesPage { .getByTestId('management-toolbar') .getByRole('button', {name: 'Filter'}); this.firstRowCurrencyCellName = (currencyName) => - page - .locator('.dnd-tbody .dnd-tr') - .first() - .locator('.cell-name') - .filter({hasText: currencyName}); + page.locator('tbody tr').first().filter({hasText: currencyName}); this.lastRowCurrencyCellName = (currencyName) => - page - .locator('.dnd-tbody .dnd-tr') - .last() - .locator('.cell-name') - .filter({hasText: currencyName}); + page.locator('tbody tr').last().filter({hasText: currencyName}); this.noResultsFoundText = page.getByText('No Results Found'); this.primaryMenuItem = page.getByRole('menuitem', {name: 'Primary'}); - this.priorityButton = page.getByRole('button', {name: 'Priority'}); + this.priorityButton = page + .getByRole('columnheader', {name: 'Priority'}) + .getByRole('button'); this.resetFilterButton = page.getByRole('button', { name: 'Reset Filters', }); diff --git a/modules/test/playwright/tests/commerce/commerce-channel-web/commerceAdminChannelDetails.spec.ts b/modules/test/playwright/tests/commerce/commerce-channel-web/commerceAdminChannelDetails.spec.ts index 0d88d40e462d82..603d60f981beb6 100644 --- a/modules/test/playwright/tests/commerce/commerce-channel-web/commerceAdminChannelDetails.spec.ts +++ b/modules/test/playwright/tests/commerce/commerce-channel-web/commerceAdminChannelDetails.spec.ts @@ -8,6 +8,8 @@ import {expect, mergeTests} from '@playwright/test'; import {apiHelpersTest} from '../../../fixtures/apiHelpersTest'; import {commercePagesTest} from '../../../fixtures/commercePagesTest'; import {dataApiHelpersTest} from '../../../fixtures/dataApiHelpersTest'; +import {featureFlagsTest} from '../../../fixtures/featureFlagsTest'; +import {isolatedSiteTest} from '../../../fixtures/isolatedSiteTest'; import {loginTest} from '../../../fixtures/loginTest'; import getRandomString from '../../../utils/getRandomString'; import performLogin, { @@ -19,6 +21,10 @@ export const test = mergeTests( apiHelpersTest, commercePagesTest, dataApiHelpersTest, + isolatedSiteTest, + featureFlagsTest({ + 'LPD-34908': {enabled: true}, + }), loginTest() ); @@ -188,3 +194,89 @@ test('LPD-30466 Verify users without edit permission cannot click on channel nam await performLogin(page, 'test'); } }); + +test( + 'Manage channel currency visibility from channel page', + {tag: '@LPD-48683'}, + async ({ + apiHelpers, + commerceAdminChannelDetailsCurrenciesPage, + commerceAdminChannelDetailsPage, + commerceAdminChannelsPage, + page, + site, + }) => { + const channel = + await apiHelpers.headlessCommerceAdminChannel.postChannel({ + siteGroupId: site.id, + }); + + await commerceAdminChannelsPage.goto(); + + await ( + await commerceAdminChannelsPage.channelsTableRowLink(channel.name) + ).click(); + + await commerceAdminChannelDetailsPage.goToCurrencies(); + + await commerceAdminChannelDetailsCurrenciesPage.addCurrencyButton.click(); + + const currencyName1 = 'US Dollar'; + const currencyName2 = 'Australian Dollar'; + + await ( + await commerceAdminChannelDetailsCurrenciesPage.currencyFrameCurrency( + currencyName1 + ) + ).check(); + + await ( + await commerceAdminChannelDetailsCurrenciesPage.currencyFrameCurrency( + currencyName2 + ) + ).check(); + + await commerceAdminChannelDetailsCurrenciesPage.addCurrencyAddButton.click(); + + await expect( + ( + await commerceAdminChannelDetailsCurrenciesPage.currenciesTableRow( + 0, + currencyName1, + true + ) + ).row + ).toBeVisible(); + await expect( + ( + await commerceAdminChannelDetailsCurrenciesPage.currenciesTableRow( + 0, + currencyName2, + true + ) + ).row + ).toBeVisible(); + + await ( + await commerceAdminChannelDetailsCurrenciesPage.currenciesTableRowAction( + currencyName1, + 'Remove' + ) + ).click(); + + await page.reload(); + + expect( + await commerceAdminChannelDetailsCurrenciesPage.currenciesTableRows() + ).toHaveLength(1); + await expect( + ( + await commerceAdminChannelDetailsCurrenciesPage.currenciesTableRow( + 0, + currencyName2, + true + ) + ).row + ).toBeVisible(); + } +); diff --git a/modules/test/playwright/tests/commerce/commerce-currency-web/commerceAdminCurrency.spec.ts b/modules/test/playwright/tests/commerce/commerce-currency-web/commerceAdminCurrency.spec.ts index e130943a3d9fc5..9bf66e03a3c8a2 100644 --- a/modules/test/playwright/tests/commerce/commerce-currency-web/commerceAdminCurrency.spec.ts +++ b/modules/test/playwright/tests/commerce/commerce-currency-web/commerceAdminCurrency.spec.ts @@ -30,13 +30,13 @@ test('COMMERCE-5839 As a system admin i want to be able to create / update and d commerceAdminCurrencyDetailsPage, page, }) => { - test.setTimeout(180000); await page.goto('/'); await commerceAdminCurrenciesPage.goto(); const currencyName = 'TC' + getRandomInt(); await commerceAdminCurrenciesPage.addCurrencyAddButton.click(); + await commerceAdminCurrencyDetailsPage.nameInput.fill(currencyName); await commerceAdminCurrencyDetailsPage.codeInput.fill(currencyName); await commerceAdminCurrencyDetailsPage.saveButton.click(); @@ -48,9 +48,11 @@ test('COMMERCE-5839 As a system admin i want to be able to create / update and d ).toBeVisible(); await commerceAdminCurrenciesPage.currencyNameLink(currencyName).click(); + await commerceAdminCurrencyDetailsPage.symbol.fill('&&&'); await commerceAdminCurrencyDetailsPage.priority.fill('99'); await commerceAdminCurrencyDetailsPage.saveButton.click(); + await commerceAdminCurrenciesPage.currencyNameLink(currencyName).click(); await expect(commerceAdminCurrencyDetailsPage.codeInput).not.toBeEditable(); @@ -58,6 +60,7 @@ test('COMMERCE-5839 As a system admin i want to be able to create / update and d await expect(commerceAdminCurrencyDetailsPage.priority).toHaveValue('99.0'); await commerceAdminCurrencyDetailsPage.cancelButton.click(); + await commerceAdminCurrenciesPage.priorityButton.click(); await expect( @@ -143,6 +146,7 @@ test('COMMERCE-5839 As a system admin i want to be able to create / update and d await commerceAdminCurrenciesPage.actionsButton.click(); let dialogMessage = ''; + page.on('dialog', (dialog) => { dialogMessage = dialog.message(); dialog.accept(); @@ -150,7 +154,7 @@ test('COMMERCE-5839 As a system admin i want to be able to create / update and d await commerceAdminCurrenciesPage.deleteMenuItem.click(); - await expect(dialogMessage).toEqual( + expect(dialogMessage).toEqual( 'Are you sure you want to delete this entry?' ); diff --git a/portal-impl/src/portal.properties b/portal-impl/src/portal.properties index 709bd332eaa244..b3659e5c0c9cb9 100644 --- a/portal-impl/src/portal.properties +++ b/portal-impl/src/portal.properties @@ -6561,6 +6561,11 @@ # feature.flag.LPD-34594=false + # + # Env: LIFERAY_FEATURE_PERIOD_FLAG_PERIOD__UPPERCASEL__UPPERCASEP__UPPERCASED__MINUS__NUMBER3__NUMBER4__NUMBER9__NUMBER0__NUMBER8_ + # + feature.flag.LPD-34908=false + # # Env: LIFERAY_FEATURE_PERIOD_FLAG_PERIOD__UPPERCASEL__UPPERCASEP__UPPERCASED__MINUS__NUMBER3__NUMBER4__NUMBER9__NUMBER3__NUMBER8_ # @@ -7030,6 +7035,11 @@ # feature.flag.LPD-34594.type=release + # + # Env: LIFERAY_FEATURE_PERIOD_FLAG_PERIOD__UPPERCASEL__UPPERCASEP__UPPERCASED__MINUS__NUMBER3__NUMBER4__NUMBER9__NUMBER0__NUMBER8__PERIOD_TYPE + # + feature.flag.LPD-34908.type=release + # # Env: LIFERAY_FEATURE_PERIOD_FLAG_PERIOD__UPPERCASEL__UPPERCASEP__UPPERCASED__MINUS__NUMBER3__NUMBER5__NUMBER0__NUMBER1__NUMBER3__PERIOD_TYPE #