CCM NG/ccm-cms: Language Tab of the ContentItemPage now works

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4835 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 152d72dfeb
pull/2/head
jensp 2017-07-03 17:03:07 +00:00
parent bad90bad8d
commit da573ebc2e
10 changed files with 397 additions and 145 deletions

View File

@ -29,7 +29,6 @@ import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.SingleSelectionModel; import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.TabbedPane; import com.arsdigita.bebop.TabbedPane;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
@ -42,7 +41,6 @@ import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.PageLocations; import com.arsdigita.cms.PageLocations;
import com.arsdigita.cms.dispatcher.CMSDispatcher;
import com.arsdigita.cms.dispatcher.CMSPage; import com.arsdigita.cms.dispatcher.CMSPage;
import com.arsdigita.cms.ui.authoring.WizardSelector; import com.arsdigita.cms.ui.authoring.WizardSelector;
import com.arsdigita.cms.ui.item.ContentItemRequestLocal; import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
@ -57,7 +55,6 @@ import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.kernel.ui.ACSObjectSelectionModel; import com.arsdigita.kernel.ui.ACSObjectSelectionModel;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.xml.Document; import com.arsdigita.xml.Document;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
@ -71,9 +68,7 @@ import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentItemVersion; import org.librecms.contentsection.ContentItemVersion;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.dispatcher.ItemResolver;
import java.io.IOException; import java.io.IOException;
import java.util.Locale; import java.util.Locale;
@ -149,7 +144,7 @@ public class ContentItemPage extends CMSPage implements ActionListener {
private final TabbedPane tabbedPane; private final TabbedPane tabbedPane;
private final StringParameter returnUrlParameter; private final StringParameter returnUrlParameter;
private final ItemSelectionModel itemSelectionModel; private final ItemSelectionModel itemSelectionModel;
private final SingleSelectionModel<String> selectedLanguageModel; // private final SingleSelectionModel<String> selectedLanguageModel;
private final ACSObjectSelectionModel typeSelectionModel; private final ACSObjectSelectionModel typeSelectionModel;
private final ContentItemRequestLocal itemRequestLocal; private final ContentItemRequestLocal itemRequestLocal;
private final Summary summaryPane; private final Summary summaryPane;
@ -238,15 +233,14 @@ public class ContentItemPage extends CMSPage implements ActionListener {
itemSelectionModel = new ItemSelectionModel(itemId); itemSelectionModel = new ItemSelectionModel(itemId);
// Add the selected item language as parameter // Add the selected item language as parameter
selectedLanguageParam = new StringParameter( selectedLanguageParam = new StringParameter(SELECTED_LANGUAGE);
SELECTED_LANGUAGE);
selectedLanguageParam.addParameterListener( selectedLanguageParam.addParameterListener(
new NotNullValidationListener(SELECTED_LANGUAGE)); new NotNullValidationListener(SELECTED_LANGUAGE));
addGlobalStateParam(selectedLanguageParam); addGlobalStateParam(selectedLanguageParam);
selectedLanguageModel = new ParameterSingleSelectionModel<>( // selectedLanguageModel = new ParameterSingleSelectionModel<>(
selectedLanguageParam); // selectedLanguageParam);
selectedLanguageParam // selectedLanguageParam
.setDefaultValue(KernelConfig.getConfig().getDefaultLanguage()); // .setDefaultValue(KernelConfig.getConfig().getDefaultLanguage());
// Add the content type global state parameter // Add the content type global state parameter
final LongParameter contentType = new LongParameter(CONTENT_TYPE); final LongParameter contentType = new LongParameter(CONTENT_TYPE);
@ -282,7 +276,8 @@ public class ContentItemPage extends CMSPage implements ActionListener {
summaryPane = new Summary(itemSelectionModel); summaryPane = new Summary(itemSelectionModel);
wizardPane = new WizardSelector(itemSelectionModel, typeSelectionModel); wizardPane = new WizardSelector(itemSelectionModel, typeSelectionModel);
languagesPane = new ItemLanguages(itemSelectionModel, languagesPane = new ItemLanguages(itemSelectionModel,
selectedLanguageModel); // selectedLanguageModel,
selectedLanguageParam);
workflowPane = new ItemWorkflowAdminPane(itemId); // Make this use m_item XXX workflowPane = new ItemWorkflowAdminPane(itemId); // Make this use m_item XXX
lifecyclePane = new ItemLifecycleAdminPane(itemRequestLocal); lifecyclePane = new ItemLifecycleAdminPane(itemRequestLocal);
revisionsPane = new ItemRevisionAdminPane(itemRequestLocal); revisionsPane = new ItemRevisionAdminPane(itemRequestLocal);

View File

@ -31,10 +31,9 @@ import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.parameters.StringParameter;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentType;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.ContentItemPage;
@ -43,28 +42,21 @@ import com.arsdigita.cms.ui.authoring.LanguageWidget;
import org.librecms.util.LanguageUtil; import org.librecms.util.LanguageUtil;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.toolbox.ui.LayoutPanel;
import com.arsdigita.toolbox.ui.Section; import com.arsdigita.toolbox.ui.Section;
import com.arsdigita.util.Assert;
import com.arsdigita.util.Pair; import com.arsdigita.util.Pair;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL; import com.arsdigita.web.URL;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowTemplate;
import org.librecms.contentsection.ContentItemL10NManager; import org.librecms.contentsection.ContentItemL10NManager;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.UnexpectedErrorException;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
/** /**
@ -77,23 +69,28 @@ import org.librecms.CmsConstants;
public class ItemLanguages extends LayoutPanel { public class ItemLanguages extends LayoutPanel {
private final ItemSelectionModel selectionModel; private final ItemSelectionModel selectionModel;
private final SingleSelectionModel<String> selectedLanguage; // private final SingleSelectionModel<String> selectedLanguage;
private final LanguageWidget languageWidget; private final LanguageWidget languageWidget;
private final Submit changeSubmit; private final StringParameter selectedLanguageParam;
// private final Submit changeSubmit;
private final Submit createSubmit; private final Submit createSubmit;
/** /**
* Constructs a new <code>ItemLanguages</code>. * Constructs a new <code>ItemLanguages</code>.
* *
* @param selectionModel the {@link ItemSelectionModel} which will supply * @param selectionModel the {@link ItemSelectionModel} which will
* the current item * supply the current item
* @param selectedLanguage {@link SingleSelectionModel} for the selected * @param selectedLanguage {@link SingleSelectionModel} for the
* language. * selected language.
* @param selectedLanguageParam
*/ */
public ItemLanguages(final ItemSelectionModel selectionModel, public ItemLanguages(final ItemSelectionModel selectionModel,
final SingleSelectionModel<String> selectedLanguage) { // final SingleSelectionModel<String> selectedLanguage,
final StringParameter selectedLanguageParam) {
this.selectionModel = selectionModel; this.selectionModel = selectionModel;
this.selectedLanguage = selectedLanguage; // this.selectedLanguage = selectedLanguage;
this.selectedLanguageParam = selectedLanguageParam;
final Section section = new Section(gz("cms.ui.item.languages")); final Section section = new Section(gz("cms.ui.item.languages"));
setBody(section); setBody(section);
@ -102,10 +99,23 @@ public class ItemLanguages extends LayoutPanel {
section.setBody(group); section.setBody(group);
group.setSubject(new ItemLanguagesTable(selectionModel, group.setSubject(new ItemLanguagesTable(selectionModel,
selectedLanguage)); // selectedLanguage,
selectedLanguageParam));
final Form form = new Form("newLanguage", new BoxPanel( final Form form = new Form("newLanguage", new BoxPanel(
BoxPanel.HORIZONTAL)); BoxPanel.HORIZONTAL)) {
@Override
public boolean isVisible(final PageState state) {
final ContentItem item = selectionModel.getSelectedItem(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemL10NManager l10NManager = cdiUtil.findBean(
ContentItemL10NManager.class);
return !l10NManager.creatableLocales(item).isEmpty();
}
};
group.addAction(form); group.addAction(form);
form.setRedirecting(true); form.setRedirecting(true);
@ -121,12 +131,12 @@ public class ItemLanguages extends LayoutPanel {
try { try {
languageWidget.addPrintListener(new OptionPrinter()); languageWidget.addPrintListener(new OptionPrinter());
} catch (TooManyListenersException ex) { } catch (TooManyListenersException ex) {
throw new UncheckedWrapperException(ex); throw new UnexpectedErrorException(ex);
} }
form.add(languageWidget); form.add(languageWidget);
changeSubmit = new Submit("change", gz("cms.ui.item.language.change")); // changeSubmit = new Submit("change", gz("cms.ui.item.language.change"));
form.add(changeSubmit); // form.add(changeSubmit);
createSubmit = new Submit("create", gz("cms.ui.item.language.add")); createSubmit = new Submit("create", gz("cms.ui.item.language.add"));
form.add(createSubmit); form.add(createSubmit);
form.addProcessListener(new ProcessListener()); form.addProcessListener(new ProcessListener());
@ -140,7 +150,8 @@ public class ItemLanguages extends LayoutPanel {
@Override @Override
public final void prepare(final PrintEvent event) { public final void prepare(final PrintEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final OptionGroup optionGroup = (OptionGroup) event.getTarget(); final OptionGroup target = (OptionGroup) event.getTarget();
target.clearOptions();
final ContentItem item = selectionModel.getSelectedItem(state); final ContentItem item = selectionModel.getSelectedItem(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
@ -153,15 +164,15 @@ public class ItemLanguages extends LayoutPanel {
item).stream() item).stream()
.map(locale -> locale.toString()) .map(locale -> locale.toString())
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<Pair> languages = languageUtil.convertToG11N( final List<Pair> languages = languageUtil
creatableLangs); .convertToG11N(creatableLangs);
for (final Pair pair : languages) { for (final Pair pair : languages) {
final String langCode = (String) pair.getKey(); final String langCode = (String) pair.getKey();
final GlobalizedMessage langName final GlobalizedMessage langName
= (GlobalizedMessage) pair = (GlobalizedMessage) pair
.getValue(); .getValue();
optionGroup.addOption(new Option(langCode, new Label(langName))); target.addOption(new Option(langCode, new Label(langName)));
} }
} }
@ -179,32 +190,27 @@ public class ItemLanguages extends LayoutPanel {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final String lang = (String) languageWidget.getValue(state); final String language = (String) languageWidget.getValue(state);
final ContentItem item = (ContentItem) selectionModel final ContentItem item = selectionModel.getSelectedItem(state);
.getSelectedItem(state);
final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final String name = item.getName().getValue(defaultLocale);
if (createSubmit.isSelected(state)) { if (createSubmit.isSelected(state)) {
final ContentSection section = item.getContentType().
getContentSection();
Assert.exists(section, ContentSection.class); final ItemLanguagesController controller = cdiUtil
.findBean(ItemLanguagesController.class);
final ContentItemL10NManager l10NManager = cdiUtil.findBean( controller.addLanguage(item, language);
ContentItemL10NManager.class);
l10NManager.addLanguage(item, new Locale(lang));
// redirect to ContentItemPage.AUTHORING_TAB of the new instance // redirect to ContentItemPage.AUTHORING_TAB of the new instance
state.setValue(selectedLanguageParam, language);
final String langParam = String
.format("&%s=%s",
ContentItemPage.SELECTED_LANGUAGE,
language);
final String target = String.join( final String target = String.join(
"", URL.getDispatcherPath(), "",
ContentItemPage.getItemURL(item, URL.getDispatcherPath(),
ContentItemPage.AUTHORING_TAB)); controller.getItemEditUrl(item),
langParam);
throw new RedirectSignal(target, true); throw new RedirectSignal(target, true);
} }

View File

@ -19,6 +19,7 @@
package com.arsdigita.cms.ui.item; package com.arsdigita.cms.ui.item;
import com.arsdigita.bebop.table.RowData; import com.arsdigita.bebop.table.RowData;
import com.arsdigita.cms.ui.ContentItemPage;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
@ -41,7 +42,7 @@ import javax.transaction.Transactional;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
public class ItemLanguagesController { class ItemLanguagesController {
@Inject @Inject
private ContentItemRepository itemRepo; private ContentItemRepository itemRepo;
@ -52,27 +53,27 @@ public class ItemLanguagesController {
@Inject @Inject
private GlobalizationHelper globalizationHelper; private GlobalizationHelper globalizationHelper;
public List<RowData<String>> retrieveLanguageVariants(final ContentItem item) { protected List<RowData<String>> retrieveLanguageVariants(
final ContentItem item) {
return retrieveLanguageVariants(item.getObjectId()); return retrieveLanguageVariants(item.getObjectId());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public List<RowData<String>> retrieveLanguageVariants(final long itemId) { protected List<RowData<String>> retrieveLanguageVariants(final long itemId) {
final Optional<ContentItem> item = itemRepo.findById(itemId);
if (!item.isPresent()) { final ContentItem item = itemRepo
throw new IllegalArgumentException(String.format( .findById(itemId)
"No content item with id %d found.", itemId)); .orElseThrow(() -> new IllegalArgumentException(String.format(
} "No ContentItem with ID %d in the database.", itemId)));
final List<Locale> availableLangs = new ArrayList<>(itemL10NManager final List<Locale> availableLangs = new ArrayList<>(itemL10NManager
.availableLanguages(item.get())); .availableLanguages(item));
availableLangs.sort((locale1, locale2) -> { availableLangs.sort((locale1, locale2) -> {
return locale1.toString().compareTo(locale2.toString()); return locale1.toString().compareTo(locale2.toString());
}); });
return availableLangs.stream() return availableLangs.stream()
.map(lang -> createRow(item.get(), lang)) .map(lang -> createRow(item, lang))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -80,10 +81,61 @@ public class ItemLanguagesController {
final Locale lang) { final Locale lang) {
final RowData<String> row = new RowData<>(2); final RowData<String> row = new RowData<>(2);
row.setRowKey(lang.toString()); row.setRowKey(lang.toString());
row.setColData(0, lang.getDisplayName(globalizationHelper.getNegotiatedLocale())); row.setColData(0, lang.getDisplayName(globalizationHelper
.getNegotiatedLocale()));
row.setColData(1, item.getTitle().getValue(lang)); row.setColData(1, item.getTitle().getValue(lang));
return row; return row;
} }
@Transactional(Transactional.TxType.REQUIRED)
protected int countLanguageVariants(final ContentItem item) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
return itemL10NManager.availableLanguages(contentItem).size();
}
@Transactional(Transactional.TxType.REQUIRED)
protected void addLanguage(final ContentItem item, final String language) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
itemL10NManager.addLanguage(contentItem, new Locale(language));
}
@Transactional(Transactional.TxType.REQUIRED)
protected void removeLanguage(final ContentItem item,
final String language) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
itemL10NManager.removeLanguage(contentItem, new Locale(language));
}
@Transactional(Transactional.TxType.REQUIRED)
protected String getItemEditUrl(final ContentItem item) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
return ContentItemPage.getItemURL(contentItem,
ContentItemPage.AUTHORING_TAB);
}
} }

View File

@ -22,28 +22,29 @@ import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.ControlLink; import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener; import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel; import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.util.LanguageUtil; import org.librecms.util.LanguageUtil;
import java.util.Locale; import java.util.Locale;
/** /**
* Displays a list of all language instances of an item. * Displays a list of all language instances of an item.
* *
@ -55,7 +56,8 @@ public class ItemLanguagesTable extends Table {
public static final int COL_DELETE = 2; public static final int COL_DELETE = 2;
private final ItemSelectionModel itemSelectionModel; private final ItemSelectionModel itemSelectionModel;
private final SingleSelectionModel<String> langSelectionModel; // private final SingleSelectionModel<String> langSelectionModel;
private final StringParameter selectedLanguageParam;
// private final TableColumn deleteColumn; // private final TableColumn deleteColumn;
/** /**
@ -68,12 +70,14 @@ public class ItemLanguagesTable extends Table {
* selected language. * selected language.
*/ */
public ItemLanguagesTable(final ItemSelectionModel itemSelectionModel, public ItemLanguagesTable(final ItemSelectionModel itemSelectionModel,
final SingleSelectionModel<String> langSelectionModel) { // final SingleSelectionModel<String> langSelectionModel,
final StringParameter selectedLanguageParam) {
super(); super();
setIdAttr("item_languages_table"); setIdAttr("item_languages_table");
this.itemSelectionModel = itemSelectionModel; this.itemSelectionModel = itemSelectionModel;
this.langSelectionModel = langSelectionModel; // this.langSelectionModel = langSelectionModel;
this.selectedLanguageParam = selectedLanguageParam;
setModelBuilder(new ItemLanguagesTableModelBuilder(itemSelectionModel)); setModelBuilder(new ItemLanguagesTableModelBuilder(itemSelectionModel));
final TableColumnModel columnModel = getColumnModel(); final TableColumnModel columnModel = getColumnModel();
@ -102,6 +106,8 @@ public class ItemLanguagesTable extends Table {
final int column) { final int column) {
final Locale locale = new Locale((String) value); final Locale locale = new Locale((String) value);
final String selectedLanguage = (String) state
.getValue(selectedLanguageParam);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LanguageUtil langUtil = cdiUtil.findBean( final LanguageUtil langUtil = cdiUtil.findBean(
@ -109,20 +115,25 @@ public class ItemLanguagesTable extends Table {
final Label label = new Label(langUtil.getLangFull(locale)); final Label label = new Label(langUtil.getLangFull(locale));
if (langSelectionModel.getSelectedKey(state).equals(key)) { // if (langSelectionModel.getSelectedKey(state).equals(key)) {
if (selectedLanguage.equals(key)) {
// Current variant, no link // Current variant, no link
return label; return label;
} else { } else {
final String target = ContentItemPage.getItemURL( return new ControlLink(label);
itemSelectionModel.getSelectedItem(state),
ContentItemPage.AUTHORING_TAB); // final String target = ContentItemPage.getItemURL(
return new Link(label, target); // itemSelectionModel.getSelectedItem(state),
// ContentItemPage.AUTHORING_TAB);
// return new Link(label, target);
} }
} }
} }
); );
columnModel.get(COL_DELETE).setCellRenderer(new TableCellRenderer() { columnModel.get(COL_DELETE)
.setCellRenderer(new TableCellRenderer() {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
@ -131,48 +142,87 @@ public class ItemLanguagesTable extends Table {
final boolean isSelected, final boolean isSelected,
final Object key, final Object key,
final int row, final int row,
final int column) { final int column
) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ItemLanguagesController controller = cdiUtil
.findBean(ItemLanguagesController.class);
final ContentItem item = itemSelectionModel
.getSelectedItem(state);
if (key
.equals(KernelConfig.getConfig().getDefaultLanguage())
|| controller.countLanguageVariants(item) <= 1) {
return new Text(" ");
} else {
final ControlLink link = new ControlLink(new Label( final ControlLink link = new ControlLink(new Label(
new GlobalizedMessage("cms.ui.delete", new GlobalizedMessage("cms.ui.delete",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
link.setConfirmation(new GlobalizedMessage( link.setConfirmation(new GlobalizedMessage(
"cms.ui.delete.confirmation", CmsConstants.CMS_BUNDLE)); "cms.ui.delete.confirmation",
CmsConstants.CMS_BUNDLE));
return link; return link;
} }
}
}); }
);
addTableActionListener(new TableActionListener() { addTableActionListener(
new TableActionListener() {
@Override @Override
public void cellSelected(final TableActionEvent event) public void cellSelected(final TableActionEvent event)
throws FormProcessException { throws FormProcessException {
if (event.getColumn() != COL_DELETE) {
//Nothing to do
return;
}
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final ContentItem item = itemSelectionModel final ContentItem item = itemSelectionModel
.getSelectedItem(state); .getSelectedItem(state);
final String selectedLang = (String) event.getRowKey(); final String selectedLanguage = (String) event.getRowKey();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemL10NManager l10nManager = cdiUtil.findBean( final ItemLanguagesController controller = cdiUtil
ContentItemL10NManager.class); .findBean(ItemLanguagesController.class);
l10nManager.removeLanguage(item, new Locale(selectedLang)); switch (event.getColumn()) {
case COL_LANGUAGE: {
state.setValue(selectedLanguageParam, selectedLanguage);
final String langParam = String
.format("&%s=%s",
ContentItemPage.SELECTED_LANGUAGE,
selectedLanguage);
final String target = String.join(
"",
URL.getDispatcherPath(),
controller.getItemEditUrl(item),
langParam);
throw new RedirectSignal(target, true);
}
case COL_DELETE: {
if (selectedLanguage.equals(state.getValue(
selectedLanguageParam))) {
state.setValue(selectedLanguageParam,
KernelConfig.getConfig()
.getDefaultLanguage());
}
controller.removeLanguage(item, selectedLanguage);
}
default:
//Nothing to do
return;
}
} }
@Override @Override
public void headSelected(final TableActionEvent event) { public void headSelected(final TableActionEvent event
) {
//Nothing //Nothing
} }
}); }
);
} }

View File

@ -359,7 +359,11 @@ public class ContentItemL10NManager {
* set with all locales provided by any of the fields. After that the method * set with all locales provided by any of the fields. After that the method
* will iterate over all {@link LocalizedString} fields and check if the * will iterate over all {@link LocalizedString} fields and check if the
* {@link LocalizedString} has an entry for every language in the set. If * {@link LocalizedString} has an entry for every language in the set. If
* not an entry for the language is added. * not an entry for the language is added. The initial value is taken from
* the variant for default language configured in
* {@link KernelConfig#defaultLanguage}. If no value for the default locale
* exists the value for the first found language from the list of supported
* languages ({@link KernelConfig#supportedLanguages}) is used.
* *
* @param item The item to normalise. The item <strong>must be</strong> the * @param item The item to normalise. The item <strong>must be</strong> the
* <strong>draft version</strong> of the item! If a <em>live version</em> or * <strong>draft version</strong> of the item! If a <em>live version</em> or

View File

@ -8,10 +8,9 @@ ay=Aymara
az=Azerbaijani az=Azerbaijani
ba=Bashkir ba=Bashkir
be=Byelorussian be=Byelorussian
bg=Bulgarian
bh=Bihari bh=Bihari
bi=Bislama bi=Bislama
bn=Bengali;=Bangla bn=Bengali
bo=Tibetan bo=Tibetan
br=Breton br=Breton
ca=Catalan ca=Catalan
@ -20,21 +19,21 @@ cs=Czech
cy=Welsh cy=Welsh
da=Danish da=Danish
de=German de=German
dz=Bhutani dz=Dzongkha (Bhutani)
el=Greek el=Greek
en=English en=English
eo=Esperanto eo=Esperanto
es=Spanish es=Spanish
et=Estonian et=Estonian
eu=Basque eu=Basque
fa=Persian fa=Farsi (Persian)
fi=Finnish fi=Finnish
fj=Fiji fj=Fiji
fo=Faroese fo=Faroese
fr=French fr=French
fy=Frisian fy=Frisian
ga=Irish ga=Irish
gd=Scots=Gaelic gd=Scottish Gaelic
gl=Galician gl=Galician
gn=Guarani gn=Guarani
gu=Gujarati gu=Gujarati
@ -47,17 +46,15 @@ hy=Armenian
ia=Interlingua ia=Interlingua
id=Indonesian id=Indonesian
ie=Interlingue ie=Interlingue
ik=Inupiak ik=Ik
is=Icelandic is=Icelandic
it=Italian it=Italian
iu=Inuktitut iu=Inuktitut
iw=Hebrew
ja=Japanese ja=Japanese
jw=Javanese
ka=Georgian ka=Georgian
kk=Kazakh kk=Kazakh
kl=Greenlandic kl=Kalaallisut (Greenlandic)
km=Cambodian km=Khmer (Cambodian)
kn=Kannada kn=Kannada
ko=Korean ko=Korean
ks=Kashmiri ks=Kashmiri
@ -83,11 +80,11 @@ ne=Nepali
nl=Dutch nl=Dutch
no=Norwegian no=Norwegian
oc=Occitan oc=Occitan
om==Oromo om=Oromo
or=Oriya or=Oriya
pa=Punjabi pa=Punjabi
pl=Polish pl=Polish
ps=Pashto,=Pushto ps=Pashto
pt=Portuguese pt=Portuguese
qu=Quechua qu=Quechua
rm=Rhaeto-Romance rm=Rhaeto-Romance
@ -98,7 +95,6 @@ rw=Kinyarwanda
sa=Sanskrit sa=Sanskrit
sd=Sindhi sd=Sindhi
sg=Sangho sg=Sangho
sh=Serbo-Croatian
si=Sinhalese si=Sinhalese
sk=Slovak sk=Slovak
sl=Slovenian sl=Slovenian
@ -136,6 +132,6 @@ xh=Xhosa
yi=Yiddish yi=Yiddish
yo=Yoruba yo=Yoruba
za=Zhuang za=Zhuang
zh=Chinese zh=Manarin Chinese
zu=Zulu zu=Zulu
--=Undefined --=Undefined

View File

@ -0,0 +1,137 @@
aa=Afar
ab=Abchasisch
af=Afrikaans
am=Amharisch
ar=Arabisch
as=Assamesisch
ay=Aymara
az=Aserbeidschanisch
ba=Baschkirisch
be=Wei\u00dfrussisch
bh=Bihari
bi=Bislama
bn=Bengalisch
bo=Tibetisch
br=Bretonisch
ca=Catalanisch
co=Korsisch
cs=Tschechisch
cy=Walisisch
da=D\u00e4nisch
de=Deutsch
dz=Dzongkha (Bhutanisch)
el=Griechisch
en=Englisch
eo=Esperanto
es=Spanisch
et=Estnisch
eu=Baskisch
fa=Farsi (Persisch)
fi=Finnisch
fj=Fidschi
fo=F\u00e4r\u00f6isch
fr=Franz\u00f6sische
fy=Friesisch
ga=Irisch
gd=Schottisch-g\u00e4lisch
gl=Galicisch
gn=Guarani
gu=Gujarati
ha=Hausa
he=Ivrit (Hebrew)
hi=Hindi
hr=Kroatisch
hu=Ungarisch
hy=Armenisch
ia=Interlingua
id=Indonesisch
ie=Interlingue
ik=Ik
is=Isl\u00e4ndisch
it=Italienisch
iu=Inuktitut
ja=Japanisch
ka=Georgisch
kk=Kasachisch
kl=Kalaallisut (Gr\u00f6nl\u00e4ndisch)
km=Khmer (Kambodschanisch)
kn=Kannada
ko=Koreanisch
ks=Kashmiri
ku=Kurdisch
ky=Kirgisisch
la=Latein
ln=Ling\u00e1la
lo=Laotisch
lt=Litauisch
lv=Lettisch
mg=Malagasy
mi=Maorisch
mk=Mazedonisch
ml=Malayalam
mn=Mongolisch
mo=Moldauische
mr=Marathi
ms=Malaiisch
mt=(Malti) Maltesisch
my=Birmanisch
na=Nauruisch
ne=Nepali
nl=Niederl\u00e4ndisch
no=Norwegisch
oc=Okzitanisch
om=Oromo
or=Oriya
pa=Punjabi
pl=Polnisch
ps=Paschtu
pt=Portugiesisch
qu=Quechua
rm=R\u00e4toromanisch
rn=Kirundi
ro=Rum\u00e4nisch
ru=Russisch
rw=Kinyarwanda
sa=Sanskrit
sd=Sindhi
sg=Sangho
si=Singhalesisch
sk=Slowakisch
sl=Slowenisch
sm=Samoanisch
sn=Shona
so=Somali
sq=Albanisch
sr=Serbisch
ss=Siswati
st=Sesotho
su=Sundanesisch
sv=Schwedisch
sw=Swahili
ta=Tamil
te=Telugu
tg=Tadschikisch
th=Thail\u00e4ndisch
ti=Tigrinya
tk=Turkmenisch
tl=Tagalog
tn=Setswana
to=Tongaische
tr=T\u00fcrkisch
ts=Tsonga
tt=Tatarisch
tw=Twi
ug=Uigurisch
uk=Ukrainisch
ur=Urdu
uz=Usbekisch
vi=Vietnamesisch
vo=Volap\u00fck
wo=Wolof
xh=Xhosa
yi=Jiddisch
yo=Yoruba
za=Zhuang
zh=Mandarin (Chinese)
zu=Zulu
--=Undefined

View File

@ -330,3 +330,7 @@ cms.ui.workflow.task.user.add=Assign user
cms.ui.workflow.task.locked_by=Locked by {0} cms.ui.workflow.task.locked_by=Locked by {0}
cms.ui.workflow.task.locked_by_you=Locked by you cms.ui.workflow.task.locked_by_you=Locked by you
cms.ui.edit=Edit cms.ui.edit=Edit
cms.ui.language.header=Language
cms.ui.language.title=Title
cms.ui.action=Action
cms.ui.item.language.add=Add language

View File

@ -327,3 +327,7 @@ cms.ui.workflow.task.user.add=Benutzer zuordnen
cms.ui.workflow.task.locked_by=Reserviert durch {0} cms.ui.workflow.task.locked_by=Reserviert durch {0}
cms.ui.workflow.task.locked_by_you=Von Ihnen reserviert cms.ui.workflow.task.locked_by_you=Von Ihnen reserviert
cms.ui.edit=Bearbeiten cms.ui.edit=Bearbeiten
cms.ui.language.header=Sprache
cms.ui.language.title=Titel
cms.ui.action=Aktion
cms.ui.item.language.add=Sprache hinzuf\u00fcgen

View File

@ -286,3 +286,7 @@ cms.ui.workflow.task.user.add=Assign user
cms.ui.workflow.task.locked_by=Locked by {0} cms.ui.workflow.task.locked_by=Locked by {0}
cms.ui.workflow.task.locked_by_you=Locked by you cms.ui.workflow.task.locked_by_you=Locked by you
cms.ui.edit=Edit cms.ui.edit=Edit
cms.ui.language.header=Language
cms.ui.language.title=Title
cms.ui.action=Action
cms.ui.item.language.add=Add language