From b06928d089b099023bba06e7b0ff3c0b1d43d74b Mon Sep 17 00:00:00 2001 From: Jeroen Laverman Date: Thu, 13 Dec 2018 09:07:10 +0100 Subject: [PATCH] Fix missing localization (#772) * fix typos Signed-off-by: Jeroen Laverman * Add localization to documentation link description Signed-off-by: Jeroen Laverman * Add localization for rollouts errorthreshold Signed-off-by: Jeroen Laverman * Add CN to available localizations Signed-off-by: Jeroen Laverman * fix NO TAG localization Signed-off-by: Jeroen Laverman * Fix sonar findings Signed-off-by: Jeroen Laverman * Make Localization configurable Signed-off-by: Jeroen Laverman * fix sonar findings Signed-off-by: Jeroen Laverman * fix review findings Signed-off-by: Jeroen Laverman * fix review findings Signed-off-by: Jeroen Laverman * add final Signed-off-by: Jeroen Laverman --- .../java/org/eclipse/hawkbit/app/MyUI.java | 6 ++- .../src/main/resources/application.properties | 4 ++ .../eclipse/hawkbit/ui/AbstractHawkbitUI.java | 13 +++--- .../org/eclipse/hawkbit/ui/UiProperties.java | 43 +++++++++++++++++++ .../hawkbit/ui/common/CommonDialogWindow.java | 2 +- .../ui/components/SPUIComponentProvider.java | 6 ++- .../CreateOrUpdateFilterHeader.java | 2 +- .../management/dstable/DistributionTable.java | 2 +- .../TargetBulkUpdateWindowLayout.java | 2 +- .../management/targettable/TargetTable.java | 4 +- .../rollout/AddUpdateRolloutWindowLayout.java | 21 +++++---- .../AuthenticationConfigurationView.java | 2 +- .../RolloutConfigurationView.java | 2 +- .../TenantConfigurationDashboardView.java | 2 +- .../hawkbit/ui/utils/SPUIDefinitions.java | 22 ---------- .../src/main/resources/messages.properties | 19 +++++--- 16 files changed, 96 insertions(+), 56 deletions(-) diff --git a/hawkbit-runtime/hawkbit-update-server/src/main/java/org/eclipse/hawkbit/app/MyUI.java b/hawkbit-runtime/hawkbit-update-server/src/main/java/org/eclipse/hawkbit/app/MyUI.java index 1fe825c4d..29ed12209 100644 --- a/hawkbit-runtime/hawkbit-update-server/src/main/java/org/eclipse/hawkbit/app/MyUI.java +++ b/hawkbit-runtime/hawkbit-update-server/src/main/java/org/eclipse/hawkbit/app/MyUI.java @@ -10,6 +10,7 @@ package org.eclipse.hawkbit.app; import org.eclipse.hawkbit.ui.AbstractHawkbitUI; import org.eclipse.hawkbit.ui.ErrorView; +import org.eclipse.hawkbit.ui.UiProperties; import org.eclipse.hawkbit.ui.components.NotificationUnreadButton; import org.eclipse.hawkbit.ui.menu.DashboardMenu; import org.eclipse.hawkbit.ui.push.EventPushStrategy; @@ -43,8 +44,9 @@ public class MyUI extends AbstractHawkbitUI { @Autowired MyUI(final EventPushStrategy pushStrategy, final UIEventBus eventBus, final SpringViewProvider viewProvider, final ApplicationContext context, final DashboardMenu dashboardMenu, final ErrorView errorview, - final NotificationUnreadButton notificationUnreadButton) { - super(pushStrategy, eventBus, viewProvider, context, dashboardMenu, errorview, notificationUnreadButton); + final NotificationUnreadButton notificationUnreadButton, final UiProperties uiProperties) { + super(pushStrategy, eventBus, viewProvider, context, dashboardMenu, errorview, notificationUnreadButton, + uiProperties); } } diff --git a/hawkbit-runtime/hawkbit-update-server/src/main/resources/application.properties b/hawkbit-runtime/hawkbit-update-server/src/main/resources/application.properties index a25cd0250..de7c387f6 100644 --- a/hawkbit-runtime/hawkbit-update-server/src/main/resources/application.properties +++ b/hawkbit-runtime/hawkbit-update-server/src/main/resources/application.properties @@ -29,6 +29,10 @@ spring.rabbitmq.port=5672 # Monitoring endpoints.health.enabled=true +# UI Localization +hawkbit.server.ui.localization.defaultLocal=en +hawkbit.server.ui.localization.availableLocals=en,de + # UI demo account hawkbit.server.ui.demo.password=admin hawkbit.server.ui.demo.user=admin diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java index ef02f3d28..afa1ed22d 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java @@ -8,8 +8,8 @@ */ package org.eclipse.hawkbit.ui; +import java.util.List; import java.util.Locale; -import java.util.Set; import javax.servlet.http.Cookie; @@ -81,9 +81,11 @@ public abstract class AbstractHawkbitUI extends UI implements DetachListener { private Label viewTitle; + private final UiProperties uiProperties; + protected AbstractHawkbitUI(final EventPushStrategy pushStrategy, final UIEventBus eventBus, final SpringViewProvider viewProvider, final ApplicationContext context, final DashboardMenu dashboardMenu, - final ErrorView errorview, final NotificationUnreadButton notificationUnreadButton) { + final ErrorView errorview, final NotificationUnreadButton notificationUnreadButton, final UiProperties uiProperties) { this.pushStrategy = pushStrategy; this.eventBus = eventBus; this.viewProvider = viewProvider; @@ -91,6 +93,7 @@ public abstract class AbstractHawkbitUI extends UI implements DetachListener { this.dashboardMenu = dashboardMenu; this.errorview = errorview; this.notificationUnreadButton = notificationUnreadButton; + this.uiProperties = uiProperties; } @Override @@ -164,7 +167,7 @@ public abstract class AbstractHawkbitUI extends UI implements DetachListener { navigator.addView(EMPTY_VIEW, new Navigator.EmptyView()); // set locale is required for I18N class also, to get the locale from // cookie - final String locale = getLocaleId(SPUIDefinitions.getAvailableLocales()); + final String locale = getLocaleId(uiProperties.getLocalization().getAvailableLocals()); setLocale(new Locale(locale)); if (UI.getCurrent().getErrorHandler() == null) { @@ -209,9 +212,9 @@ public abstract class AbstractHawkbitUI extends UI implements DetachListener { * as set * @return String as preferred locale */ - private static String getLocaleId(final Set availableLocalesInApp) { + private String getLocaleId(final List availableLocalesInApp) { final String[] localeChain = getLocaleChain(); - String spLocale = SPUIDefinitions.DEFAULT_LOCALE; + String spLocale = uiProperties.getLocalization().getDefaultLocal(); if (null != localeChain) { // Find best matching locale for (final String localeId : localeChain) { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java index e81af6edb..071dcc805 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/UiProperties.java @@ -9,6 +9,8 @@ package org.eclipse.hawkbit.ui; import java.io.Serializable; +import java.util.Collections; +import java.util.List; import java.util.concurrent.TimeUnit; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -23,6 +25,8 @@ public class UiProperties implements Serializable { private boolean gravatar; + private final Localization localization = new Localization(); + private final Links links = new Links(); private final Login login = new Login(); @@ -39,6 +43,41 @@ public class UiProperties implements Serializable { this.gravatar = gravatar; } + + + /** + * Localization information + */ + public static class Localization implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * Default localization + */ + private String defaultLocal = "en"; + + /** + * List of available localizations + */ + private List availableLocals = Collections.singletonList("en"); + + public String getDefaultLocal() { + return defaultLocal; + } + + public List getAvailableLocals() { + return availableLocals; + } + + public void setDefaultLocal(final String defaultLocal) { + this.defaultLocal = defaultLocal; + } + + public void setAvailableLocals(final List availableLocals) { + this.availableLocals = availableLocals; + } + } + /** * Demo account login information. * @@ -375,4 +414,8 @@ public class UiProperties implements Serializable { return event; } + public Localization getLocalization() { + return localization; + } + } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java index cd5c89e1b..d38a6826f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/common/CommonDialogWindow.java @@ -479,7 +479,7 @@ public class CommonDialogWindow extends Window { if (StringUtils.isEmpty(helpLink)) { return; } - final Link helpLinkComponent = SPUIComponentProvider.getHelpLink(helpLink); + final Link helpLinkComponent = SPUIComponentProvider.getHelpLink(i18n, helpLink); buttonsLayout.addComponent(helpLinkComponent); buttonsLayout.setComponentAlignment(helpLinkComponent, Alignment.MIDDLE_RIGHT); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java index 6890eec18..fe3533b2f 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/components/SPUIComponentProvider.java @@ -333,17 +333,19 @@ public final class SPUIComponentProvider { /** * Generates help/documentation links from within management UI. * + * @param i18n + * the i18n * @param uri * to documentation site * * @return generated link */ - public static Link getHelpLink(final String uri) { + public static Link getHelpLink(final VaadinMessageSource i18n, final String uri) { final Link link = new Link("", new ExternalResource(uri)); link.setTargetName("_blank"); link.setIcon(FontAwesome.QUESTION_CIRCLE); - link.setDescription("Documentation"); + link.setDescription(i18n.getMessage("tooltip.documentation.link")); return link; } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/CreateOrUpdateFilterHeader.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/CreateOrUpdateFilterHeader.java index 7022fac31..e65d2bb12 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/CreateOrUpdateFilterHeader.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/CreateOrUpdateFilterHeader.java @@ -186,7 +186,7 @@ public class CreateOrUpdateFilterHeader extends VerticalLayout implements Button saveButton = createSaveButton(); searchIcon = createSearchIcon(); - helpLink = SPUIComponentProvider.getHelpLink(uiProperties.getLinks().getDocumentation().getTargetfilterView()); + helpLink = SPUIComponentProvider.getHelpLink(i18n, uiProperties.getLinks().getDocumentation().getTargetfilterView()); closeIcon = createSearchResetIcon(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java index ffd3a6421..59ca30e63 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/management/dstable/DistributionTable.java @@ -612,7 +612,7 @@ public class DistributionTable extends AbstractNamedVersionTable { final String tagName = HawkbitCommonUtil.removePrefix(wrapperSource.getId(), SPUIDefinitions.TARGET_TAG_ID_PREFIXS); if (wrapperSource.getId().startsWith(SPUIDefinitions.TARGET_TAG_ID_PREFIXS)) { - if ("NO TAG".equals(tagName)) { + if (getI18n().getMessage("label.no.tag").equals(tagName)) { getNotification() .displayValidationError(getI18n().getMessage(UIMessageIdProvider.MESSAGE_ACTION_NOT_ALLOWED)); return false; @@ -1033,7 +1033,7 @@ public class TargetTable extends AbstractTable { private Link maintenanceWindowHelpLinkControl() { final String maintenanceWindowHelpUrl = uiProperties.getLinks().getDocumentation().getMaintenanceWindowView(); - return SPUIComponentProvider.getHelpLink(maintenanceWindowHelpUrl); + return SPUIComponentProvider.getHelpLink(getI18n(), maintenanceWindowHelpUrl); } private void initMaintenanceWindow() { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java index eef71ac35..ceedc8e53 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/rollout/rollout/AddUpdateRolloutWindowLayout.java @@ -361,7 +361,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private int getErrorThresholdPercentage(final int amountGroup) { int errorThresoldPercent = Integer.parseInt(errorThreshold.getValue()); - if (errorThresholdOptionGroup.getValue().equals(ERROR_THRESHOLD_OPTIONS.COUNT.getValue())) { + if (errorThresholdOptionGroup.getValue().equals(ERROR_THRESHOLD_OPTIONS.COUNT.getValue(i18n))) { final int groupSize = (int) Math.ceil((double) totalTargetsCount / (double) amountGroup); final int erroThresoldCount = Integer.parseInt(errorThreshold.getValue()); errorThresoldPercent = (int) Math.ceil(((float) erroThresoldCount / (float) groupSize) * 100); @@ -683,7 +683,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private OptionGroup createErrorThresholdOptionGroup() { final OptionGroup errorThresoldOptions = new OptionGroup(); for (final ERROR_THRESHOLD_OPTIONS option : ERROR_THRESHOLD_OPTIONS.values()) { - errorThresoldOptions.addItem(option.getValue()); + errorThresoldOptions.addItem(option.getValue(i18n)); } errorThresoldOptions.setId(UIComponentIdProvider.ROLLOUT_ERROR_THRESOLD_OPTION_ID); errorThresoldOptions.addStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL); @@ -696,7 +696,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private void listenerOnErrorThresoldOptionChange(final ValueChangeEvent event) { errorThreshold.clear(); errorThreshold.removeAllValidators(); - if (event.getProperty().getValue().equals(ERROR_THRESHOLD_OPTIONS.COUNT.getValue())) { + if (event.getProperty().getValue().equals(ERROR_THRESHOLD_OPTIONS.COUNT.getValue(i18n))) { errorThreshold.addValidator(new ErrorThresholdOptionValidator()); } else { errorThreshold.addValidator(new ThresholdFieldValidator()); @@ -828,7 +828,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { } private void setDefaultSaveStartGroupOption() { - errorThresholdOptionGroup.setValue(ERROR_THRESHOLD_OPTIONS.PERCENT.getValue()); + errorThresholdOptionGroup.setValue(ERROR_THRESHOLD_OPTIONS.PERCENT.getValue(i18n)); } private static TextArea createDescription() { @@ -1106,18 +1106,17 @@ public class AddUpdateRolloutWindowLayout extends GridLayout { private enum ERROR_THRESHOLD_OPTIONS { - PERCENT("%"), - - COUNT("Count"); + PERCENT("label.errorthreshold.option.percent"), + COUNT("label.errorthreshold.option.count"); private final String value; - ERROR_THRESHOLD_OPTIONS(final String val) { - value = val; + ERROR_THRESHOLD_OPTIONS(final String value) { + this.value = value; } - private String getValue() { - return value; + private String getValue(final VaadinMessageSource i18n) { + return i18n.getMessage(value); } } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/AuthenticationConfigurationView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/AuthenticationConfigurationView.java index 519788a3e..7a1b0fa55 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/AuthenticationConfigurationView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/AuthenticationConfigurationView.java @@ -129,7 +129,7 @@ public class AuthenticationConfigurationView extends BaseConfigurationView gridLayout.addComponent(anonymousDownloadAuthenticationConfigurationItem, 1, 3); final Link linkToSecurityHelp = SPUIComponentProvider - .getHelpLink(uiProperties.getLinks().getDocumentation().getSecurity()); + .getHelpLink(i18n, uiProperties.getLinks().getDocumentation().getSecurity()); gridLayout.addComponent(linkToSecurityHelp, 2, 3); gridLayout.setComponentAlignment(linkToSecurityHelp, Alignment.BOTTOM_RIGHT); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/RolloutConfigurationView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/RolloutConfigurationView.java index b996ed1f0..d14f46058 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/RolloutConfigurationView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/RolloutConfigurationView.java @@ -74,7 +74,7 @@ public class RolloutConfigurationView extends BaseConfigurationView hLayout.addComponent(approvalConfigurationItem); final Link linkToApprovalHelp = SPUIComponentProvider - .getHelpLink(uiProperties.getLinks().getDocumentation().getRollout()); + .getHelpLink(i18n, uiProperties.getLinks().getDocumentation().getRollout()); hLayout.addComponent(linkToApprovalHelp); hLayout.setComponentAlignment(linkToApprovalHelp, Alignment.BOTTOM_RIGHT); diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/TenantConfigurationDashboardView.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/TenantConfigurationDashboardView.java index da8eff681..0e61d15c9 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/TenantConfigurationDashboardView.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/tenantconfiguration/TenantConfigurationDashboardView.java @@ -154,7 +154,7 @@ public class TenantConfigurationDashboardView extends CustomComponent implements hlayout.addComponent(undoConfigurationBtn); final Link linkToSystemConfigHelp = SPUIComponentProvider - .getHelpLink(uiProperties.getLinks().getDocumentation().getSystemConfigurationView()); + .getHelpLink(i18n, uiProperties.getLinks().getDocumentation().getSystemConfigurationView()); hlayout.addComponent(linkToSystemConfigHelp); return hlayout; diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java index 8750efda7..d3ff883ce 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SPUIDefinitions.java @@ -8,25 +8,12 @@ */ package org.eclipse.hawkbit.ui.utils; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import org.springframework.data.domain.Sort.Direction; /** * Class to provide the unchanged constants. */ public final class SPUIDefinitions { - /** - * Available locales. - */ - private static final Set AVAILABLE_LOCALES = Stream.of("en", "de").collect(Collectors.toSet()); - - /** - * Default locale. - */ - public static final String DEFAULT_LOCALE = "en"; /** * Locale cookie name. */ @@ -388,13 +375,4 @@ public final class SPUIDefinitions { private SPUIDefinitions() { } - - /** - * Get the locales - * - * @return the availableLocales - */ - public static Set getAvailableLocales() { - return AVAILABLE_LOCALES; - } } diff --git a/hawkbit-ui/src/main/resources/messages.properties b/hawkbit-ui/src/main/resources/messages.properties index fba3de462..645c1199d 100644 --- a/hawkbit-ui/src/main/resources/messages.properties +++ b/hawkbit-ui/src/main/resources/messages.properties @@ -242,6 +242,14 @@ label.scheduled = Scheduled label.approval.decision = Approval decision label.approval.remark = Remark (optional) label.drop.area.upload = Drop Files to upload +label.errorthreshold.option.percent = % +label.errorthreshold.option.count = Count +label.targetUpdateStatus.unknown = Unknown +label.targetUpdateStatus.in_sync = In Sync +label.targetUpdateStatus.pending = Pending +label.targetUpdateStatus.error = Error +label.targetUpdateStatus.registered = Registered + # Checkbox label prefix with - checkbox checkbox.dist.migration.required = Required Migration Step : @@ -279,6 +287,7 @@ tooltip.metadata.icon = Manage Metadata.. tooltip.next.maintenance.window = next on {0} tooltip.target.attributes.update.request = Request attributes update tooltip.target.attributes.update.requested = Update already requested +tooltip.documentation.link=Documentation #rollout action tooltip.rollout.run = Run @@ -313,7 +322,7 @@ message.dist.pending.action = Target {0} is already assigned with distribution message.empty.target.tags= No Tags Created message.empty.disttype.tags = No Distribution type tags created message.select.row = Please select a row to drag -message.error = Unknown error occured during the operation. Please contact administrator +message.error = Unknown error occurred during the operation. Please contact administrator message.dist.assigned.one = {0} is assigned to {1} message.dist.assigned.many = {0} DistributionSets are assigned to {1} message.dist.unassigned.one = {0} is unassigned from {1} @@ -324,12 +333,12 @@ message.target.unassigned.one = {0} is unassigned from {1} message.target.unassigned.many = {0} Targets are unassigned from {1} message.target.assigned.pending = Some target(s) are already assigned.Pending for action message.cannot.delete = Cannot be deleted -message.check.softwaremodule = Please provide both name and verion! +message.check.softwaremodule = Please provide both name and version! message.duplicate.softwaremodule = {0} : {1} already exists! -message.tag.delete = Please unclick the tag {0} before deleting -message.dist.type.check.delete = Please unclick the distribution type {0} before deleting +message.tag.delete = Please deselect the tag {0} before deleting +message.dist.type.check.delete = Please deselect the distribution type {0} before deleting message.cannot.delete.default.dstype = Default distribution set type cannot be deleted -message.swmodule.type.check.delete = Please unclick the Software Module type {0} before deleting +message.swmodule.type.check.delete = Please deselect the Software Module type {0} before deleting message.targets.already.deleted = Few Target(s) are already deleted. Pending for action message.dists.already.deleted = Few distribution(s) are already deleted.Pending for action message.target.deleted.pending = Target(s) already deleted.Pending for action