diff --git a/src/main/java/org/olat/ims/qti21/QTI21Service.java b/src/main/java/org/olat/ims/qti21/QTI21Service.java index 9a81461f9d18066f4d20c94856ef2a9ae6f42a30..c1805d56f70e382adb12c4077f60788e11606eea 100644 --- a/src/main/java/org/olat/ims/qti21/QTI21Service.java +++ b/src/main/java/org/olat/ims/qti21/QTI21Service.java @@ -142,6 +142,15 @@ public interface QTI21Service { */ public QTI21DeliveryOptions getDeliveryOptions(RepositoryEntry testEntry); + /** + * Set some extra options for the QTI 2.1 which are not part + * of the standard fomr IMS. + * + * @param testEntry + * @param options + */ + public void setDeliveryOptions(RepositoryEntry testEntry, QTI21DeliveryOptions options); + /** * Check if some user made assessment with this test. * @@ -150,7 +159,6 @@ public interface QTI21Service { */ public boolean isAssessmentTestActivelyUsed(RepositoryEntry testEntry); - public void setDeliveryOptions(RepositoryEntry testEntry, QTI21DeliveryOptions options); public AssessmentTestSession createAssessmentTestSession(Identity identity, String anonymousIdentifier, diff --git a/src/main/java/org/olat/modules/portfolio/Binder.java b/src/main/java/org/olat/modules/portfolio/Binder.java index 93ff204f8c7ee886988138dd4dcefe36c693d921..f29a921917828f22e3d23032381da7300e08fb96 100644 --- a/src/main/java/org/olat/modules/portfolio/Binder.java +++ b/src/main/java/org/olat/modules/portfolio/Binder.java @@ -23,6 +23,7 @@ import java.util.Date; import org.olat.core.id.OLATResourceable; import org.olat.repository.RepositoryEntry; +import org.olat.resource.OLATResource; /** * @@ -62,6 +63,15 @@ public interface Binder extends BinderLight, PortfolioElement, OLATResourceable */ public RepositoryEntry getEntry(); + /** + * This is the shared olat resource between a template and its + * repository entry. Standard binder without an entry in the learn + * resources doesn't have one. + * + * @return + */ + public OLATResource getOlatResource(); + public String getSubIdent(); public Binder getTemplate(); diff --git a/src/main/java/org/olat/modules/portfolio/BinderConfiguration.java b/src/main/java/org/olat/modules/portfolio/BinderConfiguration.java index 247f22c3eb73145a9faa4eb76f3323e9b309471e..9df11f8268149a220072b32668df6e614893f909 100644 --- a/src/main/java/org/olat/modules/portfolio/BinderConfiguration.java +++ b/src/main/java/org/olat/modules/portfolio/BinderConfiguration.java @@ -38,14 +38,16 @@ public class BinderConfiguration { private final boolean assessable; private final boolean timeline; private final boolean shareable; + private final boolean options; public BinderConfiguration(boolean assessable, boolean withScore, boolean withPassed, - boolean timeline, boolean shareable) { + boolean timeline, boolean shareable, boolean options) { this.assessable = assessable; this.withScore = withScore; this.withPassed = withPassed; this.timeline = timeline; this.shareable = shareable; + this.options = options; } public boolean isAssessable() { @@ -68,6 +70,10 @@ public class BinderConfiguration { return shareable; } + public boolean isOptions() { + return options; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -78,23 +84,23 @@ public class BinderConfiguration { } public static BinderConfiguration createBusinessGroupConfig() { - return new BinderConfiguration(false, false, false, true, false); + return new BinderConfiguration(false, false, false, true, false, false); } public static BinderConfiguration createTemplateConfig() { - return new BinderConfiguration(false, false, false, false, false); + return new BinderConfiguration(false, false, false, false, false, true); } public static BinderConfiguration createInvitationConfig() { - return new BinderConfiguration(false, false, false, true, false); + return new BinderConfiguration(false, false, false, true, false, false); } public static BinderConfiguration createMyPagesConfig() { - return new BinderConfiguration(false, false, false, true, true); + return new BinderConfiguration(false, false, false, true, true, false); } public static BinderConfiguration createDeletedPagesConfig() { - return new BinderConfiguration(false, false, false, false, false); + return new BinderConfiguration(false, false, false, false, false, false); } public static BinderConfiguration createConfig(Binder binder) { @@ -123,6 +129,6 @@ public class BinderConfiguration { } else { withPassed = withScore = assessable = false; } - return new BinderConfiguration(assessable, withScore, withPassed, true, true); + return new BinderConfiguration(assessable, withScore, withPassed, true, true, false); } } diff --git a/src/main/java/org/olat/modules/portfolio/BinderDeliveryOptions.java b/src/main/java/org/olat/modules/portfolio/BinderDeliveryOptions.java new file mode 100644 index 0000000000000000000000000000000000000000..96d955bc9e05f53f69cec3686e22f9be57011f14 --- /dev/null +++ b/src/main/java/org/olat/modules/portfolio/BinderDeliveryOptions.java @@ -0,0 +1,45 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.portfolio; + +/** + * + * Initial date: 29.08.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class BinderDeliveryOptions { + + private boolean allowNewEntries; + + public boolean isAllowNewEntries() { + return allowNewEntries; + } + + public void setAllowNewEntries(boolean allowNewEntries) { + this.allowNewEntries = allowNewEntries; + } + + public static BinderDeliveryOptions defaultOptions() { + BinderDeliveryOptions options = new BinderDeliveryOptions(); + options.setAllowNewEntries(false); + return options; + } +} diff --git a/src/main/java/org/olat/modules/portfolio/BinderSecurityCallbackFactory.java b/src/main/java/org/olat/modules/portfolio/BinderSecurityCallbackFactory.java index 5d28f7c8754babab05628522e847515dc343aa19..1ebba6c557d18b69dc335d7993bc25ff831fde80 100644 --- a/src/main/java/org/olat/modules/portfolio/BinderSecurityCallbackFactory.java +++ b/src/main/java/org/olat/modules/portfolio/BinderSecurityCallbackFactory.java @@ -22,6 +22,7 @@ package org.olat.modules.portfolio; import java.util.Collections; import java.util.List; +import org.olat.core.CoreSpringFactory; import org.olat.modules.portfolio.model.AccessRights; import org.olat.repository.model.RepositoryEntrySecurity; @@ -34,11 +35,13 @@ import org.olat.repository.model.RepositoryEntrySecurity; public class BinderSecurityCallbackFactory { public static final BinderSecurityCallback getCallbackForOwnedBinder(Binder binder) { - return new BinderSecurityCallbackImpl(true, binder.getTemplate() != null); + Binder template = binder.getTemplate(); + BinderDeliveryOptions deliveryOptions = getDeliveryOptions(binder); + return new BinderSecurityCallbackImpl(true, template != null, deliveryOptions); } public static final BinderSecurityCallback getCallbackForMyPageList() { - return new BinderSecurityCallbackImpl(true, false); + return new BinderSecurityCallbackImpl(true, false, null); } /** @@ -50,7 +53,7 @@ public class BinderSecurityCallbackFactory { } public static final BinderSecurityCallback getReadOnlyCallback() { - return new BinderSecurityCallbackImpl(false, false); + return new BinderSecurityCallbackImpl(false, false, null); } public static final BinderSecurityCallback getCallbackForTemplate(RepositoryEntrySecurity security) { @@ -58,7 +61,9 @@ public class BinderSecurityCallbackFactory { } public static final BinderSecurityCallback getCallbackForCoach(Binder binder, List<AccessRights> rights) { - return new BinderSecurityCallbackImpl(rights, binder.getTemplate() != null); + Binder template = binder.getTemplate(); + BinderDeliveryOptions deliveryOptions = getDeliveryOptions(binder); + return new BinderSecurityCallbackImpl(rights, template != null, deliveryOptions); } /** @@ -69,12 +74,22 @@ public class BinderSecurityCallbackFactory { return new BinderSecurityCallbackForInvitation(rights); } + private static final BinderDeliveryOptions getDeliveryOptions(Binder binder) { + Binder template = binder.getTemplate(); + BinderDeliveryOptions deliveryOptions = null; + if(template != null) { + deliveryOptions = CoreSpringFactory.getImpl(PortfolioService.class) + .getDeliveryOptions(template.getOlatResource()); + } + return deliveryOptions; + } + /** * If you can see the business group, you can edit and view the binder. * @return */ public static final BinderSecurityCallback getCallbackForBusinessGroup() { - return new BinderSecurityCallbackImpl(true, false); + return new BinderSecurityCallbackImpl(true, false, null); } @@ -175,17 +190,20 @@ public class BinderSecurityCallbackFactory { private final boolean task; private final boolean owner; private final List<AccessRights> rights; + private final BinderDeliveryOptions deliveryOptions; - public BinderSecurityCallbackImpl(boolean owner, boolean task) { + public BinderSecurityCallbackImpl(boolean owner, boolean task, BinderDeliveryOptions deliveryOptions) { this.task = task; this.owner = owner; this.rights = Collections.emptyList(); + this.deliveryOptions = deliveryOptions; } - public BinderSecurityCallbackImpl(List<AccessRights> rights, boolean task) { + public BinderSecurityCallbackImpl(List<AccessRights> rights, boolean task, BinderDeliveryOptions deliveryOptions) { this.owner = false; this.task = task; this.rights = rights; + this.deliveryOptions = deliveryOptions; } @Override @@ -239,12 +257,13 @@ public class BinderSecurityCallbackFactory { @Override public boolean canAddPage(Section section) { if(section == null) { - return owner; + return owner && (deliveryOptions == null || deliveryOptions.isAllowNewEntries()); } if(owner) { return section != null && !SectionStatus.isClosed(section) - && section.getSectionStatus() != SectionStatus.submitted; + && section.getSectionStatus() != SectionStatus.submitted + && (deliveryOptions == null || deliveryOptions.isAllowNewEntries()); } return false; } diff --git a/src/main/java/org/olat/modules/portfolio/PortfolioService.java b/src/main/java/org/olat/modules/portfolio/PortfolioService.java index 6e19fbd2611376a9b0bbb69c409794f7fae19005..c0b6e982051a07da242d9061e17a95bb63ec57af 100644 --- a/src/main/java/org/olat/modules/portfolio/PortfolioService.java +++ b/src/main/java/org/olat/modules/portfolio/PortfolioService.java @@ -46,6 +46,9 @@ import org.olat.resource.OLATResource; * */ public interface PortfolioService { + + public static final String PACKAGE_CONFIG_FILE_NAME = "BinderPackageConfig.xml"; + public Binder createNewBinder(String title, String summary, String imagePath, Identity owner); @@ -61,7 +64,24 @@ public interface PortfolioService { public boolean deleteBinderTemplate(Binder binder, RepositoryEntry templateEntry); - /**S + + /** + * Set some extra options for the template. + * + * @param testEntry + * @return + */ + public BinderDeliveryOptions getDeliveryOptions(OLATResource resource); + + /** + * Set some extra options for the template. + * + * @param testEntry + * @param options + */ + public void setDeliveryOptions(OLATResource resource, BinderDeliveryOptions options); + + /** * Add an assignment to a section. * * @param title @@ -167,6 +187,13 @@ public interface PortfolioService { public Binder getBinderByResource(OLATResource resource); + /** + * Retrieve the repository entry of a template. + * @param binder + * @return + */ + public RepositoryEntry getRepositoryEntry(Binder binder); + public Binder getBinderBySection(SectionRef section); /** diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java index 10062de06e60444f8137240196b5e44c84fa304f..e524aa47f691fc94c350570ea06e530dd99f1fd5 100644 --- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java +++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java @@ -20,6 +20,9 @@ package org.olat.modules.portfolio.manager; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; @@ -38,11 +41,14 @@ import org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.xml.XStreamHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentHelper; @@ -50,6 +56,7 @@ import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.PortfolioCourseNode; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.fileresource.FileResourceManager; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; import org.olat.modules.assessment.model.AssessmentEntryStatus; @@ -58,6 +65,7 @@ import org.olat.modules.portfolio.Assignment; import org.olat.modules.portfolio.AssignmentStatus; import org.olat.modules.portfolio.AssignmentType; import org.olat.modules.portfolio.Binder; +import org.olat.modules.portfolio.BinderDeliveryOptions; import org.olat.modules.portfolio.BinderLight; import org.olat.modules.portfolio.BinderRef; import org.olat.modules.portfolio.Category; @@ -99,6 +107,8 @@ import org.olat.resource.OLATResourceManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.thoughtworks.xstream.XStream; + /** * * Initial date: 06.06.2016<br> @@ -108,6 +118,13 @@ import org.springframework.stereotype.Service; @Service public class PortfolioServiceImpl implements PortfolioService { + private static final OLog log = Tracing.createLoggerFor(PortfolioServiceImpl.class); + + private static XStream configXstream = XStreamHelper.createXStreamInstance(); + static { + configXstream.alias("deliveryOptions", BinderDeliveryOptions.class); + } + @Autowired private PageDAO pageDao; @Autowired @@ -211,6 +228,42 @@ public class PortfolioServiceImpl implements PortfolioService { int deletedRows = binderDao.deleteBinderTemplate(binder); return deletedRows > 0; } + + @Override + public BinderDeliveryOptions getDeliveryOptions(OLATResource resource) { + FileResourceManager frm = FileResourceManager.getInstance(); + File reFolder = frm.getFileResourceRoot(resource); + File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME); + + BinderDeliveryOptions config; + if(configXml.exists()) { + config = (BinderDeliveryOptions)configXstream.fromXML(configXml); + } else { + //set default config + config = BinderDeliveryOptions.defaultOptions(); + setDeliveryOptions(resource, config); + } + return config; + } + + @Override + public void setDeliveryOptions(OLATResource resource, BinderDeliveryOptions options) { + FileResourceManager frm = FileResourceManager.getInstance(); + File reFolder = frm.getFileResourceRoot(resource); + File configXml = new File(reFolder, PACKAGE_CONFIG_FILE_NAME); + if(options == null) { + if(configXml.exists()) { + configXml.delete(); + } + } else { + try (OutputStream out = new FileOutputStream(configXml)) { + configXstream.toXML(options, out); + } catch (IOException e) { + log.error("", e); + } + } + } + @Override public Assignment addAssignment(String title, String summary, String content, AssignmentType type, @@ -375,6 +428,13 @@ public class PortfolioServiceImpl implements PortfolioService { return binderDao.loadByResource(resource); } + @Override + public RepositoryEntry getRepositoryEntry(Binder binder) { + OLATResource resource = ((BinderImpl)binder).getOlatResource(); + Long resourceKey = resource.getKey(); + return repositoryService.loadByResourceKey(resourceKey); + } + @Override public Binder getBinderBySection(SectionRef section) { return binderDao.loadBySection(section); diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java index eacd95cc0540b883262c8cec56df30dc60757db4..3ae402832a3d9bd26f9ef82815de7828098095ba 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/BinderController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderController.java @@ -57,7 +57,7 @@ import org.olat.modules.portfolio.ui.event.SectionSelectionEvent; */ public class BinderController extends BasicController implements TooledController, Activateable2 { - private Link assessmentLink, publishLink; + private Link assessmentLink, publishLink, optionsLink; private final Link overviewLink, entriesLink, historyLink; private final ButtonGroupComponent segmentButtonsCmp; private final TooledStackedPanel stackPanel; @@ -66,6 +66,7 @@ public class BinderController extends BasicController implements TooledControlle private HistoryController historyCtrl; private PublishController publishCtrl; + private BinderDeliveryOptionsController optionsCtrl; private BinderPageListController entriesCtrl; private TableOfContentController overviewCtrl; private BinderAssessmentController assessmentCtrl; @@ -97,6 +98,10 @@ public class BinderController extends BasicController implements TooledControlle assessmentLink = LinkFactory.createLink("portfolio.assessment", getTranslator(), this); segmentButtonsCmp.addButton(assessmentLink, false); } + if(config.isOptions()) { + optionsLink = LinkFactory.createLink("portfolio.template.options", getTranslator(), this); + segmentButtonsCmp.addButton(optionsLink, false); + } mainPanel = putInitialPanel(new SimpleStackedPanel("portfolioSegments")); mainPanel.setContent(new Panel("empty")); @@ -151,6 +156,8 @@ public class BinderController extends BasicController implements TooledControlle doOpenHistory(ureq); } else if("Toc".equalsIgnoreCase(resName)) { doOpenOverview(ureq); + } else if("Options".equalsIgnoreCase(resName)) { + doOpenOptions(ureq); } } @@ -187,6 +194,8 @@ public class BinderController extends BasicController implements TooledControlle doOpenAssessment(ureq); } else if(historyLink == source) { doOpenHistory(ureq); + } else if(optionsLink == source) { + doOpenOptions(ureq); } else if(stackPanel == source) { if(event instanceof PopEvent) { if(stackPanel.getLastController() == this) { @@ -263,4 +272,15 @@ public class BinderController extends BasicController implements TooledControlle segmentButtonsCmp.setSelectedButton(historyLink); return historyCtrl; } -} + + private void doOpenOptions(UserRequest ureq) { + OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Options", 0l); + WindowControl swControl = addToHistory(ureq, bindersOres, null); + optionsCtrl = new BinderDeliveryOptionsController(ureq, swControl, binder); + listenTo(optionsCtrl); + + popUpToBinderController(ureq); + stackPanel.pushController(translate("portfolio.template.options"), optionsCtrl); + segmentButtonsCmp.setSelectedButton(optionsLink); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderDeliveryOptionsController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderDeliveryOptionsController.java new file mode 100644 index 0000000000000000000000000000000000000000..5022692a897107bc1e3a17b2d84d94efb1b87e1a --- /dev/null +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderDeliveryOptionsController.java @@ -0,0 +1,87 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.portfolio.ui; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.modules.portfolio.Binder; +import org.olat.modules.portfolio.BinderDeliveryOptions; +import org.olat.modules.portfolio.PortfolioService; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 29.08.2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class BinderDeliveryOptionsController extends FormBasicController { + + private static final String[] onKeys = new String[] { "on" }; + private static final String[] onValues = new String[] { "" }; + + private MultipleSelectionElement newEntriesEl; + + private final Binder binder; + private final BinderDeliveryOptions deliveryOptions; + + @Autowired + private PortfolioService portfolioService; + + + public BinderDeliveryOptionsController(UserRequest ureq, WindowControl wControl, Binder binder) { + super(ureq, wControl); + + this.binder = binder; + deliveryOptions = portfolioService.getDeliveryOptions(binder.getOlatResource()); + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + newEntriesEl = uifactory.addCheckboxesHorizontal("canAddEntries", "allow.new.entries", formLayout, onKeys, onValues); + if(deliveryOptions.isAllowNewEntries()) { + newEntriesEl.select(onKeys[0], true); + } + + FormLayoutContainer buttonsLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonsLayout.setRootForm(mainForm); + formLayout.add(buttonsLayout); + uifactory.addFormSubmitButton("save", buttonsLayout); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formOK(UserRequest ureq) { + boolean allowNewEntries = newEntriesEl.isAtLeastSelected(1); + deliveryOptions.setAllowNewEntries(allowNewEntries); + portfolioService.setDeliveryOptions(binder.getOlatResource(), deliveryOptions); + } +} diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties index e15f07da4b2a2e95dd4b42ad7fe95dfc1ecdc5c3..ac385a45603317603184d93aaa900b866cabaf74 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties @@ -20,6 +20,7 @@ add.media=Media hinzuf\u00FCgen add.member=Mitglied hinzuf\u00FCgen add.text=Text hinzuf\u00FCgen add.video=Video hinzuf\u00FCgen +allow.new.entries=Benutzer d\u00FCrfen neue Eintr\u00E4ge erstellen artefact.EfficiencyStatement=Leistungnachweis artefact.FileResource.BLOG=Blog Eintrag artefact.FileResource.WIKI=Wikiseite @@ -212,6 +213,7 @@ portfolio.personal.menu.title=Portfolio 2.0 portfolio.personal.menu.title.alt=$\:portfolio.personal.menu.title portfolio.publish=Freigabe portfolio.root.breadcrump=Portfolio +portfolio.template.options=Optionen portfoliotask=Portfolioaufgabe portfoliotask.none=Keine publication.title=Ver\u00F6ffentlichungstitel diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties index ff87a8630f347b607c8a607ecf5eaafaeae503ab..cd131ab9a8df056de2b93f532831ece3c0517efa 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties @@ -20,6 +20,7 @@ add.media=Add media add.member=Add member add.text=Add text add.video=Add video +allow.new.entries=Users are allowed to create new entries artefact.EfficiencyStatement=Efficiency statement artefact.FileResource.BLOG=Blog entry artefact.FileResource.WIKI=Wiki page @@ -212,6 +213,7 @@ portfolio.personal.menu.title=Portfolio 2.0 portfolio.personal.menu.title.alt=$\:portfolio.personal.menu.title portfolio.publish=Publish portfolio.root.breadcrump=Portfolio +portfolio.template.options=Options portfoliotask=Portfolio Task portfoliotask.none=None publication.title=Publication title diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties index 42dc724cb331d4fefc2403c069148b1bb6369902..d6c00f975e3a80eeef845d9dcf6a3de27725407f 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties @@ -20,6 +20,7 @@ add.media=Ajouter un \u00E9l\u00E9ment multim\u00E9dia add.member=Ajouter un membre add.text=Ajouter un texte add.video=Ajouter une vid\u00E9o +allow.new.entries=Les utilisateurs sont autoris\u00E9s à cr\u00E9er des nouvelles contributions artefact.EfficiencyStatement=Attestation de performance artefact.FileResource.BLOG=Billet d'un blogue artefact.FileResource.WIKI=Page wiki @@ -212,6 +213,7 @@ portfolio.personal.menu.title=Portfolio 2.0 portfolio.personal.menu.title.alt=$\:portfolio.personal.menu.title portfolio.publish=Publier portfolio.root.breadcrump=Portfolio +portfolio.template.options=Options portfoliotask=Devoir portfolio portfoliotask.none=Aucun publication.title=Titre de la publication