diff --git a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java index 542b6162ca5c4de6be1a3af013d1513848fd5a89..2f45542283321b38308e8d07332bc769e9b2d01b 100644 --- a/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java +++ b/src/main/java/org/olat/commons/info/ui/InfoEditFormController.java @@ -55,6 +55,8 @@ import org.springframework.beans.factory.annotation.Autowired; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class InfoEditFormController extends FormBasicController { + + private static final int MESSAGE_MAX_LENGTH = 32000; private TextElement titleEl; private FileElement attachmentEl; @@ -96,7 +98,7 @@ public class InfoEditFormController extends FormBasicController { messageEl.getEditorConfiguration().enableCharCount(); messageEl.getEditorConfiguration().setPathInStatusBar(true); messageEl.setMandatory(true); - messageEl.setMaxLength(2000); + messageEl.setMaxLength(MESSAGE_MAX_LENGTH); attachmentEl = uifactory.addFileElement(getWindowControl(), "attachment", formLayout); attachmentEl.setDeleteEnabled(true); @@ -140,24 +142,24 @@ public class InfoEditFormController extends FormBasicController { protected boolean validateFormLogic(UserRequest ureq) { titleEl.clearError(); messageEl.clearError(); - boolean allOk = true; + boolean allOk = super.validateFormLogic(ureq); String t = titleEl.getValue(); if(!StringHelper.containsNonWhitespace(t)) { titleEl.setErrorKey("form.legende.mandatory", new String[] {}); - allOk = false; + allOk &= false; } else if (t.length() > 500) { titleEl.setErrorKey("input.toolong", new String[] {"500", Integer.toString(t.length())}); - allOk = false; + allOk &= false; } String m = messageEl.getValue(); if(!StringHelper.containsNonWhitespace(m)) { messageEl.setErrorKey("form.legende.mandatory", new String[] {}); - allOk = false; - } else if (m.length() > 2000) { - messageEl.setErrorKey("input.toolong", new String[] {"2000", Integer.toString(m.length())}); - allOk = false; + allOk &= false; + } else if (m.length() > MESSAGE_MAX_LENGTH) { + messageEl.setErrorKey("input.toolong", new String[] { Integer.toString(MESSAGE_MAX_LENGTH), Integer.toString(m.length()) }); + allOk &= false; } List<ValidationStatus> validation = new ArrayList<>(); @@ -165,7 +167,7 @@ public class InfoEditFormController extends FormBasicController { if(validation.size() > 0) { allOk &= false; } - return allOk & super.validateFormLogic(ureq); + return allOk; } public InfoMessage getInfoMessage() { diff --git a/src/main/java/org/olat/core/commons/controllers/filechooser/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/core/commons/controllers/filechooser/_i18n/LocalStrings_pt_BR.properties index f4d9df9ff82eb353c60702b1efe418eff8579a51..388d9815c1107c0768d931b981cd69793a222e55 100644 --- a/src/main/java/org/olat/core/commons/controllers/filechooser/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/core/commons/controllers/filechooser/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Fri Jan 23 21:55:27 CET 2015 +#Wed Feb 07 18:50:13 CET 2018 button.create=Criar calloutTrigerLink.select.site=Selecionar p\u00E1gina calloutTriggerLink=Escolher arquivo/criar/enviar Link @@ -7,6 +7,7 @@ chooseLink=Escolher arquivo command.create=Criar p\u00E1gina e abrir no editor command.edit=Abrir p\u00E1gina no editor command.preview.label=Selecionar arquivo +command.remove=Remover p\u00E1gina createLink=Criar arquivo error.deleted=O arquivo configurado n\u00E3o existe. Crie o arquivo de novo ou escolha outro arquivo. error.name.empty=Por favor, insira um nome para o arquivo a ser criado diff --git a/src/main/java/org/olat/core/commons/services/analytics/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/core/commons/services/analytics/ui/_i18n/LocalStrings_pt_BR.properties new file mode 100644 index 0000000000000000000000000000000000000000..7b094a392ce60763e720b99a2ca267edf5b2aed1 --- /dev/null +++ b/src/main/java/org/olat/core/commons/services/analytics/ui/_i18n/LocalStrings_pt_BR.properties @@ -0,0 +1,11 @@ +#Wed Feb 07 18:56:56 CET 2018 +admin.menu.title=Estat\u00EDsticas +admin.menu.title.alt=An\u00E1lise do comportamento do usu\u00E1rio +analytics.desc=Selecione um servi\u00E7o de estat\u00EDstica opcional para analisar o comportamento do usu\u00E1rio usando um servidor externo de estat\u00EDstica. +analytics.disabled=Desativar m\u00F3dulo de estat\u00EDstica +analytics.google.desc=Se voc\u00EA possui uma conta do google analytics, voc\u00EA pode configurar seu ID de rastreamento do google para executar dados estat\u00EDsticos detalhados e tempo real em tempo real sobre o uso de sua instala\u00E7\u00E3o do OpenOLAT. +analytics.google.title=Configura\u00E7\u00E3o do Google Analytics +analytics.google.tracking.id=Tracking ID +analytics.privacy=Observe que voc\u00EA, como operador da plataforma, \u00E9 legalmente obrigado a informar seus usu\u00E1rios sobre o uso do Google Analytics. +analytics.service=Servi\u00E7o de Estat\u00EDsticas +analytics.title=M\u00F3dulo de estat\u00EDsticas diff --git a/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties index 7224f9abf3562593fef9c93da37e19ccf890acd8..30bed1f81a77f8b8f128141f594441f36e95e8c6 100644 --- a/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/group/ui/run/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Thu Jan 18 19:11:32 CET 2018 +#Wed Feb 07 21:25:16 CET 2018 businessgroup.contact.bodytext=<p></p>---<p>Ir imediatamente para o grupo "{0}"\: {1}</p> businessgroup.contact.subject=Mensagem para grupo {0} contact.all.coaches=Todos os treinadores (coaches) de grupo diff --git a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_pt_BR.properties index 416277e03a0ed4e350b62618d3147e5336554601..ca92a538f532b7de37cc2c5bd7409a976932a1f0 100644 --- a/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/ims/qti21/questionimport/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Tue Jul 25 22:13:31 CEST 2017 +#Wed Feb 07 18:57:01 CET 2018 download.example=$org.olat.ims.qti.questionimport\:download.example error.at.line=Problema com a linha {0} form.importdata=$org.olat.ims.qti.questionimport\:form.importdata @@ -6,6 +6,8 @@ input.title=$org.olat.ims.qti.questionimport\:input.title item.type.essay=$org.olat.ims.qti.editor\:item.type.essay item.type.fib=$org.olat.ims.qti.editor\:item.type.fib item.type.kprim=$org.olat.ims.qti.editor\:item.type.kprim +item.type.match=$org.olat.ims.qti21.ui.editor\:new.match +item.type.matchdraganddrop=$org.olat.ims.qti21.ui.editor\:new.matchdraganddrop item.type.mc=$org.olat.ims.qti.editor\:item.type.mc item.type.sc=$org.olat.ims.qti.editor\:item.type.sc table.header.points=$org.olat.ims.qti.questionimport\:table.header.points diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties index 9c7b09388bce85d681a13445680438790063f2ae..9c612202807f21007cb3d0f28343a112acbaeeb2 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Mon Dec 18 21:56:43 CET 2017 +#Wed Feb 07 18:57:28 CET 2018 actualPoints=$org.olat.modules.iq\:actualPoints admin.12.title=Configura\u00E7\u00F5es QTI 1.2 admin.menu.title=QTI 2.1 @@ -177,6 +177,7 @@ questions=N\u00FAmero de perguntas no teste reset.data=Resetar dados reset.test.data.acknowledge=Eu entendo que os dados ser\u00E3o exclu\u00EDdos definitivamente. reset.test.data.text=Deseja realmente redefinir os dados de avalia\u00E7\u00E3o do teste? Os resultados de <strong>{0} usu\u00E1rios</strong> ser\u00E3o exclu\u00EDdos definitivamente. +reset.test.data.text.identity=Voc\u00EA realmente deseja redefinir os dados de avalia\u00E7\u00E3o do teste? Os resultados de <strong>"{0}"</strong> ser\u00E3o definitivamente exclu\u00EDdos. reset.test.data.text.ref=Voc\u00EA n\u00E3o pode excluir todos os dados deste teste porque \u00E9 referenciado pelos seguintes recursos "{0}". reset.test.data.title=Redefinir dados do teste response=Resposta diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties index c585c02be3b9d279134dba8ef7ddafe9d54d3c8e..37dc6454065aa946abb69194fc9bae62acb2f335 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/ims/qti21/ui/editor/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Thu Nov 23 16:55:48 CET 2017 +#Wed Feb 07 18:58:12 CET 2018 MULTIPLE=M\u00FAltipla escolha SINGLE=Escolha \u00FAnica add=Adicionar @@ -17,6 +17,8 @@ change.elements=Edi\u00E7\u00E3o convert=Converter convert.alien=Converter convert.to=Converter para\: +copy.at=Copiado em +copy.qpool.question=fa\u00E7a uma c\u00F3pia e edite correct.answers=Correto cut.value=Cortar valor delete=Excluir @@ -134,6 +136,7 @@ form.match=Combine form.metadata=Metadados form.metadata.description=Descri\u00E7\u00E3o form.metadata.title=T\u00EDtulo +form.pool=Banco de perguntas form.score=Pontua\u00E7\u00E3o form.score.answer.correct=Correto form.score.answer.points=Pontos @@ -156,6 +159,8 @@ form.testPart.navigationMode.linear=Linear form.testPart.navigationMode.nonlinear=N\u00E3o linear form.unkown=Desconhecido form.upload=Upload de arquivo +general.identifier=$org.olat.modules.qpool.ui\:general.identifier +general.master.identifier=$org.olat.modules.qpool.ui\:general.master.identifier hotspot.layout=Layout hotspot.layout.green=Verde hotspot.layout.inverted=Invertido @@ -175,6 +180,7 @@ item.session.control.attempts=Tentativas item.session.control.attempts.hint=Esta limita\u00E7\u00E3o das tentativas s\u00F3 \u00E9 v\u00E1lida para as partes n\u00E3o para todo o teste. As tentativas para todo o teste podem ser limitadas em "Op\u00E7\u00F5es". item.session.control.show.solution=Mostrar solu\u00E7\u00E3o item.session.control.show.solution.hint=Solu\u00E7\u00E3o \u00E9 mostrada na revis\u00E3o tamb\u00E9m. +lifecycle.version=$org.olat.modules.qpool.ui\:lifecycle.version math.operator.bigger=> math.operator.biggerEquals=>\= math.operator.equals=\= @@ -211,6 +217,7 @@ new.testpart=Parte do teste new.upload=Enviar arquivo preview=Amostra preview.solution=Amostra de solu\u00E7\u00E3o +rights.owners=$org.olat.modules.qpool.ui\:rights.owners time.limit.max=Tempo limite (minutos) title.add=$org.olat.ims.qti.editor\:title.add tools.change.copy=$org.olat.ims.qti.editor\:tools.change.copy @@ -232,6 +239,7 @@ warning.atleastone=Por favor, escolha pelo menos um elemento. warning.atleastonesection=A se\u00E7\u00E3o n\u00E3o pode ser exclu\u00EDda. Um teste ou uma parte de teste deve conter pelo menos uma se\u00E7\u00E3o. warning.conversion.list=Foram encontradas algumas incompatibilidades\: warning.conversion.standard=Existe o risco de perda de dados ap\u00F3s a convers\u00E3o, mas n\u00E3o foram encontradas incompatibilidades flagrantes. +warning.copy.from.pool=A quest\u00E3o foi copiada do banco de perguntas. Voc\u00EA pode encontrar a pergunta original sob o ID mestre. warning.custom.operator=Esta quest\u00E3o cont\u00E9m uma extens\u00E3o espec\u00EDfica do criador que atualmente n\u00E3o \u00E9 suportada pelo OpenOLAT. warning.feedback.cutvalue=O feedback \u00E9 baseado no valor de corte. Voc\u00EA precisa defini-lo primeiro. warning.in.use=O recurso j\u00E1 \u00E9 usado para fins de avalia\u00E7\u00E3o. A edi\u00E7\u00E3o \u00E9 limitada. diff --git a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_pt_BR.properties index c013cb4be75e33461584b6a7238b2e64eb2b1938..bf4b33b957104af0988ae862738fe5dde743ee93 100644 --- a/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/assessment/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Tue Nov 22 12:51:52 CET 2016 +#Wed Feb 07 18:58:59 CET 2018 assessment.status.done=avaliado assessment.status.inProgress=Iniciado assessment.status.inReview=Para revisar @@ -24,9 +24,11 @@ filter.passed=Aprovado index.introduction=Avalie os participantes deste recurso did\u00E1tico usando sua ferramenta de avalia\u00E7\u00E3o. Isso permite-lhe acessar e modificar os resultados dos testes. reopen=Reabrir para avalia\u00E7\u00E3o review=Revis\u00E3o +run.ended=Conclu\u00EDdo save.done=Salvar e definir status como "feito" statistics.small.overview=Vis\u00E3o geral das estat\u00EDsticas table.header.assessmentStatus=Status +table.header.completion=Conclus\u00E3o table.header.elements.toReview=Para revisar table.header.name=Usu\u00E1rio table.header.numOfInitialLaunch=Recurso aberto pelo menos uma vez diff --git a/src/main/java/org/olat/modules/docpool/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/docpool/ui/_i18n/LocalStrings_pt_BR.properties index 344f17fbb2ee9065ece5f5b21533349b7d6c07ac..1196330cefa00afba532bd6c37bbc1c020e02b0a 100644 --- a/src/main/java/org/olat/modules/docpool/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/docpool/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Thu Nov 23 17:53:39 CET 2017 +#Wed Feb 07 19:00:18 CET 2018 admin.description=O reservat\u00F3rio (pool) de documentos oferece uma biblioteca de documentos com uma estrutura autom\u00E1tica baseada em taxonomia e compet\u00EAncias. admin.menu.title=Reservat\u00F3rio de documentos admin.menu.title.alt=Reservat\u00F3rio de documentos @@ -34,3 +34,4 @@ teach.can.read.parent.levels.explain.1=Permitir acesso de leitura a teach.can.read.parent.levels.explain.2=n\u00EDveis acima teach.can.write=Permitir acesso de grava\u00E7\u00E3o teach.competence=Compet\u00EAncia do professor +warning.taxonomy.index.emtpy=A p\u00E1gina de informa\u00E7\u00F5es do "reservat\u00F3rio" de documentos n\u00E3o foi configurada corretamente. Pergunte ao administrador do sistema para adicionar uma p\u00E1gina de informa\u00E7\u00F5es na <strong>administra\u00E7\u00E3o do reservat\u00F3rio de documentos</strong>. diff --git a/src/main/java/org/olat/modules/gotomeeting/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/gotomeeting/ui/_i18n/LocalStrings_pt_BR.properties index ea71db01cc30b7f04522e1cd7e5357c31522f5a0..9d474bae8828fa12dd8b7e719496bcdc2465019c 100644 --- a/src/main/java/org/olat/modules/gotomeeting/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/gotomeeting/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Mon Dec 18 21:57:21 CET 2017 +#Wed Feb 07 19:00:20 CET 2018 add.my.account=Eu tenho uma conta add.organizer=Adicionar um novo organizador add.training=Adicionar novo treinamento diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_pt_BR.properties index 344e09571f2b171ecb77251f8af6b224cc73ff0e..e5cfb37910fda43fab351c48906d52b003d1ab47 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Tue Sep 26 23:33:17 CEST 2017 +#Wed Feb 07 20:56:36 CET 2018 access=Acesso access.binder=As pessoas abaixo t\u00EAm acesso \u00E0 carteira do portf\u00F3lio access.rights=Adicionar direitos de acesso @@ -72,6 +72,7 @@ binder.num.sections.pages={0} se\u00E7\u00F5es com um total de {1} entradas binder.status=Status binder.title=Pasta do portf\u00F3lio {0} binders=Pastas (liga\u00E7\u00F5es) +bookmark=Marcar como favorito categories=Categorias categories.add=Adicionar categorias categories.hint=Insira a categoria do texto e pressione "Enter" para criar a categoria desejada. @@ -91,6 +92,8 @@ comment.several={0} coment\u00E1rios comment.title=Coment\u00E1rios comment.zero=Ainda sem coment\u00E1rios compare.evaluations=Avalia\u00E7\u00E3o +confirm.close.page=Deseja concluir esta entrada? A entrada \u00E9 exibida como conclu\u00EDda para o aprendiz. +confirm.close.page.other.coaches=As seguintes pessoas tamb\u00E9m t\u00EAm acesso a esta entrada\: confirmation=Confirma\u00E7\u00E3o create.binder=Criar pasta (liga\u00E7\u00E3o) create.empty.binder=Nova pasta vazia @@ -162,6 +165,7 @@ export.page=Exportar p\u00E1gina export.page.onepage=Em p\u00E1gina \u00FAnica export.page.pdf=Exportar p\u00E1gina como PDF fileupload=Imagem teaser +filter.sections.empty=Sem se\u00E7\u00F5es abertas filter.show.all=Mostrar tudo firstName=Primeiro nome go.to.trash=Ir para lixeira @@ -189,6 +193,8 @@ invitation.mail.success=As pessoas convidadas foram notificadas com sucesso via issue=Edi\u00E7\u00E3o language=Idioma lastName=\u00DAltimo nome +leave=Remover +leave.explain=Voc\u00EA realmente deseja remover este fich\u00E1rio da lista? O autor do fich\u00E1rio precisar\u00E1 dar-lhe acesso novamente se quiser visitar novamente. mail=E-mail mail.body=Corpo do Email mail.subject=Assunto do Email @@ -326,6 +332,9 @@ section.up=Subir select.form=Selecione uma pesquisa select.mymap=$org.olat.course.nodes.portfolio\:select.mymap series=S\u00E9ries +shared.binders=Fich\u00E1rios +shared.bookmarks=Favoritos +shared.entries=Entradas / A fazer shared.with.me=Compartilhado comigo shared.with.me.text=Uma lista de todos os itens compartilhados por voc\u00EA. show.help.binder=Ajuda @@ -339,6 +348,9 @@ status.inRevision=$\:status.in.revision status.not.started=n\u00E3o iniciado status.published=publicado status.submitted=enviado +status.user.done=Feito +status.user.inProcess=Processando +status.user.incoming=Novo summary=Resumo summary.placeholder=Breve resumo sobre o conte\u00FAdo table.grading.failed.points=<span class\="o_state o_failed"><i class\="o_icon o_icon_failed"> </i> {0} Ponto(s)</span> @@ -347,14 +359,19 @@ table.grading.passed.points=<span class\="o_state o_passed"><i class\="o_icon o_ table.grading.points={0} Ponto(s) table.header.categories=Categorias table.header.change.status=Status +table.header.closed=Encerrado table.header.collection.date=Coletados em table.header.course=Cursos table.header.course.node=Elemento Curso table.header.date=Data table.header.down=<i class\='o_icon o_icon o_icon-lg o_icon_move_down'> </i> +table.header.draft=$\:status.draft table.header.grading=Coletados em +table.header.inRevision=$\:status.in.revision table.header.key=ID table.header.lastUpdate=\u00DAltima atualiza\u00E7\u00E3o +table.header.mark=<i class\="o_icon o_icon_bookmark_header o_icon-lg" title\="Favorit"> </i> +table.header.new=Novo table.header.numpages=\# Entradas table.header.open=Iniciar table.header.open.sections=Abrir @@ -365,6 +382,8 @@ table.header.score=Pontos table.header.section=Se\u00E7\u00E3o table.header.select.sections=Se\u00E7\u00F5es table.header.status=Status +table.header.status.user=Status-Usu\u00E1rio +table.header.status.viewer=Status table.header.title=T\u00EDtulo table.header.type=Tipo table.header.up=<i class\='o_icon o_icon o_icon-lg o_icon_move_up'> </i> diff --git a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties index 6fd61828b24885715083899acbd5aa3ccd2f19fa..b725f6c9d58eded0f8445c58a36bd172589722eb 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/modules/qpool/ui/_i18n/LocalStrings_pt_BR.properties @@ -1,4 +1,4 @@ -#Thu Nov 23 17:53:58 CET 2017 +#Wed Feb 07 22:18:54 CET 2018 add=+ add.to.list=Adicionar \u00E0 lista admin.configuration.title=Banco de perguntas @@ -9,12 +9,27 @@ author.item=Direitos de autor bulk.change=Alterar metadados bulk.change.description=Aqui voc\u00EA pode mudar em uma \u00FAnica etapa, v\u00E1rios atributos de v\u00E1rias perguntas. classification.taxonomic.path=Assunto caminho +classification.taxonomic.path.incl=Assuntos classification.taxonomy.level=Assunto classification.taxonomy.parents=Caminho +collection.add.to.source=Adicione perguntas \u00E0 lista "{0}" collection.creationDate=Criado em collection.name=Nome +commands=Pergunta +confirm.copy.button=Copiar +confirm.copy.editable=Permitir que outros usu\u00E1rios editem a pergunta +confirm.copy.message=Voc\u00EA realmente quer copiar as perguntas? +confirm.copy.questions=Perguntas +confirm.copy.title=Copiar +confirm.delete.button=Excluir +confirm.delete.confirmation=Excluir todas as perguntas +confirm.delete.confirmation.error=Por favor confirme +confirm.delete.message=Voc\u00EA deseja realmente excluir essas perguntas permanentemente? Elas n\u00E3o podem ser recuperados. +confirm.delete.questions=Perguntas confirm.delete.source=Voc\u00EA realmente deseja excluir esta lista? +confirm.delete.title=Excluir confirm.unshare=Voc\u00EA realmente deseja remover essa quest\u00E3o "{0}"? +convert.editable=Permitir que outros usu\u00E1rios editem a pergunta convert.format=Formato convert.item=Converter convert.item.msg=Deseja converter as {0} quest\u00F5es no seguinte formato? @@ -22,12 +37,16 @@ convert.item.not.possible=Voc\u00EA n\u00E3o selecionou nenhuma pergunta que voc convert.item.successful={0} pergunta(s) convertida(s) com \u00EAxito. convert.item.warning={0} n\u00E3o foi convertida. convert.qti21.hint=Voc\u00EA encontrar\u00E1 informa\u00E7\u00F5es sobre a convers\u00E3o de QTI 1.2 para QTI 2.1 no manual +convert.questions=Perguntas copy=Copiar create.collection.description=D\u00EA um nome \u00E0 sua lista. create.list=Criar lista create.pool=Criar reservat\u00F3rio create.success=1 pergunta foi criada. create.test=Criar teste +create.test.format.qti12=QTI 1.2 +create.test.format.qti21=QTI 2.1 +create.test.no.formats=As perguntas selecionadas t\u00EAm o formato errado para criar um teste. delete.collection=Excluir lista delete.item=Excluir delete.pool=Excluir reservat\u00F3rio @@ -43,8 +62,41 @@ educational.learningTime.minute=m educational.learningTime.second=s error.input.toolong=O texto que voc\u00EA digitou \u00E9 muito grande ({1} caracteres). Apenas {1} caracteres s\u00E3o permitidos. error.select.one=Voc\u00EA precisa selecionar pelo menos uma quest\u00E3o. +error.select.one.author=Voc\u00EA precisa selecionar pelo menos uma pergunta, para a qual voc\u00EA pode alterar os autores. +error.select.one.convert=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa converter. +error.select.one.copy=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa copiar. +error.select.one.create.test=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa usar em um teste. +error.select.one.delete=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa excluir. +error.select.one.export=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa exportar. +error.select.one.metadata=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa editar. +error.select.one.remove=Voc\u00EA precisa selecionar pelo menos uma pergunta, que voc\u00EA possa remover. error.wrongFloat=Formato de n\u00FAmero errado. Exemplo\: 1.0, 0.5, 0.2 export.item=Exportar +export.log=Log +export.log.header.additional.informations=$\:general.additional.informations +export.log.header.assessment.type=$\:question.assessmentType +export.log.header.context=$\:educational.context +export.log.header.copyright=$\:rights.copyright +export.log.header.coverage=$\:general.coverage +export.log.header.creator=$\:rights.creator +export.log.header.differentiation=$\:question.differentiation +export.log.header.difficulty=$\:question.difficulty +export.log.header.item.type=$\:question.type +export.log.header.keywords=$\:general.keywords +export.log.header.language=$\:general.language +export.log.header.learningTime=$\:educational.learningTime +export.log.header.log.action=A\u00E7\u00E3o +export.log.header.log.author=Alterado por +export.log.header.log.date=Data +export.log.header.numOfAnswerAlternatives=$\:question.numOfAnswerAlternatives +export.log.header.status=$\:lifecycle.status +export.log.header.stdevDifficulty=$\:question.stdevDifficulty +export.log.header.taxonomic.path=$\:classification.taxonomic.path +export.log.header.title=$\:general.title +export.log.header.topic=$\:general.topic +export.log.header.usage=$\:question.usage +export.log.header.version=$\:lifecycle.version +export.overview.accept=Usado general=Geral general.additional.informations=Adicionar informa\u00E7\u00E3o general.additional.informations.long=Informa\u00E7\u00F5es adicionais @@ -55,6 +107,9 @@ general.key=DBkey general.keywords=Palavras-chave general.language=Idioma general.master.identifier=Master ID +general.taxonomy.level=Assunto +general.taxonomy.path={0} +general.title=T\u00EDtulo general.topic=T\u00F3pico import.excellike.12=Importa\u00E7\u00E3o QTI 1.2 Excel via copia & cola import.excellike.21=Importa\u00E7\u00E3o QTI 2.1 Excel via copia & cola @@ -69,6 +124,7 @@ item.collectioned=Pergunta {0} foi adicionada \u00E0 lista. item.copied={0} pergunta(s) foram copiadas. item.deleted=Pergunta foi exclu\u00EDda item.level=N\u00EDvel +item.numbers.of={0} / {1} item.pooled=Pergunta {0} foi adicionada ao reservat\u00F3rio. item.shared=Pergunta {0} foi compartilhada. item.type.drawing=Desenhando @@ -86,13 +142,18 @@ item.type.unkown=Desconhecido item.type.upload=Enviar arquivo lifecycle.status=Status lifecycle.status.draft=Rascunho +lifecycle.status.endOfLife=Fim da vida lifecycle.status.finalVersion=Final +lifecycle.status.last.modified=Status modificado pela \u00FAltima vez lifecycle.status.review=Revis\u00E3o lifecycle.status.revised=Revisado lifecycle.status.unavailable=Indispon\u00EDvel lifecycle.version=Vers\u00E3o list=Listas +locked.readonly=A pergunta est\u00E1 aberta por '{0}'. Portanto, voc\u00EA n\u00E3o consegue editar a pergunta. +manage.owners=Editar mark=<i class\="o_icon o_icon_bookmark_header o_icon-lg" title\="Favorito"> </i>s +mark.add.to.source=Marque as perguntas como favoritos menu.admin=Administra\u00E7\u00E3o menu.admin.alt=Administra\u00E7\u00E3o menu.admin.levels=N\u00EDvel @@ -100,24 +161,37 @@ menu.admin.levels.alt=N\u00EDvel menu.admin.licenses=Licen\u00E7a menu.admin.licenses.alt=Licen\u00E7a menu.admin.pools=Administra\u00E7\u00E3o do reservat\u00F3rio +menu.admin.review.process=Revisar processo menu.admin.studyfields=Assunto menu.admin.studyfields.alt=Assunto menu.admin.types=Tipo menu.admin.types.alt=Tipo +menu.database=Meu banco de perguntas menu.database.favorit=Meus favoritos menu.database.favorit.alt=Meus Favoritos menu.database.my=Minhas perguntas menu.database.my.alt=Minhas quest\u00F5es +menu.final=Final menu.pools=Reservat\u00F3rio menu.pools.alt=Reservat\u00F3rio menu.pools.main=Cat\u00E1logo menu.pools.main.alt=Cat\u00E1logo +menu.queries=Perguntas +menu.queries.all=Todas perguntas +menu.queries.without.author=Sem autor +menu.queries.without.taxonomy.level=Sem departamento +menu.ratings=Classifica\u00E7\u00F5es +menu.review=Revis\u00E3o menu.share=Compartilhamentos p\u00FAblicos +metadata.hide=Metadados metadatas=Metadados +my.competences=Meus assuntos my.list=Minhas listas my.share=Meus compartilhamentos new.item=Criar pergunta next=Pr\u00F3ximo +numberOfRatings=N\u00FAmero de classifica\u00E7\u00F5es +pool.add.to.source=Adicione perguntas ao reservat\u00F3rio "{0}" pool.key=ID pool.name=Nome pool.owners=Propriet\u00E1rios diff --git a/src/main/java/org/olat/registration/PwChangeController.java b/src/main/java/org/olat/registration/PwChangeController.java index a91bbc2a2b82917a335136bd415b303969ca1249..28c7220b3648f8a8ee9001f3d721ebfbdb3cae04 100644 --- a/src/main/java/org/olat/registration/PwChangeController.java +++ b/src/main/java/org/olat/registration/PwChangeController.java @@ -216,9 +216,8 @@ public class PwChangeController extends BasicController { sendEmail(ureq, identity); } } else { - // no user exists, this is an error in the pwchange page - // REVIEW:pb:2009-11-23:gw, setter should not be necessary. -> check the error already in th emailOrUsernameCtr - emailOrUsernameCtr.setUserNotIdentifiedError(); + logWarn("Failed to identify user in password change workflow: " + emailOrUsername, null); + stepSendEmailConfiration(); } } @@ -256,7 +255,7 @@ public class PwChangeController extends BasicController { String emailAdress = identity.getUser().getProperty(UserConstants.EMAIL, locale); if (!StringHelper.containsNonWhitespace(emailAdress)) { - emailOrUsernameCtr.setUserNotIdentifiedError(); + stepSendEmailConfiration();//for security reason, don't show an error, go simply to the next step return null; } @@ -290,16 +289,20 @@ public class PwChangeController extends BasicController { MailerResult result = mailManager.sendExternMessage(bundle, null, false); if(result.getReturnCode() == MailerResult.OK) { getWindowControl().setInfo(translate("email.sent")); - // prepare next step - wic.setCurStep(2); - myContent.contextPut("text", translate("step2.pw.text")); - emailOrUsernameCtr.getInitialComponent().setVisible(false); - } else { - showError("email.notsent"); } + stepSendEmailConfiration(); return tk; } + /** + * Activate the step 2 + */ + private void stepSendEmailConfiration() { + wic.setCurStep(2); + myContent.contextPut("text", translate("step2.pw.text")); + emailOrUsernameCtr.getInitialComponent().setVisible(false); + } + /** * Look for user in "Person" and "user" tables. Fist search by user name * and if the user cannot be found, search by email address. diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java index 8a122cf3b5f7a1a559cc8ec5b470a3e852a09830..b25d989c073e670b7952752470e2ebd73ce30035 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java @@ -93,7 +93,6 @@ import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.AccessResult; -import org.olat.restapi.security.RestSecurityHelper; import org.olat.restapi.support.ObjectFactory; import org.olat.restapi.support.vo.CourseConfigVO; import org.olat.restapi.support.vo.CourseVO; @@ -276,37 +275,33 @@ public class CourseWebService { @Path("file") @Produces({ "application/zip", MediaType.APPLICATION_OCTET_STREAM }) public Response getRepoFileById(@Context HttpServletRequest request) { - if(!isAuthor(request)) { - return Response.serverError().status(Status.UNAUTHORIZED).build(); - } - RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class); RepositoryEntry re = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); if (re == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } - + RepositoryHandler typeToDownload = RepositoryHandlerFactory.getInstance().getRepositoryHandler(re); if (typeToDownload == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } + + Identity identity = getIdentity(request); + boolean canDownload = re.getCanDownload() && typeToDownload.supportsDownload(); + if (isAdmin(request) || RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identity, re)) { + canDownload = true; + } else if(!isAuthor(request)) { + return Response.serverError().status(Status.UNAUTHORIZED).build(); + } + if(!canDownload) { + return Response.serverError().status(Status.UNAUTHORIZED).build(); + } OLATResource ores = OLATResourceManager.getInstance().findResourceable(re.getOlatResource()); if (ores == null) { return Response.serverError().status(Status.NOT_FOUND).build(); } - Identity identity = getIdentity(request); - boolean isAuthor = RestSecurityHelper.isAuthor(request); - boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(identity, re); - if (!(isAuthor | isOwner)) { - return Response.serverError().status(Status.UNAUTHORIZED).build(); - } - boolean canDownload = re.getCanDownload() && typeToDownload.supportsDownload(); - if (!canDownload) { - return Response.serverError().status(Status.NOT_ACCEPTABLE).build(); - } - boolean isAlreadyLocked = typeToDownload.isLocked(ores); LockResult lockResult = null; try { diff --git a/src/test/java/org/olat/restapi/CourseTest.java b/src/test/java/org/olat/restapi/CourseTest.java index b5f47ec8bf02ac80b2bb86474e502fbd0ba47a58..2bb9fb861a86d1cce1243f9d8b4572167ad0c7be 100644 --- a/src/test/java/org/olat/restapi/CourseTest.java +++ b/src/test/java/org/olat/restapi/CourseTest.java @@ -614,6 +614,62 @@ public class CourseTest extends OlatJerseyTestCase { Assert.assertEquals(0, repositoryEntry.getAccess()); } + @Test + public void exportCourse() + throws IOException, URISyntaxException { + Assert.assertTrue(conn.login("administrator", "openolat")); + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("course-owner"); + RepositoryEntry course = JunitTestHelper.deployBasicCourse(author); + dbInstance.closeSession(); + + URI request = UriBuilder.fromUri(getContextURI()).path("repo").path("courses") + .path(course.getOlatResource().getResourceableId().toString()).path("file").build(); + HttpGet method = conn.createGet(request, "application/zip", true); + HttpResponse response = conn.execute(method); + + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + byte[] exportedFile = EntityUtils.toByteArray(response.getEntity()); + Assert.assertTrue(exportedFile.length > 1000); + } + + @Test + public void exportCourse_owner() + throws IOException, URISyntaxException { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("course-owner-2"); + RepositoryEntry course = JunitTestHelper.deployBasicCourse(author); + dbInstance.closeSession(); + + Assert.assertTrue(conn.login(author.getName(), "A6B7C8")); + + URI request = UriBuilder.fromUri(getContextURI()).path("repo").path("courses") + .path(course.getOlatResource().getResourceableId().toString()).path("file").build(); + HttpGet method = conn.createGet(request, "application/zip", true); + HttpResponse response = conn.execute(method); + + Assert.assertEquals(200, response.getStatusLine().getStatusCode()); + byte[] exportedFile = EntityUtils.toByteArray(response.getEntity()); + Assert.assertTrue(exportedFile.length > 1000); + } + + @Test + public void exportCourse_notOwner() + throws IOException, URISyntaxException { + Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("course-owner-3"); + Identity otherUser = JunitTestHelper.createAndPersistIdentityAsRndUser("course-owner-4"); + RepositoryEntry course = JunitTestHelper.deployBasicCourse(owner); + dbInstance.closeSession(); + + Assert.assertTrue(conn.login(otherUser.getName(), "A6B7C8")); + + URI request = UriBuilder.fromUri(getContextURI()).path("repo").path("courses") + .path(course.getOlatResource().getResourceableId().toString()).path("file").build(); + HttpGet method = conn.createGet(request, "application/zip", true); + HttpResponse response = conn.execute(method); + + Assert.assertEquals(401, response.getStatusLine().getStatusCode()); + EntityUtils.consume(response.getEntity()); + } + protected List<UserVO> parseUserArray(InputStream body) { try { ObjectMapper mapper = new ObjectMapper(jsonFactory);