Commit ccb1fbda authored by azara's avatar azara
Browse files

Merge branch '6.3.x' of https://github.com/bonitasoft/bonita-studio.git into 6.3.x

parents 15147865 905610ad
......@@ -6,9 +6,9 @@ initializing.progressMessage=Por favor aguarde, inicializando
workspace.location.title=Localização do espaço de trabalho
workspace.location.description=Caminho
workspace.location.explanation=Selecione uma pasta de instalação do Bonita BPM 6 onde você deseja obter os dados
workspace.location.explanation.choice1=- default workspace\: browse to the directory where you installed Bonita BPM Studio.
workspace.location.explanation.choice2=- another workspace (Subscription editions)\: browse to its parent directory.
workspace.location.explanation.end=To migrate other workspaces manually (Subscription editions only)\: in the old Studio, all diagrams closed, export everything and import the archive into the new Studio.
workspace.location.explanation.choice1=- espaço de trabalho padrão\: navegue até o diretório onde você instalou o Bonita BPM Studio.
workspace.location.explanation.choice2=- outro espaço de trabalho (edições de assinatura)\: navegue até o diretório pai.
workspace.location.explanation.end=Para migrar outros espaços de trabalho manualmente (apenas edições de assinatura)\: no antigo Studio, com todos os diagramas fechados, exporte tudo e importe o arquivo no novo Studio.
workspace.location.validation.error=A localização do workspace não é valida para o Bonita BPM Workspace
keep.workspace.title=Manter o workspace?
keep.workspace.msg=Você quer manter todos os seus dados existentes?
......@@ -19,7 +19,7 @@ request.key.explanation=Copie a chave de licença abaixo, conecte-se no portal d
install.license.title=Licença de produto
retrieve.workspace.title=Recuperar dados
retrieve.workspace.message=Você deseja recuperar dados de um workspace existente em BonitaBPM?
retrieve.workspace.message.warning=Warning\: If you migrate a workspace that contains a shared repository (Subscription editions), all the repository users must migrate to the new version of Studio.
retrieve.workspace.message.warning=Aviso\: Se migrar um espaço de trabalho que contém um repositório compartilhado (edições de subscrição), todos os usuários do repositório devem migrar para a nova versão do Studio.
workspace.setup=Configuração do espaço de trabalho
no.thanks=Não, obrigado\!
yes.import=Sim, importe dados de outro workspace.
......@@ -82,6 +82,7 @@ public class DuplicateDiagramOperation implements IRunnableWithProgress {
private String diagramVersion;
private String diagramName;
private List<ProcessesNameVersion> pools = new ArrayList<ProcessesNameVersion>();
private final DiagramRepositoryStore store = RepositoryManager.getInstance().getRepositoryStore(DiagramRepositoryStore.class);
/*
* (non-Javadoc)
......@@ -119,17 +120,15 @@ public class DuplicateDiagramOperation implements IRunnableWithProgress {
}
}
if (!pools.isEmpty()) {
try {
if (newDiagram.eResource() != null) {
newDiagram.eResource().save(Collections.EMPTY_MAP);
newDiagram.eResource().save(ProcessDiagramEditorUtil.getSaveOptions());
}
} catch (final IOException e) {
BonitaStudioLog.error(e);
}
}
}
private MainProcess copyDiagram() {
......
......@@ -39,78 +39,78 @@ import org.eclipse.emf.edapt.migration.Model;
*/
public class DataDefaultValueMigration extends ReportCustomMigration {
private Map<String, String> dataDefaultValue = new HashMap<String,String>();
private final Map<String, String> dataDefaultValue = new HashMap<String,String>();
@Override
public void migrateBefore(Model model, Metamodel metamodel)
throws MigrationException {
for(Instance data : model.getAllInstances("process.Data")){
final String script = data.get("defaultValue");
data.set("defaultValue", null);
if(script != null && !script.trim().isEmpty()){
dataDefaultValue.put(data.getUuid(), script);
}
}
}
@Override
public void migrateBefore(final Model model, final Metamodel metamodel)
throws MigrationException {
for(final Instance data : model.getAllInstances("process.Data")){
final String script = data.get("defaultValue");
data.set("defaultValue", null);
if(script != null && !script.trim().isEmpty()){
dataDefaultValue.put(data.getUuid(), script);
}
}
}
@Override
public void migrateAfter(Model model, Metamodel metamodel)
throws MigrationException {
for(Instance data : model.getAllInstances("process.Data")){
if(!data.instanceOf("process.AttachmentData")){
final StringToExpressionConverter converter = getConverter(model,getScope(data));
final String uuid = data.getUuid();
final String defaultValue = dataDefaultValue.get(uuid);
Instance expression = null;
if(defaultValue != null){
final String returnType = StringToExpressionConverter.getDataReturnType(data);
expression = converter.parse(defaultValue, returnType, false);
String expressionType = expression.get("type");
if(ExpressionConstants.SCRIPT_TYPE.equals(expressionType)){
expression.set("name",data.get("name")+"DefaultValueScript");
List<Instance> dependencies = expression.get("referencedElements");
boolean invalidDependency = false ;
for(Instance dependency : dependencies){
if(dependency.instanceOf("process.Data")){
List<Instance> containerData = data.getContainer().get("data");
for(Instance dataInstance : containerData){
if(dataInstance.get("name").equals(dependency.get("name"))){
invalidDependency = true;
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueWithOtherDataDependencyMigrationDescription, Messages.dataDefaultValueProperty, IStatus.ERROR);
}
}
}
}
if(!invalidDependency){
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueMigrationDescription, Messages.dataDefaultValueProperty, IStatus.WARNING);
}
}else if(ExpressionConstants.VARIABLE_TYPE.equals(expressionType)){
if(data.getContainer().instanceOf("process.AbstractProcess")){
expression.set("type",ExpressionConstants.CONSTANT_TYPE);
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueWithOtherDataDependencyMigrationDescription, Messages.dataDefaultValueProperty, IStatus.ERROR);
}
}else{
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueMigrationDescription, Messages.dataDefaultValueProperty, IStatus.OK);
}
}else{
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, false);
}
data.set("defaultValue", expression);
data.set("datasourceId", getDatasource(data));
}
}
}
@Override
public void migrateAfter(final Model model, final Metamodel metamodel)
throws MigrationException {
for(final Instance data : model.getAllInstances("process.Data")){
if(!data.instanceOf("process.AttachmentData")){
final String uuid = data.getUuid();
Instance expression = null;
if (dataDefaultValue.containsKey(uuid)) {
final String defaultValue = dataDefaultValue.get(uuid);
final StringToExpressionConverter converter = getConverter(model, getScope(data));
final String returnType = StringToExpressionConverter.getDataReturnType(data);
expression = converter.parse(defaultValue, returnType, false);
final String expressionType = expression.get("type");
if(ExpressionConstants.SCRIPT_TYPE.equals(expressionType)){
expression.set("name",data.get("name")+"DefaultValueScript");
final List<Instance> dependencies = expression.get("referencedElements");
boolean invalidDependency = false ;
for(final Instance dependency : dependencies){
if(dependency.instanceOf("process.Data")){
final List<Instance> containerData = data.getContainer().get("data");
for(final Instance dataInstance : containerData){
if(dataInstance.get("name").equals(dependency.get("name"))){
invalidDependency = true;
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueWithOtherDataDependencyMigrationDescription, Messages.dataDefaultValueProperty, IStatus.ERROR);
}
}
}
}
if(!invalidDependency){
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueMigrationDescription, Messages.dataDefaultValueProperty, IStatus.WARNING);
}
}else if(ExpressionConstants.VARIABLE_TYPE.equals(expressionType)){
if(data.getContainer().instanceOf("process.AbstractProcess")){
expression.set("type",ExpressionConstants.CONSTANT_TYPE);
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueWithOtherDataDependencyMigrationDescription, Messages.dataDefaultValueProperty, IStatus.ERROR);
}
}else{
addReportChange((String) data.get("name"), ProcessPackage.Literals.DATA.getName(), uuid, Messages.dataDefaultValueMigrationDescription, Messages.dataDefaultValueProperty, IStatus.OK);
}
}else{
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, false);
}
data.set("defaultValue", expression);
data.set("datasourceId", getDatasource(data));
}
}
}
private String getDatasource(Instance data) {
EReference feature = data.getContainerReference();
if(feature.equals(ProcessPackage.Literals.PAGE_FLOW__TRANSIENT_DATA)
|| feature.equals(ProcessPackage.Literals.RECAP_FLOW__RECAP_TRANSIENT_DATA)
|| feature.equals(ProcessPackage.Literals.VIEW_PAGE_FLOW__VIEW_TRANSIENT_DATA)){
return DatasourceConstants.PAGEFLOW_DATASOURCE ;
}else if(data.get("transient")){
return DatasourceConstants.IN_MEMORY_DATASOURCE;
}else{
return DatasourceConstants.BOS_DATASOURCE ;
}
}
private String getDatasource(final Instance data) {
final EReference feature = data.getContainerReference();
if(feature.equals(ProcessPackage.Literals.PAGE_FLOW__TRANSIENT_DATA)
|| feature.equals(ProcessPackage.Literals.RECAP_FLOW__RECAP_TRANSIENT_DATA)
|| feature.equals(ProcessPackage.Literals.VIEW_PAGE_FLOW__VIEW_TRANSIENT_DATA)){
return DatasourceConstants.PAGEFLOW_DATASOURCE ;
}else if(data.get("transient")){
return DatasourceConstants.IN_MEMORY_DATASOURCE;
}else{
return DatasourceConstants.BOS_DATASOURCE ;
}
}
}
......@@ -37,97 +37,150 @@ import org.eclipse.emf.edapt.migration.Model;
*/
public class MessageMigration extends ReportCustomMigration {
private Map<String, String> targetProcessNameConditions = new HashMap<String,String>();
private Map<String, String> targetElementNameConditions = new HashMap<String,String>();
private Map<String, List<Instance>> messageContents = new HashMap<String,List<Instance>>();
@Override
public void migrateBefore(Model model, Metamodel metamodel)
throws MigrationException {
for(Instance message : model.getAllInstances("process.Message")){
final String targetProcess = message.get("targetProcessName");
final String targetElement = message.get("targetElementName");
message.set("targetProcessName", null);
message.set("targetElementName", null);
if(targetProcess != null && !targetProcess.trim().isEmpty()){
targetProcessNameConditions.put(message.getUuid(), targetProcess);
}
if(targetElement != null && !targetElement.trim().isEmpty()){
targetElementNameConditions.put(message.getUuid(), targetElement);
}
List<Instance> data = message.get("data");
List<Instance> content = new ArrayList<Instance>();
for(Instance d : data){
Instance expression = ((Instance) d.get("defaultValue")).copy();
expression.set("returnTypeFixed", false);
content.add(expression);
model.delete(d);
}
if(!content.isEmpty()){
messageContents.put(message.getUuid(), content);
}
}
}
@Override
public void migrateAfter(Model model, Metamodel metamodel)
throws MigrationException {
for(Instance message : model.getAllInstances("process.Message")){
setMessageContent(message, model);
setTargetProcessExpression(message,model);
setTargetElementExpression(message,model);
}
}
private void setMessageContent(Instance message,Model model) {
final Instance tableExpression = model.newInstance("expression.TableExpression");
if(messageContents.containsKey(message.getUuid())){
final List<Instance> content = messageContents.get(message.getUuid());
for(Instance expression : content){
final Instance rowExpression = model.newInstance("expression.ListExpression");
final Instance keyExpression = StringToExpressionConverter.createExpressionInstance(model, expression.get("name")+"Key", expression.get("name")+"Key", String.class.getName(),ExpressionConstants.CONSTANT_TYPE,true);
rowExpression.add("expressions", keyExpression);
rowExpression.add("expressions", expression);
tableExpression.add("expressions", rowExpression);
}
message.set("messageContent", tableExpression);
addReportChange((String) message.get("name"),message.getType().getEClass().getName(), message.getUuid(),Messages.messageContentMigrationDescription, Messages.messagesProperty, IStatus.WARNING);
}else{
message.set("messageContent", tableExpression);
}
}
private void setTargetProcessExpression(Instance message, Model model) {
Instance expression = null;
if(targetProcessNameConditions.containsKey(message.getUuid())){
final StringToExpressionConverter converter = getConverter(model,getScope(message));
final String script = targetProcessNameConditions.get(message.getUuid());
expression = converter.parse(script, String.class.getName(), true);
if(ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))){
expression.set("name", "targetProcessScript");
}
addReportChange((String) message.get("name"),message.getType().getEClass().getName(), message.getUuid(),Messages.targetProcessNameMigrationDescription, Messages.messagesProperty, ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type")) ? IStatus.WARNING : IStatus.OK);
}else{
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, true);
}
message.set("targetProcessExpression", expression);
}
private void setTargetElementExpression(Instance message, Model model) {
Instance expression = null;
if(targetElementNameConditions.containsKey(message.getUuid())){
final StringToExpressionConverter converter = getConverter(model,getScope(message));
final String url = targetElementNameConditions.get(message.getUuid());
expression = converter.parse(url, String.class.getName(), true);
if(ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))){
expression.set("name", "targetElementScriptScript");
}
addReportChange((String) message.get("name"),message.getType().getEClass().getName(), message.getUuid(),Messages.targetElementNameMigrationDescription, Messages.messagesProperty, ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type")) ? IStatus.WARNING : IStatus.OK);
}else{
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, true);
}
message.set("targetElementExpression", expression);
}
private final Map<String, String> targetProcessNameConditions = new HashMap<String, String>();
private final Map<String, String> targetElementNameConditions = new HashMap<String, String>();
private final Map<String, List<Instance>> messageContents = new HashMap<String, List<Instance>>();
@Override
public void migrateBefore(final Model model, final Metamodel metamodel)
throws MigrationException {
for(final Instance message : model.getAllInstances("process.Message")){
setTargetProcessName(message, model);
setTargetElementName(message, model);
final List<Instance> data = message.get("data");
final List<Instance> content = new ArrayList<Instance>();
for(final Instance d : data){
final Instance expInstance = (Instance) d.get("defaultValue");
final Instance expression = expInstance.copy();
List<Instance> dependencies = expression.get("referencedElements");
for (final Instance dep : dependencies) {
model.delete(dep);
}
dependencies = expInstance.get("referencedElements");
for (final Instance dep : dependencies) {
expression.add("referencedElements", dep.copy());
}
expression.set("returnTypeFixed", false);
content.add(expression);
model.delete(d);
}
if(!content.isEmpty()){
messageContents.put(message.getUuid(), content);
}
}
}
private void setTargetElementName(final Instance message, final Model model) {
final List<String> elementNameList = new ArrayList<String>();
for (final Instance elem : model.getAllInstances("process.CatchMessageEvent")) {
elementNameList.add((String) elem.get("name"));
}
String targetElement = message.get("targetElementName");
message.set("targetElementName", null);
for (final String elemName : elementNameList) {
if (elemName.replaceAll(" ", "_").equals(targetElement)) {
targetElement = elemName;
}
}
if(targetElement != null && !targetElement.trim().isEmpty()){
targetElementNameConditions.put(message.getUuid(), targetElement);
}
}
private void setTargetProcessName(final Instance message, final Model model) {
final List<String> poolNameList = new ArrayList<String>();
for (final Instance pool : model.getAllInstances("process.Pool")) {
poolNameList.add((String) pool.get("name"));
}
String targetProcess = message.get("targetProcessName");
message.set("targetProcessName", null);
for (final String procName : poolNameList) {
if (procName.replaceAll(" ", "_").equals(targetProcess)) {
targetProcess = procName;
}
}
if (targetProcess != null && !targetProcess.trim().isEmpty()) {
targetProcessNameConditions.put(message.getUuid(), targetProcess);
}
}
@Override
public void migrateAfter(final Model model, final Metamodel metamodel)
throws MigrationException {
for(final Instance message : model.getAllInstances("process.Message")){
setMessageContent(message, model);
setTargetProcessExpression(message, model);
setTargetElementExpression(message, model);
}
}
private void setMessageContent(final Instance message,final Model model) {
final Instance tableExpression = model.newInstance("expression.TableExpression");
if (messageContents.containsKey(message.getUuid())) {
final List<Instance> content = messageContents.get(message.getUuid());
for(final Instance expression : content){
final Instance rowExpression = model.newInstance("expression.ListExpression");
final Instance keyExpression = StringToExpressionConverter.createExpressionInstance(model, expression.get("name") + "Key",
expression.get("name") + "Key", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, true);
rowExpression.add("expressions", keyExpression);
rowExpression.add("expressions", expression);
tableExpression.add("expressions", rowExpression);
}
message.set("messageContent", tableExpression);
addReportChange((String) message.get("name"), message.getType().getEClass().getName(), message.getUuid(),
Messages.messageContentMigrationDescription, Messages.messagesProperty, IStatus.WARNING);
} else {
message.set("messageContent", tableExpression);
}
}
private void setTargetProcessExpression(final Instance message, final Model model) {
Instance expression = null;
if (targetProcessNameConditions.containsKey(message.getUuid())) {
final StringToExpressionConverter converter = getConverter(model, getScope(message));
final String script = targetProcessNameConditions.get(message.getUuid());
expression = converter.parse(script, String.class.getName(), true);
if (ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))) {
expression.set("name", "targetProcessScript");
}
addReportChange((String) message.get("name"), message.getType().getEClass().getName(), message.getUuid(),
Messages.targetProcessNameMigrationDescription, Messages.messagesProperty, ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))
? IStatus.WARNING : IStatus.OK);
} else {
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, true);
}
message.set("targetProcessExpression", expression);
}
private void setTargetElementExpression(final Instance message, final Model model) {
Instance expression = null;
if (targetElementNameConditions.containsKey(message.getUuid())) {
final StringToExpressionConverter converter = getConverter(model, getScope(message));
final String url = targetElementNameConditions.get(message.getUuid());
expression = converter.parse(url, String.class.getName(), true);
if (ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))) {
expression.set("name", "targetElementScriptScript");
}
addReportChange((String) message.get("name"), message.getType().getEClass().getName(), message.getUuid(),
Messages.targetElementNameMigrationDescription, Messages.messagesProperty, ExpressionConstants.SCRIPT_TYPE.equals(expression.get("type"))
? IStatus.WARNING : IStatus.OK);
} else {
expression = StringToExpressionConverter.createExpressionInstance(model, "", "", String.class.getName(), ExpressionConstants.CONSTANT_TYPE, true);
}
message.set("targetElementExpression", expression);
}
}
......@@ -90,7 +90,7 @@ actorMappingDesc=Zuordnung der Akteure anhand einer bestehenden Organisation def
actorMappingTitle=Akteure zuordnen
nameAlreadyExists=Dieser Akteur ist bereits in Ihrem Prozess vorhanden
nameIsEmpty=Bitte geben Sie einen Namen ein
userNameIsEmpty=Please enter a username
userNameIsEmpty=Bitte geben Sie einen Benutzernamen ein
selectOrganization=Organisation w\u00e4hlen
edit=Bearbeiten...
useActorsDefinedInLane=Akteur verwenden, der in der Lane definiert ist
......@@ -126,7 +126,7 @@ editFilterDefinition=Akteur-Filterdefinition bearbeiten
newFilterImplementation=Neue Akteur-Filterimplementierung
editFilterImplementation=Akteur-Filterimplementierung bearbeiten
selectFilterDefinitionTitle=Akteur-Filterdefinition w\u00e4hlen
selectFilterDefinitionDesc=Choose an actor filter definition from the following list\:
selectFilterDefinitionDesc=W\u00e4hlen Sie eine Akteur-Filter-Definition aus der folgenden Liste\:
selectAFilterDefWarning=Sie m\u00fcssen eine Akteur-Filterdefinition w\u00e4hlen, um fortzufahren
selectFilterImplementationTitle=Akteur-Filterimplementierung w\u00e4hlen
selectFilterImplementationDesc=W\u00e4hlen Sie eine Akteur-Filterimplementierung aus folgender Liste
......@@ -213,21 +213,21 @@ importSuccessfulTitle=Import erfolgreich
importSuccessfulMsg=Importvorgang erfolgreich
importFailedTitle=Import fehlgeschlagen
importFailedMsg=Import fehlgeschlagen. {0}
filterWizardTitle=Configure the actor filter "{0}" ({1})
filterWizardMessage=Enter the generic information for this actor filter configuration
cuiManagementMsg=To define Custom information for all users, go to\: Organization > Manage > Organization\: users page of the wizard > the user Information management tab.
cuiFilterActorRelatedMsg=This filter applies to the actor currently defined for the task.
assignOnlyIfOneUser=Only applicable if the filter returns one user.
filterWizardTitle=Konfigurieren Sie den Akteur-Filter "{0}" ({1})
filterWizardMessage=Geben Sie die allgemeinen Informationen f\u00fcr diese Akteur-Filter-Konfiguration ein
cuiManagementMsg=Um benutzerdefinierte Information f\u00fcr alle Benutzer zu definieren, gehen Sie zu\: Organisation > Verwalten > Organisation\: Benutzerseite des Assistenten > Benutzer-Informationen-Verwaltung-Tab.
cuiFilterActorRelatedMsg=Dieser Filter wird f\u00fcr den Akteur angewendet, der derzeit f\u00fcr die Aufgabe definiert ist.
assignOnlyIfOneUser=Nur anwendbar, wenn der Filter einen Benutzer zur\u00fcckgibt.
typeValueToFilter=Enter the value to filter on.
customUserInfoName=Name
customUserInfoValueLimitSize=Name can't be more than 255 characters
customUserInfoValueLimitSize=Name darf nicht mehr als 255 Zeichen enthalten
customUserInfoDescription=Beschreibung
customUserInfoDefinitionNotEmpty=Name darf nicht leer sein
customUserInfoDefinitionAlreadyExist=Name existiert bereits
customUserInfoDefinitionNoWhiteSpaceAtStartOrEnd=Name kann nicht mit einem Leerzeichen beginnen oder enden
customUserInfoDefinitionNameTooLong=Name can't be more than 75 characters
customUserInfoDefinitionNameTooLong=Name darf nicht mehr als 75 Zeichen enthalten
customUserInformationAddWindowTitle=Hinzuf\u00fcgen einer neuen Benutzerinformationen
customUserInfoOtherTabLink=Manage custom information...
customUserInfoOtherTabLink=Verwalten von benutzerdefinierten Informationen...
defaultInformationGroupTitle=Standardinformationen (schreibgesch\u00fctzt)
defaultInformationGroupGeneralDataTableTitle=Allgemeine Daten
defaultInformationGroupBusinessCardTableTitle=Visitenkarte
......@@ -236,15 +236,15 @@ defaultInformationGroupMembershipsTableTitle=Mitgliedschaften
defaultInformationGroupMembershipsTableText=Kombinationen von Gruppen und Rollen, zu denen der Benutzer geh\u00f6rt.
otherInformationGroupAddButton=Hinzuf\u00fcgen
otherInformationGroupRemoveButton=L\u00f6schen
otherInformationGroupTitle=Custom information
otherInformationGroupTitle=Benutzerdefinierte Informationen
otherInformationGroupRemoveDialogTitle=L\u00f6schen der benutzerdefinierten Informationen?
otherInformationGroupRemoveDialogText=Sind Sie sicher, dass Sie die folgenden benutzerdefinierten Informationen l\u00f6schen m\u00f6chten? {0}
otherInformationGroupRemoveDialogTextWarning=Warning\! This custom information will be delete for every user in the organization.
customUserInformationTabTitle=User information management
otherInformationGroupRemoveDialogTextWarning=Warnung\! Diese benutzerdefinierten Informationen werden f\u00fcr jeden Benutzer in der Organisation gel\u00f6scht.
customUserInformationTabTitle=Verwaltung von Benutzerinformationen
listOfUsersTabTitle=Liste der Benutzer
other=Spezifisch
defaultCustomUserInformationName=Information
nameLimitSize=the name is limited to 50 char
displayNameLimitSize=the display name is limited to 75 char
labelExplicationCustomUserInformation=The information below (default and custom) applies to all users. Custom information can be used in the processes (e.g. by implementing actor filters on tasks).
defaultCustomUserInformationName=Informationen