feat: Able to assign multiple roles as project default role (OD-2464)

This commit is contained in:
Robin Shen 2025-06-14 21:03:33 +08:00
parent 2063d15f12
commit 235d5bba2e
62 changed files with 1289 additions and 492 deletions

View File

@ -81,9 +81,9 @@ import io.onedev.server.commandhandler.ApplyDatabaseConstraints;
import io.onedev.server.commandhandler.BackupDatabase;
import io.onedev.server.commandhandler.CheckDataVersion;
import io.onedev.server.commandhandler.CleanDatabase;
import io.onedev.server.commandhandler.Translate;
import io.onedev.server.commandhandler.ResetAdminPassword;
import io.onedev.server.commandhandler.RestoreDatabase;
import io.onedev.server.commandhandler.Translate;
import io.onedev.server.commandhandler.Upgrade;
import io.onedev.server.data.DataManager;
import io.onedev.server.data.DefaultDataManager;
@ -94,6 +94,7 @@ import io.onedev.server.entitymanager.AgentLastUsedDateManager;
import io.onedev.server.entitymanager.AgentManager;
import io.onedev.server.entitymanager.AgentTokenManager;
import io.onedev.server.entitymanager.AlertManager;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.BuildDependenceManager;
import io.onedev.server.entitymanager.BuildLabelManager;
import io.onedev.server.entitymanager.BuildManager;
@ -179,6 +180,7 @@ import io.onedev.server.entitymanager.impl.DefaultAgentLastUsedDateManager;
import io.onedev.server.entitymanager.impl.DefaultAgentManager;
import io.onedev.server.entitymanager.impl.DefaultAgentTokenManager;
import io.onedev.server.entitymanager.impl.DefaultAlertManager;
import io.onedev.server.entitymanager.impl.DefaultBaseAuthorizationManager;
import io.onedev.server.entitymanager.impl.DefaultBuildDependenceManager;
import io.onedev.server.entitymanager.impl.DefaultBuildLabelManager;
import io.onedev.server.entitymanager.impl.DefaultBuildManager;
@ -561,6 +563,7 @@ public class CoreModule extends AbstractPluginModule {
bind(PullRequestCommentRevisionManager.class).to(DefaultPullRequestCommentRevisionManager.class);
bind(IssueDescriptionRevisionManager.class).to(DefaultIssueDescriptionRevisionManager.class);
bind(PullRequestDescriptionRevisionManager.class).to(DefaultPullRequestDescriptionRevisionManager.class);
bind(BaseAuthorizationManager.class).to(DefaultBaseAuthorizationManager.class);
bind(WebHookManager.class);

View File

@ -8080,4 +8080,31 @@ public class DataMigrator {
}
}
private void migrate203(File dataDir, Stack<Integer> versions) {
VersionedXmlDoc baseAuthorizationsDom = new VersionedXmlDoc();
Element baseAuthorizationsListElement = baseAuthorizationsDom.addElement("list");
long baseAuthorizationId = 1L;
for (File file : dataDir.listFiles()) {
if (file.getName().startsWith("Projects.xml")) {
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
for (Element element : dom.getRootElement().elements()) {
var defaultRoleElement = element.element("defaultRole");
if (defaultRoleElement != null) {
var baseAuthorizationElement = baseAuthorizationsListElement.addElement("io.onedev.server.model.BaseAuthorization");
baseAuthorizationElement.addAttribute("revision", "0.0");
baseAuthorizationElement.addElement("id").setText(String.valueOf(baseAuthorizationId++));
baseAuthorizationElement.addElement("project").setText(element.elementText("id").trim());
baseAuthorizationElement.addElement("role").setText(defaultRoleElement.getText().trim());
defaultRoleElement.detach();
}
}
dom.writeToFile(file, false);
}
}
if (baseAuthorizationId > 1) {
baseAuthorizationsDom.writeToFile(new File(dataDir, "BaseAuthorizations.xml"), false);
}
}
}

View File

@ -0,0 +1,16 @@
package io.onedev.server.entitymanager;
import java.util.Collection;
import io.onedev.server.model.BaseAuthorization;
import io.onedev.server.model.Project;
import io.onedev.server.model.Role;
import io.onedev.server.persistence.dao.EntityManager;
public interface BaseAuthorizationManager extends EntityManager<BaseAuthorization> {
void syncRoles(Project project, Collection<Role> roles);
void create(BaseAuthorization authorization);
}

View File

@ -0,0 +1,81 @@
package io.onedev.server.entitymanager.impl;
import java.util.Collection;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import com.google.common.base.Preconditions;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.model.BaseAuthorization;
import io.onedev.server.model.Project;
import io.onedev.server.model.Role;
import io.onedev.server.persistence.annotation.Transactional;
import io.onedev.server.persistence.dao.BaseEntityManager;
import io.onedev.server.persistence.dao.Dao;
@Singleton
public class DefaultBaseAuthorizationManager extends BaseEntityManager<BaseAuthorization>
implements BaseAuthorizationManager {
@Inject
public DefaultBaseAuthorizationManager(Dao dao) {
super(dao);
}
@Transactional
@Override
public void syncRoles(Project project, Collection<Role> roles) {
for (var it = project.getBaseAuthorizations().iterator(); it.hasNext();) {
var authorization = it.next();
var found = false;
for (var newRole: roles) {
if (newRole.equals(authorization.getRole())) {
found = true;
break;
}
}
if (!found) {
it.remove();
delete(authorization);
}
}
for (var newRole: roles) {
var found = false;
for (var authorization: project.getBaseAuthorizations()) {
if (authorization.getRole().equals(newRole)) {
found = true;
break;
}
}
if (!found) {
var authorization = new BaseAuthorization();
authorization.setProject(project);
authorization.setRole(newRole);
project.getBaseAuthorizations().add(authorization);
dao.persist(authorization);
}
}
}
@Transactional
@Override
public void create(BaseAuthorization authorization) {
Preconditions.checkArgument(authorization.isNew());
dao.persist(authorization);
}
@Override
public List<BaseAuthorization> query() {
return query(true);
}
@Override
public int count() {
return count(true);
}
}

View File

@ -25,6 +25,7 @@ import static io.onedev.server.util.DirectoryVersionUtils.readVersion;
import static io.onedev.server.util.DirectoryVersionUtils.writeVersion;
import static io.onedev.server.util.IOUtils.BUFFER_SIZE;
import static io.onedev.server.util.criteria.Criteria.forManyValues;
import static io.onedev.server.web.translation.Translation._T;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Comparator.naturalOrder;
import static java.util.stream.Collectors.toList;
@ -41,6 +42,7 @@ import java.io.InputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.nio.file.Files;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@ -575,9 +577,9 @@ public class DefaultProjectManager extends BaseEntityManager<Project>
child = find(criteria);
if (child == null) {
if (project == null && !SecurityUtils.canCreateRootProjects())
throw new UnauthorizedException("Not authorized to create root project");
throw new UnauthorizedException(_T("Not authorized to create root project"));
if (project != null && !SecurityUtils.canCreateChildren(project))
throw new UnauthorizedException("Not authorized to create project under '" + project.getPath() + "'");
throw new UnauthorizedException(MessageFormat.format(_T("Not authorized to create project under \"{0}\""), project.getPath()));
child = new Project();
child.setName(name);
child.setParent(project);

View File

@ -22,7 +22,6 @@ import com.hazelcast.cp.IAtomicLong;
import io.onedev.server.cluster.ClusterManager;
import io.onedev.server.entitymanager.LinkAuthorizationManager;
import io.onedev.server.entitymanager.LinkSpecManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.event.Listen;
@ -30,7 +29,6 @@ import io.onedev.server.event.entity.EntityPersisted;
import io.onedev.server.event.entity.EntityRemoved;
import io.onedev.server.event.system.SystemStarting;
import io.onedev.server.model.LinkSpec;
import io.onedev.server.model.Project;
import io.onedev.server.model.Role;
import io.onedev.server.model.support.administration.GlobalIssueSetting;
import io.onedev.server.model.support.role.AllIssueFields;
@ -64,9 +62,7 @@ public class DefaultRoleManager extends BaseEntityManager<Role> implements RoleM
private final LinkSpecManager linkSpecManager;
private final LinkAuthorizationManager linkAuthorizationManager;
private final ProjectManager projectManager;
private final ClusterManager clusterManager;
private final TransactionManager transactionManager;
@ -76,13 +72,12 @@ public class DefaultRoleManager extends BaseEntityManager<Role> implements RoleM
@Inject
public DefaultRoleManager(Dao dao, SettingManager settingManager, IdManager idManager,
LinkAuthorizationManager linkAuthorizationManager,
ProjectManager projectManager, ClusterManager clusterManager,
TransactionManager transactionManager, LinkSpecManager linkSpecManager) {
ClusterManager clusterManager, TransactionManager transactionManager,
LinkSpecManager linkSpecManager) {
super(dao);
this.settingManager = settingManager;
this.idManager = idManager;
this.linkAuthorizationManager = linkAuthorizationManager;
this.projectManager = projectManager;
this.clusterManager = clusterManager;
this.transactionManager = transactionManager;
this.linkSpecManager = linkSpecManager;
@ -137,14 +132,8 @@ public class DefaultRoleManager extends BaseEntityManager<Role> implements RoleM
public void delete(Role role) {
Usage usage = new Usage();
usage.add(settingManager.onDeleteRole(role.getName()));
usage.add(settingManager.onDeleteRole(role.getName()));
usage.checkInUse("Role '" + role.getName() + "'");
for (Project project: role.getDefaultProjects()) {
project.setDefaultRole(null);
projectManager.update(project);
}
dao.remove(role);
}

View File

@ -0,0 +1,52 @@
package io.onedev.server.model;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Index;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Table(
indexes={@Index(columnList="o_project_id"), @Index(columnList="o_role_id")},
uniqueConstraints={@UniqueConstraint(columnNames={"o_project_id", "o_role_id"})
})
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class BaseAuthorization extends AbstractEntity {
private static final long serialVersionUID = 1L;
public static final String PROP_PROJECT = "project";
public static final String PROP_ROLE = "role";
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
private Project project;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=false)
private Role role;
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}

View File

@ -347,12 +347,10 @@ public class Project extends AbstractEntity implements LabelSupport<ProjectLabel
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Collection<Project> forks = new ArrayList<>();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(nullable=true)
@Api(description="This represents default role of the project. Remove this property if the project should not "
+ "have a default role when create/update the project. May be null.")
private Role defaultRole;
@OneToMany(mappedBy="project", cascade=CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Collection<BaseAuthorization> baseAuthorizations = new ArrayList<>();
@OneToMany(mappedBy="project", cascade=CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Collection<GroupAuthorization> groupAuthorizations = new ArrayList<>();
@ -592,15 +590,6 @@ public class Project extends AbstractEntity implements LabelSupport<ProjectLabel
this.outgoingRequests = outgoingRequests;
}
@Nullable
public Role getDefaultRole() {
return defaultRole;
}
public void setDefaultRole(Role defaultRole) {
this.defaultRole = defaultRole;
}
public Collection<GroupAuthorization> getGroupAuthorizations() {
return groupAuthorizations;
}
@ -609,6 +598,14 @@ public class Project extends AbstractEntity implements LabelSupport<ProjectLabel
this.groupAuthorizations = groupAuthorizations;
}
public Collection<BaseAuthorization> getBaseAuthorizations() {
return baseAuthorizations;
}
public void setBaseAuthorizations(Collection<BaseAuthorization> baseAuthorizations) {
this.baseAuthorizations = baseAuthorizations;
}
public Collection<UserAuthorization> getUserAuthorizations() {
return userAuthorizations;
}
@ -781,7 +778,7 @@ public class Project extends AbstractEntity implements LabelSupport<ProjectLabel
public ProjectFacade getFacade() {
return new ProjectFacade(getId(), getName(), getKey(), getPath(), getServiceDeskEmailAddress(),
isCodeManagement(), isIssueManagement(), getGitPackConfig(), lastEventDate.getId(),
idOf(getDefaultRole()), idOf(getParent()), idOf(getForkedFrom()));
idOf(getParent()), idOf(getForkedFrom()));
}
/**
@ -1681,7 +1678,7 @@ public class Project extends AbstractEntity implements LabelSupport<ProjectLabel
}
public boolean isPermittedByLoginUser(Permission permission) {
return getDefaultRole() != null && getDefaultRole().implies(permission);
return getBaseAuthorizations().stream().anyMatch(it->it.getRole().implies(permission));
}
public LinkedHashMap<String, ContributedProjectSetting> getContributedSettings() {

View File

@ -79,9 +79,9 @@ public class Role extends AbstractEntity implements BasePermission {
@Column(length=65535, nullable=false)
private ArrayList<JobPrivilege> jobPrivileges = new ArrayList<>();
@OneToMany(mappedBy="defaultRole")
@OneToMany(mappedBy="role", cascade=CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
private Collection<Project> defaultProjects = new ArrayList<>();
private Collection<BaseAuthorization> baseAuthorizations = new ArrayList<>();
@OneToMany(mappedBy="role", cascade=CascadeType.REMOVE)
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
@ -322,14 +322,14 @@ public class Role extends AbstractEntity implements BasePermission {
this.jobPrivileges = (ArrayList<JobPrivilege>) jobPrivileges;
}
public Collection<Project> getDefaultProjects() {
return defaultProjects;
public Collection<BaseAuthorization> getBaseAuthorizations() {
return baseAuthorizations;
}
public void setDefaultProjects(Collection<Project> defaultProjects) {
this.defaultProjects = defaultProjects;
public void setBaseAuthorizations(Collection<BaseAuthorization> baseAuthorizations) {
this.baseAuthorizations = baseAuthorizations;
}
public Collection<LinkAuthorization> getLinkAuthorizations() {
return linkAuthorizations;
}

View File

@ -0,0 +1,67 @@
package io.onedev.server.rest.resource;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.validation.constraints.NotNull;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.shiro.authz.UnauthorizedException;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.model.BaseAuthorization;
import io.onedev.server.rest.annotation.Api;
import io.onedev.server.security.SecurityUtils;
@Api(order=7500, description = "This resource manages default roles of project")
@Path("/base-authorizations")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Singleton
public class BaseAuthorizationResource {
private final BaseAuthorizationManager authorizationManager;
@Inject
public BaseAuthorizationResource(BaseAuthorizationManager authorizationManager) {
this.authorizationManager = authorizationManager;
}
@Api(order=100, description = "Get base authorization of specified id")
@Path("/{authorizationId}")
@GET
public BaseAuthorization get(@PathParam("authorizationId") Long authorizationId) {
var authorization = authorizationManager.load(authorizationId);
if (!SecurityUtils.canManageProject(authorization.getProject()))
throw new UnauthorizedException();
return authorization;
}
@Api(order=200, description="Create base authorization")
@POST
public Long create(@NotNull BaseAuthorization authorization) {
if (!SecurityUtils.canManageProject(authorization.getProject()))
throw new UnauthorizedException();
authorizationManager.create(authorization);
return authorization.getId();
}
@Api(order=300, description = "Delete base authorization of specified id")
@Path("/{authorizationId}")
@DELETE
public Response delete(@PathParam("authorizationId") Long authorizationId) {
var authorization = authorizationManager.load(authorizationId);
if (!SecurityUtils.canManageProject(authorization.getProject()))
throw new UnauthorizedException();
authorizationManager.delete(authorization);
return Response.ok().build();
}
}

View File

@ -38,6 +38,7 @@ import io.onedev.server.entitymanager.IterationManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.git.GitContribution;
import io.onedev.server.git.GitContributor;
import io.onedev.server.model.BaseAuthorization;
import io.onedev.server.model.GroupAuthorization;
import io.onedev.server.model.Iteration;
import io.onedev.server.model.Project;
@ -143,7 +144,17 @@ public class ProjectResource {
throw new UnauthorizedException();
return project.getForks();
}
@Api(order=350, description = "A base authorization corresponds to a default role. It can be added/removed via <a href='/~help/api/io.onedev.server.rest.resource.BaseAuthorizationResource'>base authorizations resource</a>")
@Path("/{projectId}/base-authorizations")
@GET
public Collection<BaseAuthorization> getBaseAuthorizations(@PathParam("projectId") Long projectId) {
Project project = projectManager.load(projectId);
if (!SecurityUtils.canManageProject(project))
throw new UnauthorizedException();
return project.getBaseAuthorizations();
}
@Api(order=400)
@Path("/{projectId}/group-authorizations")
@GET
@ -153,7 +164,7 @@ public class ProjectResource {
throw new UnauthorizedException();
return project.getGroupAuthorizations();
}
@Api(order=500)
@Path("/{projectId}/user-authorizations")
@GET

View File

@ -26,9 +26,9 @@ import io.onedev.commons.loader.AppLoader;
import io.onedev.k8shelper.KubernetesHelper;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.AccessTokenManager;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.GroupManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.entitymanager.SettingManager;
import io.onedev.server.entitymanager.UserManager;
import io.onedev.server.model.AccessToken;
@ -83,7 +83,6 @@ import io.onedev.server.security.permission.WriteCode;
import io.onedev.server.security.permission.WritePack;
import io.onedev.server.util.concurrent.PrioritizedCallable;
import io.onedev.server.util.facade.ProjectCache;
import io.onedev.server.util.facade.ProjectFacade;
import io.onedev.server.util.facade.UserCache;
import io.onedev.server.util.facade.UserFacade;
@ -358,7 +357,7 @@ public class SecurityUtils extends org.apache.shiro.SecurityUtils {
}
private static boolean isAssignedDefaultRole(Project project, Role role) {
return role.getDefaultProjects().stream().anyMatch(it->it.isSelfOrAncestorOf(project));
return role.getBaseAuthorizations().stream().anyMatch(it->it.getProject().isSelfOrAncestorOf(project));
}
public static boolean canAccessProject(Project project) {
@ -621,13 +620,10 @@ public class SecurityUtils extends org.apache.shiro.SecurityUtils {
private static void addIdsPermittedByDefaultRole(ProjectCache cache, Collection<Long> projectIds,
Permission permission) {
var roleManager = OneDev.getInstance(RoleManager.class);
for (ProjectFacade project : cache.values()) {
if (project.getDefaultRoleId() != null) {
Role defaultRole = roleManager.load(project.getDefaultRoleId());
if (defaultRole.implies(permission))
projectIds.addAll(cache.getSubtreeIds(project.getId()));
}
var baseAuthorizationManager = OneDev.getInstance(BaseAuthorizationManager.class);
for (var authorization: baseAuthorizationManager.query()) {
if (authorization.getRole().implies(permission))
projectIds.addAll(cache.getSubtreeIds(authorization.getProject().getId()));
}
}
@ -702,7 +698,7 @@ public class SecurityUtils extends org.apache.shiro.SecurityUtils {
Project current = project;
do {
if (current.getDefaultRole() != null && current.getDefaultRole().implies(permission))
if (current.isPermittedByLoginUser(permission))
return filterApplicableUsers(cache.getUsers(), permission);
for (UserAuthorization authorization: current.getUserAuthorizations()) {
@ -774,9 +770,9 @@ public class SecurityUtils extends org.apache.shiro.SecurityUtils {
if (!isAnonymous(principal) || getSettingManager().getSecuritySetting().isEnableAnonymousAccess()) {
Project current = project;
do {
Role defaultRole = current.getDefaultRole();
if (defaultRole != null)
populateAccessibleJobNames(accessibleJobNames, availableJobNames, defaultRole);
for (var authorization: current.getBaseAuthorizations()) {
populateAccessibleJobNames(accessibleJobNames, availableJobNames, authorization.getRole());
}
current = current.getParent();
} while (current != null);
}
@ -830,10 +826,11 @@ public class SecurityUtils extends org.apache.shiro.SecurityUtils {
}
}
}
if ((!isAnonymous(principal) || getSettingManager().getSecuritySetting().isEnableAnonymousAccess())
&& project.getDefaultRole() != null) {
populateAccessibleReportNames(accessibleReportNames, availableReportNames,
project, project.getDefaultRole());
if (!isAnonymous(principal) || getSettingManager().getSecuritySetting().isEnableAnonymousAccess()) {
for (var authorization: project.getBaseAuthorizations()) {
populateAccessibleReportNames(accessibleReportNames, availableReportNames,
project, authorization.getRole());
}
}
}
return accessibleReportNames;

View File

@ -117,7 +117,7 @@ public class GeneralAuthorizingRealm extends AuthorizingRealm {
Project project = projectPermission.getProject();
Permission privilege = projectPermission.getPrivilege();
do {
if (project.getDefaultRole() != null && project.getDefaultRole().implies(privilege))
if (project.isPermittedByLoginUser(privilege))
return true;
project = project.getParent();
} while (project != null);

View File

@ -23,9 +23,7 @@ public class ProjectFacade extends EntityFacade {
private final GitPackConfig gitPackConfig;
private final Long lastEventDateId;
private final Long defaultRoleId;
private final Long parentId;
private final Long forkedFromId;
@ -33,8 +31,8 @@ public class ProjectFacade extends EntityFacade {
public ProjectFacade(Long id, String name, @Nullable String key, String path,
@Nullable String serviceDeskEmailAddress, boolean codeManagement,
boolean issueManagement, GitPackConfig gitPackConfig,
Long lastEventDateId, @Nullable Long defaultRoleId,
@Nullable Long parentId, @Nullable Long forkedFromId) {
Long lastEventDateId, @Nullable Long parentId,
@Nullable Long forkedFromId) {
super(id);
this.name = name;
this.key = key;
@ -44,7 +42,6 @@ public class ProjectFacade extends EntityFacade {
this.issueManagement = issueManagement;
this.gitPackConfig = gitPackConfig;
this.lastEventDateId = lastEventDateId;
this.defaultRoleId = defaultRoleId;
this.parentId = parentId;
this.forkedFromId = forkedFromId;
}
@ -83,11 +80,6 @@ public class ProjectFacade extends EntityFacade {
return lastEventDateId;
}
@Nullable
public Long getDefaultRoleId() {
return defaultRoleId;
}
@Nullable
public Long getParentId() {
return parentId;

View File

@ -1629,6 +1629,22 @@ public abstract class IssueListPanel extends Panel {
public WebMarkupContainer newLink(String id) {
return new MenuLink(id) {
@Override
protected void onConfigure() {
super.onConfigure();
setEnabled(issuesTable.getItemCount() != 0);
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
configure();
if (!isEnabled()) {
tag.put("disabled", "disabled");
tag.put("data-tippy-content", _T("No issues to export"));
}
}
@Override
protected List<MenuItem> getMenuItems(FloatingPanel dropdown2) {
var menuItems = new ArrayList<MenuItem>();
@ -1642,23 +1658,7 @@ public abstract class IssueListPanel extends Panel {
@Override
public WebMarkupContainer newLink(String id) {
return new AjaxLink<Void>(id) {
@Override
protected void onConfigure() {
super.onConfigure();
setEnabled(issuesTable.getItemCount() != 0);
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
configure();
if (!isEnabled()) {
tag.put("disabled", "disabled");
tag.put("data-tippy-content", _T("No issues to export"));
}
}
@Override
public void onClick(AjaxRequestTarget target) {
dropdown.close();
@ -1681,22 +1681,6 @@ public abstract class IssueListPanel extends Panel {
public WebMarkupContainer newLink(String id) {
return new AjaxLink<Void>(id) {
@Override
protected void onConfigure() {
super.onConfigure();
setEnabled(issuesTable.getItemCount() != 0);
}
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
configure();
if (!isEnabled()) {
tag.put("disabled", "disabled");
tag.put("data-tippy-content", _T("No issues to export"));
}
}
@Override
public void onClick(AjaxRequestTarget target) {
dropdown.close();

View File

@ -1,7 +1,7 @@
<wicket:panel>
<form wicket:id="form" class="leave-confirm">
<div class="modal-header">
<h5 class="modal-title">Fork Project</h5>
<h5 class="modal-title"><wicket:t>Fork Project</wicket:t></h5>
<button wicket:id="close" type="button" class="close"><wicket:svg href="times" class="icon"/></button>
</div>
<div class="modal-body">
@ -11,8 +11,8 @@
<div wicket:id="parentEditor"></div>
</div>
<div class="modal-footer">
<button wicket:id="save" class="btn btn-primary">Ok</button>
<button wicket:id="cancel" class="btn btn-secondary">Cancel</button>
<button wicket:id="save" class="btn btn-primary"><wicket:t>Ok</wicket:t></button>
<button wicket:id="cancel" class="btn btn-secondary"><wicket:t>Cancel</wicket:t></button>
</div>
</form>
</wicket:panel>

View File

@ -1,5 +1,14 @@
package io.onedev.server.web.component.project.forkoption;
import static io.onedev.server.model.Project.PROP_DESCRIPTION;
import static io.onedev.server.model.Project.PROP_ISSUE_MANAGEMENT;
import static io.onedev.server.model.Project.PROP_KEY;
import static io.onedev.server.model.Project.PROP_NAME;
import static io.onedev.server.model.Project.PROP_PACK_MANAGEMENT;
import static io.onedev.server.model.Project.PROP_TIME_TRACKING;
import static io.onedev.server.web.translation.Translation._T;
import static java.util.stream.Collectors.toList;
import java.util.Collection;
import org.apache.shiro.authz.UnauthorizedException;
@ -14,6 +23,7 @@ import org.apache.wicket.model.IModel;
import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.ProjectLabelManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.model.Project;
@ -24,12 +34,10 @@ import io.onedev.server.util.PathNode;
import io.onedev.server.web.editable.BeanContext;
import io.onedev.server.web.editable.BeanEditor;
import io.onedev.server.web.page.project.blob.ProjectBlobPage;
import io.onedev.server.web.page.project.setting.general.DefaultRoleBean;
import io.onedev.server.web.page.project.setting.general.DefaultRolesBean;
import io.onedev.server.web.page.project.setting.general.ParentBean;
import io.onedev.server.web.util.editbean.LabelsBean;
import static io.onedev.server.model.Project.*;
public abstract class ForkOptionPanel extends Panel {
private final IModel<Project> projectModel;
@ -62,8 +70,8 @@ public abstract class ForkOptionPanel extends Panel {
parentBean.setParentPath(userName);
}
DefaultRoleBean defaultRoleBean = new DefaultRoleBean();
defaultRoleBean.setRole(getProject().getDefaultRole());
DefaultRolesBean defaultRolesBean = new DefaultRolesBean();
defaultRolesBean.setRoles(getProject().getBaseAuthorizations().stream().map(it->it.getRole()).collect(toList()));
LabelsBean labelsBean = LabelsBean.of(getProject());
@ -71,7 +79,7 @@ public abstract class ForkOptionPanel extends Panel {
PROP_PACK_MANAGEMENT, PROP_ISSUE_MANAGEMENT, PROP_TIME_TRACKING);
BeanEditor editor = BeanContext.edit("editor", editProject, properties, false);
BeanEditor defaultRoleEditor = BeanContext.edit("defaultRoleEditor", defaultRoleBean);
BeanEditor defaultRoleEditor = BeanContext.edit("defaultRoleEditor", defaultRolesBean);
BeanEditor labelsEditor = BeanContext.edit("labelsEditor", labelsBean);
BeanEditor parentEditor = BeanContext.edit("parentEditor", parentBean);
@ -92,7 +100,7 @@ public abstract class ForkOptionPanel extends Panel {
try {
if (editProject.getKey() != null && getProjectManager().findByKey(editProject.getKey()) != null) {
editor.error(new Path(new PathNode.Named(PROP_KEY)),
"This key has already been used by another project");
_T("This key has already been used by another project"));
}
String projectPath = editProject.getName();
if (parentBean.getParentPath() != null)
@ -100,7 +108,7 @@ public abstract class ForkOptionPanel extends Panel {
Project newProject = getProjectManager().setup(projectPath);
if (!newProject.isNew()) {
editor.error(new Path(new PathNode.Named("name")),
"This name has already been used by another project");
_T("This name has already been used by another project"));
}
if (editor.isValid()) {
newProject.setForkedFrom(getProject());
@ -109,16 +117,16 @@ public abstract class ForkOptionPanel extends Panel {
newProject.setPackManagement(editProject.isPackManagement());
newProject.setIssueManagement(editProject.isIssueManagement());
newProject.setTimeTracking(editProject.isTimeTracking());
newProject.setDefaultRole(defaultRoleBean.getRole());
newProject.setCodeAnalysisSetting(getProject().getCodeAnalysisSetting());
newProject.setGitPackConfig(getProject().getGitPackConfig());
OneDev.getInstance(TransactionManager.class).run(() -> {
getProjectManager().create(newProject);
getProjectManager().fork(getProject(), newProject);
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(newProject, defaultRolesBean.getRoles());
OneDev.getInstance(ProjectLabelManager.class).sync(newProject, labelsBean.getLabels());
});
Session.get().success("Project forked");
Session.get().success(_T("Project forked"));
setResponsePage(ProjectBlobPage.class, ProjectBlobPage.paramsOf(newProject));
} else {
target.add(form);

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.help;
import static io.onedev.server.web.translation.Translation._T;
import java.lang.reflect.Method;
import javax.annotation.Nullable;
@ -26,12 +28,12 @@ public abstract class ApiHelpPage extends LayoutPage {
@Override
protected String getPageTitle() {
return "RESTful API Help";
return _T("RESTful API Help");
}
@Override
protected Component newTopbarTitle(String componentId) {
return new Label(componentId, "RESTful API Help");
return new Label(componentId, _T("RESTful API Help"));
}
protected String getResourceTitle(Class<?> resourceClass) {

View File

@ -49,7 +49,7 @@
</wicket:fragment>
<wicket:fragment wicket:id="dateHintFrag">
This date is using <a href="https://www.w3.org/TR/NOTE-datetime">ISO 8601 format</a>
<wicket:t>This date is using <a href="https://www.w3.org/TR/NOTE-datetime">ISO 8601 format</a></wicket:t>
</wicket:fragment>
<wicket:fragment wicket:id="typeInfoFrag">

View File

@ -2,14 +2,14 @@
<div class="m-2 m-sm-5 card">
<div class="card-body">
<div wicket:id="warning" class="alert alert-notice alert-light-warning font-size-lg font-weight-bolder mb-5">
There are incompatibilities since your upgraded version
<wicket:t>There are incompatibilities since your upgraded version</wicket:t>
</div>
<div wicket:id="incompatibilities"></div>
<wicket:enclosure>
<div class="mt-5">
<a wicket:id="back" class="btn btn-primary">Go Back</a>
<a wicket:id="back" class="btn btn-primary"><wicket:t>Go Back</wicket:t></a>
<p class="text-muted mt-4">
you may show this page later via incompatibilities link in help menu
<wicket:t>you may show this page later via incompatibilities link in help menu</wicket:t>
</p>
</div>
</wicket:enclosure>

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.help;
import static io.onedev.server.web.translation.Translation._T;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@ -112,7 +114,7 @@ public class IncompatibilitiesPage extends LayoutPage {
@Override
protected Component newTopbarTitle(String componentId) {
return new Label(componentId, "Incompatibilities");
return new Label(componentId, _T("Incompatibilities"));
}
}

View File

@ -3,18 +3,18 @@
<div wicket:id="description" class="alert alert-notice alert-light mb-4"></div>
<div class="method-detail border-top pt-3">
<dl class="content">
<dt>Http Method</dt>
<dt><wicket:t>Http Method</wicket:t></dt>
<dd wicket:id="method"></dd>
<dt>End Point</dt>
<dt><wicket:t>End Point</wicket:t></dt>
<dd>
<div wicket:id="path"></div>
<wicket:enclosure child="pathPlaceholders">
<table class="table mt-4">
<thead>
<tr>
<td>Placeholder</td>
<td>Description</td>
<td>Example</td>
<td><wicket:t>Placeholder</wicket:t></td>
<td><wicket:t>Description</wicket:t></td>
<td><wicket:t>Example</wicket:t></td>
</tr>
</thead>
<tbody>
@ -28,15 +28,15 @@
</wicket:enclosure>
</dd>
<wicket:enclosure child="queryParams">
<dt>Query Parameters</dt>
<dt><wicket:t>Query Parameters</wicket:t></dt>
<dd>
<table class="table">
<thead>
<tr>
<td>Parameter</td>
<td>Description</td>
<td>Required</td>
<td>Example</td>
<td><wicket:t>Parameter</wicket:t></td>
<td><wicket:t>Description</wicket:t></td>
<td><wicket:t>Required</wicket:t></td>
<td><wicket:t>Example</wicket:t></td>
</tr>
</thead>
<tbody>
@ -51,49 +51,49 @@
</dd>
</wicket:enclosure>
<wicket:enclosure child="contentType">
<dt>Request Body</dt>
<dt><wicket:t>Request Body</wicket:t></dt>
<dd>
<dl>
<dt>Content Type</dt>
<dt><wicket:t>Content Type</wicket:t></dt>
<dd wicket:id="contentType">application/json</dd>
<wicket:enclosure child="requestBodyExample">
<dt>Example <a wicket:id="copyRequestBodyExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dt><wicket:t>Example</wicket:t> <a wicket:id="copyRequestBodyExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dd wicket:id="requestBodyExample"></dd>
</wicket:enclosure>
</dl>
</dd>
</wicket:enclosure>
<dt>Response</dt>
<dt><wicket:t>Response</wicket:t></dt>
<dd>
<dl>
<dt>Operation Successful</dt>
<dt><wicket:t>Operation Successful</wicket:t></dt>
<dd>
<dl>
<dt>Status Code</dt>
<dt><wicket:t>Status Code</wicket:t></dt>
<dd>200</dd>
<dt>Response Body</dt>
<dt><wicket:t>Response Body</wicket:t></dt>
<dd wicket:id="successResponseBody"></dd>
</dl>
</dd>
<dt>Operation Failed</dt>
<dt><wicket:t>Operation Failed</wicket:t></dt>
<dd>
<dl>
<dt>Status code</dt>
<dd>Status code other than 200 indicating the error type</dd>
<dt>Response Body</dt>
<dd>Error detail of content type &quot;text/plain&quot;</dd>
<dt><wicket:t>Status code</wicket:t></dt>
<dd><wicket:t>Status code other than 200 indicating the error type</wicket:t></dd>
<dt><wicket:t>Response Body</wicket:t></dt>
<dd><wicket:t>Error detail of content type &quot;text/plain&quot;</wicket:t></dd>
</dl>
</dd>
</dl>
</dd>
<dt>cURL Example <a wicket:id="copyCurlExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dt><wicket:t>cURL Example</wicket:t> <a wicket:id="copyCurlExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dd>
<code wicket:id="curlExample"></code>
</dd>
</dl>
</div>
<wicket:fragment wicket:id="topbarTitleFrag">
<a wicket:id="resources">Resources</a>
<a wicket:id="resources"><wicket:t>Resources</wicket:t></a>
<span class="dot"></span>
<a wicket:id="resource"><span wicket:id="label"></span></a>
<span class="dot"></span>
@ -101,10 +101,10 @@
</wicket:fragment>
<wicket:fragment wicket:id="hasResponseBodyFrag">
<dl>
<dt>Content Type</dt>
<dt><wicket:t>Content Type</wicket:t></dt>
<dd wicket:id="contentType">application/json</dd>
<wicket:enclosure child="example">
<dt>Example <a wicket:id="copyExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dt><wicket:t>Example</wicket:t> <a wicket:id="copyExample" class="ml-1" t:data-tippy-content="Copy to clipboard"><wicket:svg href="copy" class="icon icon-sm"/></a></dt>
<dd wicket:id="example"></dd>
</wicket:enclosure>
</dl>

View File

@ -44,6 +44,7 @@ import java.util.regex.Matcher;
import static io.onedev.server.web.page.help.ValueInfo.Origin.CREATE_BODY;
import static io.onedev.server.web.page.help.ValueInfo.Origin.UPDATE_BODY;
import static io.onedev.server.web.translation.Translation._T;
public class MethodDetailPage extends ApiHelpPage {
@ -293,7 +294,7 @@ public class MethodDetailPage extends ApiHelpPage {
});
if (method.getReturnType() == Response.class) {
add(new Label("successResponseBody", "No response body"));
add(new Label("successResponseBody", _T("No response body")));
} else {
Fragment fragment = new Fragment("successResponseBody", "hasResponseBodyFrag", MethodDetailPage.this);

View File

@ -4,9 +4,9 @@
<table class="table">
<thead>
<tr>
<td>Operation</td>
<td>Http Method</td>
<td>End Point</td>
<td><wicket:t>Operation</wicket:t></td>
<td><wicket:t>Http Method</wicket:t></td>
<td><wicket:t>End Point</wicket:t></td>
</tr>
</thead>
<tbody>
@ -20,6 +20,6 @@
</tbody>
</table>
<wicket:fragment wicket:id="topbarTitleFrag">
<a wicket:id="resources">Resources</a> <span class="dot"></span> <span wicket:id="resource"></span>
<a wicket:id="resources"><wicket:t>Resources</wicket:t></a> <span class="dot"></span> <span wicket:id="resource"></span>
</wicket:fragment>
</wicket:extend>

View File

@ -1,14 +1,14 @@
<wicket:extend>
<div class="title">All RESTful Resources</div>
<div class="title"><wicket:t>All RESTful Resources</wicket:t></div>
<div class="alert alert-notice alert-light mb-5">
In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation,
you will need to authenticate by providing user name and password (or access token) via http basic auth header
<wicket:t>In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation,
you will need to authenticate by providing user name and password (or access token) via http basic auth header</wicket:t>
</div>
<table class="table resources">
<thead>
<tr>
<td>Resource</td>
<td>End Point</td>
<td><wicket:t>Resource</wicket:t></td>
<td><wicket:t>End Point</wicket:t></td>
</tr>
</thead>
<tbody>

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.help;
import static io.onedev.server.web.translation.Translation._T;
import java.util.ArrayList;
import java.util.List;
@ -66,7 +68,7 @@ public class ResourceListPage extends ApiHelpPage {
@Override
protected Component newTopbarTitle(String componentId) {
return new Label(componentId, "Resources");
return new Label(componentId, _T("Resources"));
}
}

View File

@ -21,6 +21,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.ProjectLabelManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.model.Project;
@ -35,7 +36,7 @@ import io.onedev.server.web.page.project.blob.ProjectBlobPage;
import io.onedev.server.web.page.project.children.ProjectChildrenPage;
import io.onedev.server.web.page.project.issues.list.ProjectIssueListPage;
import io.onedev.server.web.page.project.packs.ProjectPacksPage;
import io.onedev.server.web.page.project.setting.general.DefaultRoleBean;
import io.onedev.server.web.page.project.setting.general.DefaultRolesBean;
import io.onedev.server.web.page.project.setting.general.ParentBean;
import io.onedev.server.web.util.editbean.LabelsBean;
@ -60,7 +61,7 @@ public class NewProjectPage extends LayoutPage {
PROP_CODE_MANAGEMENT, PROP_PACK_MANAGEMENT, PROP_ISSUE_MANAGEMENT,
PROP_TIME_TRACKING);
DefaultRoleBean defaultRoleBean = new DefaultRoleBean();
DefaultRolesBean defaultRolesBean = new DefaultRolesBean();
LabelsBean labelsBean = new LabelsBean();
ParentBean parentBean = new ParentBean();
if (parentId != null)
@ -85,11 +86,11 @@ public class NewProjectPage extends LayoutPage {
Project newProject = getProjectManager().setup(projectPath);
if (editProject.getKey() != null && getProjectManager().findByKey(editProject.getKey()) != null) {
editor.error(new Path(new PathNode.Named(PROP_KEY)),
"This key has already been used by another project");
_T("This key has already been used by another project"));
}
if (!newProject.isNew()) {
editor.error(new Path(new PathNode.Named(PROP_NAME)),
"This name has already been used by another project");
_T("This name has already been used by another project"));
}
if (editor.isValid()) {
newProject.setKey(editProject.getKey());
@ -98,14 +99,14 @@ public class NewProjectPage extends LayoutPage {
newProject.setIssueManagement(editProject.isIssueManagement());
newProject.setPackManagement(editProject.isPackManagement());
newProject.setTimeTracking(editProject.isTimeTracking());
newProject.setDefaultRole(defaultRoleBean.getRole());
OneDev.getInstance(TransactionManager.class).run(() -> {
getProjectManager().create(newProject);
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(newProject, defaultRolesBean.getRoles());
OneDev.getInstance(ProjectLabelManager.class).sync(newProject, labelsBean.getLabels());
});
Session.get().success("New project created");
Session.get().success(_T("New project created"));
if (newProject.isCodeManagement())
setResponsePage(ProjectBlobPage.class, ProjectBlobPage.paramsOf(newProject));
else if (newProject.isIssueManagement())
@ -126,7 +127,7 @@ public class NewProjectPage extends LayoutPage {
};
form.add(editor);
form.add(labelsEditor);
form.add(BeanContext.edit("defaultRoleEditor", defaultRoleBean));
form.add(BeanContext.edit("defaultRoleEditor", defaultRolesBean));
form.add(parentEditor);
add(form);
}

View File

@ -1,47 +0,0 @@
package io.onedev.server.web.page.project.setting.general;
import java.io.Serializable;
import javax.annotation.Nullable;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
@Editable
public class DefaultRoleBean implements Serializable {
private static final long serialVersionUID = 1L;
private String roleName;
@Editable(name="Default Role", placeholder="Inherit from parent", rootPlaceholder ="No default role", description="Default role affects default " +
"permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this " +
"project and all its parent projects")
@RoleChoice
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public void setRole(@Nullable Role role) {
if (role != null)
roleName = role.getName();
else
roleName = null;
}
@Nullable
public Role getRole() {
if (roleName != null)
return OneDev.getInstance(RoleManager.class).find(roleName);
else
return null;
}
}

View File

@ -0,0 +1,42 @@
package io.onedev.server.web.page.project.setting.general;
import static java.util.stream.Collectors.toList;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import io.onedev.server.OneDev;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
@Editable
public class DefaultRolesBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> roleNames = new ArrayList<>();
@Editable(name="Default Roles", placeholder="Inherit from parent", rootPlaceholder ="No default roles", description="Default roles affect default " +
"permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this " +
"project and all its parent projects")
@RoleChoice
public List<String> getRoleNames() {
return roleNames;
}
public void setRoleNames(List<String> roleNames) {
this.roleNames = roleNames;
}
public void setRoles(List<Role> roles) {
roleNames = roles.stream().map(Role::getName).collect(toList());
}
public List<Role> getRoles() {
return roleNames.stream().map(OneDev.getInstance(RoleManager.class)::find).collect(toList());
}
}

View File

@ -12,6 +12,7 @@ import static io.onedev.server.web.translation.Translation._T;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.stream.Collectors;
import org.apache.wicket.Component;
import org.apache.wicket.Session;
@ -28,6 +29,7 @@ import com.google.common.base.Objects;
import com.google.common.collect.Sets;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.ProjectLabelManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.model.Project;
@ -59,8 +61,8 @@ public class GeneralProjectSettingPage extends ProjectSettingPage {
PROP_DESCRIPTION, PROP_CODE_MANAGEMENT, PROP_PACK_MANAGEMENT,
PROP_ISSUE_MANAGEMENT, PROP_TIME_TRACKING);
DefaultRoleBean defaultRoleBean = new DefaultRoleBean();
defaultRoleBean.setRole(getProject().getDefaultRole());
DefaultRolesBean defaultRolesBean = new DefaultRolesBean();
defaultRolesBean.setRoles(getProject().getBaseAuthorizations().stream().map(it->it.getRole()).collect(Collectors.toList()));
LabelsBean labelsBean = LabelsBean.of(getProject());
@ -86,7 +88,7 @@ public class GeneralProjectSettingPage extends ProjectSettingPage {
}, properties, false);
BeanEditor defaultRoleEditor = BeanContext.edit("defaultRoleEditor", defaultRoleBean);
BeanEditor defaultRoleEditor = BeanContext.edit("defaultRoleEditor", defaultRolesBean);
BeanEditor labelsEditor = BeanContext.edit("labelsEditor", labelsBean);
BeanEditor parentEditor = BeanContext.edit("parentEditor", parentBean);
@ -143,13 +145,14 @@ public class GeneralProjectSettingPage extends ProjectSettingPage {
}
}
if (editor.isValid()) {
project.setDefaultRole(defaultRoleBean.getRole());
OneDev.getInstance(TransactionManager.class).run(new Runnable() {
@Override
public void run() {
var project = getProject();
getProjectManager().update(project);
OneDev.getInstance(ProjectLabelManager.class).sync(getProject(), labelsBean.getLabels());
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(project, defaultRolesBean.getRoles());
OneDev.getInstance(ProjectLabelManager.class).sync(project, labelsBean.getLabels());
}
});

View File

@ -1,8 +1,8 @@
<wicket:extend>
<div wicket:id="error">
<div class="actions">
<a wicket:id="home" class="btn btn-light-primary">Back To Home</a>
<a wicket:id="showDetail" class="btn btn-primary">Show Error Detail</a>
<a wicket:id="home" class="btn btn-light-primary"><wicket:t>Back To Home</wicket:t></a>
<a wicket:id="showDetail" class="btn btn-primary"><wicket:t>Show Error Detail</wicket:t></a>
</div>
<div wicket:id="errorDetail" class="position-relative"></div>
</div>

View File

@ -1,5 +1,6 @@
package io.onedev.server.web.page.simple.error;
import static io.onedev.server.web.translation.Translation._T;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import java.io.Serializable;
@ -56,7 +57,7 @@ public class GeneralErrorPage extends SimplePage {
title = response.getBody() != null? response.getBody().getText(): HttpStatus.getMessage(response.getStatus());
statusCode = response.getStatus();
} else {
title = "An unexpected exception occurred";
title = _T("An unexpected exception occurred");
detailMessage = Throwables.getStackTraceAsString(exception);
statusCode = SC_INTERNAL_SERVER_ERROR;
}
@ -81,7 +82,7 @@ public class GeneralErrorPage extends SimplePage {
setResponsePage(HomePage.class);
}
}.setBody(Model.of("Sync Replica Status and Back to Home")));
}.setBody(Model.of(_T("Sync Replica Status and Back to Home"))));
} else {
container.add(new ViewStateAwarePageLink<Void>("home", HomePage.class));
}
@ -121,7 +122,7 @@ public class GeneralErrorPage extends SimplePage {
@Override
protected String getTitle() {
return "OOPS! There Is An Error";
return _T("OOPS! There Is An Error");
}
@Override

View File

@ -1,4 +1,4 @@
<wicket:extend>
<pre wicket:id="inUseDetail" class="mb-5 text-left alert alert-light font-size-sm"></pre>
<a class="btn btn-primary" href="javascript:window.history.back();">Go Back</a>
<a class="btn btn-primary" href="javascript:window.history.back();"><wicket:t>Go Back</wicket:t></a>
</wicket:extend>

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.simple.error;
import static io.onedev.server.web.translation.Translation._T;
import java.io.Serializable;
import javax.servlet.http.HttpServletResponse;
@ -44,12 +46,12 @@ public class InUseErrorPage extends SimplePage {
@Override
protected String getTitle() {
return "Unable To Delete/Disable Right Now";
return _T("Unable To Delete/Disable Right Now");
}
@Override
protected String getSubTitle() {
return "The object you are deleting/disabling is still being used";
return _T("The object you are deleting/disabling is still being used");
}
@Override

View File

@ -1,3 +1,3 @@
<wicket:extend>
<a wicket:id="goHome" class="btn btn-primary">Back To Home</a>
<a wicket:id="goHome" class="btn btn-primary"><wicket:t>Back To Home</wicket:t></a>
</wicket:extend>

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.simple.error;
import static io.onedev.server.web.translation.Translation._T;
import javax.servlet.http.HttpServletResponse;
import org.apache.wicket.markup.html.WebComponent;
@ -29,7 +31,7 @@ public class PageNotFoundErrorPage extends SimplePage {
@Override
protected String getTitle() {
return "Page Not Found";
return _T("Page Not Found");
}
@Override
@ -39,7 +41,7 @@ public class PageNotFoundErrorPage extends SimplePage {
@Override
protected String getSubTitle() {
return "I didn't eat it. I swear!";
return _T("I didn't eat it. I swear!");
}
}

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.simple.security;
import static io.onedev.server.web.translation.Translation._T;
import org.apache.shiro.authc.credential.PasswordService;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.form.Form;
@ -46,9 +48,9 @@ public class CreateUserFromInvitationPage extends SimplePage {
protected UserInvitation load() {
UserInvitation invitation = getInvitationManager().findByInvitationCode(invitationCode);
if (invitation == null)
throw new ExplicitException("Invalid invitation code");
throw new ExplicitException(_T("Invalid invitation code"));
else if (getEmailAddressManager().findByValue(invitation.getEmailAddress()) != null)
throw new ExplicitException("Email address already used: " + invitation.getEmailAddress());
throw new ExplicitException(_T("Email address already used: ") + invitation.getEmailAddress());
else
return invitation;
}
@ -72,7 +74,7 @@ public class CreateUserFromInvitationPage extends SimplePage {
User userWithSameName = getUserManager().findByName(newUser.getName());
if (userWithSameName != null) {
editor.error(new Path(new PathNode.Named(User.PROP_NAME)),
"Login name already used by another account");
_T("Login name already used by another account"));
}
if (editor.isValid()){
@ -95,7 +97,7 @@ public class CreateUserFromInvitationPage extends SimplePage {
createMembership(user, defaultLoginGroup);
});
Session.get().success("Account set up successfully");
Session.get().success(_T("Account set up successfully"));
SecurityUtils.getSubject().runAs(user.getPrincipals());
setResponsePage(MyAvatarPage.class);
}
@ -150,7 +152,7 @@ public class CreateUserFromInvitationPage extends SimplePage {
@Override
protected String getTitle() {
return "Set Up Your Account";
return _T("Set Up Your Account");
}
@Override

View File

@ -1,11 +1,11 @@
<wicket:extend>
<div wicket:id="successful" class="alert alert-light-success font-size-lg font-weight-bolder">
<wicket:svg href="tick-circle" class="icon"/>
Your email address is now verified
<wicket:t>Your email address is now verified</wicket:t>
</div>
<div wicket:id="failed" class="alert alert-light-danger">
<wicket:svg href="times-circle" class="icon"/>
Failed to verify your email address
<wicket:t>Failed to verify your email address</wicket:t>
</div>
<a wicket:id="goHome" class="btn btn-primary">Back To Home</a>
<a wicket:id="goHome" class="btn btn-primary"><wicket:t>Back To Home</wicket:t></a>
</wicket:extend>

View File

@ -1,5 +1,7 @@
package io.onedev.server.web.page.simple.security;
import static io.onedev.server.web.translation.Translation._T;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.model.IModel;
@ -63,7 +65,7 @@ public class EmailAddressVerificationPage extends SimplePage {
@Override
protected String getTitle() {
return "Email Address Verification";
return _T("Email Address Verification");
}
@Override

View File

@ -29,8 +29,8 @@ public class OAuthCallbackPage extends SimplePage {
code = params.get(PARAM_CODE).toString();
if (!state.equals(Session.get().getAttribute("oauthState"))) {
throw new ExplicitException("Invalid state. Please make sure you are visiting "
+ "OneDev using server url specified in system setting");
throw new ExplicitException(_T("Invalid state. Please make sure you are visiting "
+ "OneDev using server url specified in system setting"));
} else {
Session.get().setAttribute("oauthCode", code);
}

View File

@ -6,18 +6,18 @@
<div class="form-group">
<input wicket:id="loginNameOrEmail" autocomplete="username" type="text" class="form-control" t:placeholder="Login name or email">
</div>
<button wicket:id="resettingPassword" class="btn btn-primary font-weight-bold mr-1" type="submit">Reset</button>
<button wicket:id="cancel" class="btn btn-light-primary font-weight-bold">Cancel</button>
<button wicket:id="resettingPassword" class="btn btn-primary font-weight-bold mr-1" type="submit"><wicket:t>Reset</wicket:t></button>
<button wicket:id="cancel" class="btn btn-light-primary font-weight-bold"><wicket:t>Cancel</wicket:t></button>
</form>
</wicket:fragment>
<wicket:fragment wicket:id="resetFrag">
<form wicket:id="form" method="post">
<div wicket:id="editor"></div>
<button class="btn btn-primary font-weight-bold mr-1" type="submit">Ok</button>
<button wicket:id="cancel" class="btn btn-light-primary font-weight-bold">Cancel</button>
<button class="btn btn-primary font-weight-bold mr-1" type="submit"><wicket:t>Ok</wicket:t></button>
<button wicket:id="cancel" class="btn btn-light-primary font-weight-bold"><wicket:t>Cancel</wicket:t></button>
</form>
</wicket:fragment>
<wicket:fragment wicket:id="invalidPasswordResetCodeFrag">
<div class="alert alert-light-danger">The password reset url is invalid or obsolete</div>
<div class="alert alert-light-danger"><wicket:t>The password reset url is invalid or obsolete</wicket:t></div>
</wicket:fragment>
</wicket:extend>

View File

@ -78,6 +78,14 @@ public class PasswordResetPage extends SimplePage {
}).setLabel(Model.of(_T("Login name or email"))).setRequired(true));
var noUserFoundMessage = _T("No user found with login name or email: ") + loginNameOrEmail;
var serviceAccountOrDisabledUserMessage = _T("Can not reset password for service account or disabled user");
var authenticatedViaExternalSystemMessage = _T("Can not reset password for user authenticating via external system");
var primaryEmailNotSpecifiedMessage = _T("Primary email address not specified");
var primaryEmailNotVerifiedMessage = _T("Your primary email address is not verified");
var checkMailMessage = _T("Please check your email for password reset instructions");
var mailServiceNotConfiguredMessage = _T("Unable to send password reset email as mail service is not configured");
form.add(new TaskButton("resettingPassword") {
@Override
@ -94,11 +102,11 @@ public class PasswordResetPage extends SimplePage {
if (user == null)
user = getUserManager().findByVerifiedEmailAddress(loginNameOrEmail);
if (user == null) {
throw new ExplicitException("No user found with login name or email: " + loginNameOrEmail);
throw new ExplicitException(noUserFoundMessage);
} else if (user.isServiceAccount() || user.isDisabled()) {
throw new ExplicitException("Can not reset password for service account or disabled user");
throw new ExplicitException(serviceAccountOrDisabledUserMessage);
} else if (user.getPassword() == null) {
throw new ExplicitException("Can not reset password for user authenticating via external system");
throw new ExplicitException(authenticatedViaExternalSystemMessage);
} else {
SettingManager settingManager = OneDev.getInstance(SettingManager.class);
if (settingManager.getMailService() != null) {
@ -122,9 +130,9 @@ public class PasswordResetPage extends SimplePage {
} else {
EmailAddress emailAddress = user.getPrimaryEmailAddress();
if (emailAddress == null)
throw new ExplicitException("Primary email address not specified");
throw new ExplicitException(primaryEmailNotSpecifiedMessage);
else if (!emailAddress.isVerified())
throw new ExplicitException("Your primary email address is not verified");
throw new ExplicitException(primaryEmailNotVerifiedMessage);
else
emailAddressValue = emailAddress.getValue();
}
@ -134,9 +142,9 @@ public class PasswordResetPage extends SimplePage {
"[Password Reset] You are Requesting to Reset Your OneDev Password",
htmlBody, textBody, null, null, null);
return new TaskResult(true, new PlainMessage("Please check your email for password reset instructions"));
return new TaskResult(true, new PlainMessage(checkMailMessage));
} else {
return new TaskResult(false, new PlainMessage("Unable to send password reset email as mail service is not configured"));
return new TaskResult(false, new PlainMessage(mailServiceNotConfiguredMessage));
}
}
});
@ -168,7 +176,7 @@ public class PasswordResetPage extends SimplePage {
user.setPasswordResetCode(null);
user.setPassword(OneDev.getInstance(PasswordService.class).encryptPassword(bean.getNewPassword()));
getUserManager().update(user, null);
Session.get().success("Password changed. Please login with your new password");
Session.get().success(_T("Password changed. Please login with your new password"));
setResponsePage(LoginPage.class);
}
};
@ -183,7 +191,7 @@ public class PasswordResetPage extends SimplePage {
});
fragment.add(form);
} else {
throw new ExplicitException("Password reset url is invalid or obsolete");
throw new ExplicitException(_T("Password reset url is invalid or obsolete"));
}
}
}
@ -195,15 +203,15 @@ public class PasswordResetPage extends SimplePage {
@Override
protected String getTitle() {
if (passwordResetCode == null)
return "Forgotten Password?";
return _T("Forgotten Password?");
else
return "Enter New Password";
return _T("Enter New Password");
}
@Override
protected String getSubTitle() {
if (passwordResetCode == null)
return "Enter your user name or email to reset password";
return _T("Enter your user name or email to reset password");
else
return null;
}

View File

@ -2,6 +2,6 @@
<form wicket:id="form">
<div wicket:id="editor"></div>
<input wicket:id="save" class="btn btn-primary mr-2" t:value="Sign Up" type="submit">
<a wicket:id="cancel" class="btn btn-light-primary">Cancel</a>
<a wicket:id="cancel" class="btn btn-light-primary"><wicket:t>Cancel</wicket:t></a>
</form>
</wicket:extend>

View File

@ -45,7 +45,7 @@ public class Translation extends TranslationResourceBundle {
var lastModified = classFile.lastModified();
if (lastModified != lastModifiedRef.get()) {
lastModifiedRef.set(lastModified);
Thread.sleep(2000);
Thread.sleep(5000);
onUpdate.run();
}
} catch (InterruptedException e) {

View File

@ -13,7 +13,7 @@ public class Translation_de extends TranslationResourceBundle {
init(m);
});
}
@SystemPrompt("You are good at translating from English to German in DevOps software area.")
public static void init(Map<String, String> m) {
m.clear();
@ -839,8 +839,8 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "Standard-Mehrwertanbieter");
m.put("Default Project", "Standardprojekt");
m.put("Default Project Setting", "Standardprojekteinstellung");
m.put("Default Role", "Standardrolle");
m.put("Default Role Bean", "Standardrollen-Bean");
m.put("Default Roles", "Standardrollen");
m.put("Default Roles Bean", "Standardrollen Bean");
m.put("Default Value", "Standardwert");
m.put("Default Value Provider", "Standardwertanbieter");
m.put("Default Values", "Standardwerte");
@ -848,8 +848,8 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Default branding settings restored", "Standard-Branding-Einstellungen wiederhergestellt");
m.put("Default fixed issue filters saved", "Standard-Filter für behobene Probleme gespeichert");
m.put("Default merge strategy", "Standard-Merge-Strategie");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Die Standardrolle beeinflusst die Standardberechtigungen, die jedem im System gewährt werden. Die tatsächlichen Standardberechtigungen sind <b class='text-warning'>alle Berechtigungen</b>, die in den Standardrollen dieses Projekts und aller übergeordneten Projekte enthalten sind");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Standardrollen beeinflussen die Standardberechtigungen, die jedem im System gewährt werden. Die tatsächlichen Standardberechtigungen werden <b class='text-warning'>alle Berechtigungen</b> sein, die in den Standardrollen dieses Projekts und aller übergeordneten Projekte enthalten sind");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"Definieren Sie hier alle benutzerdefinierten Problemfelder. Jedes Projekt kann entscheiden, ob es alle oder einen Teil dieser Felder über seine Problemübergangseinstellung verwendet. <b class=\"text-warning\">HINWEIS: </b> Neu definierte Felder erscheinen standardmäßig nur in neuen Problemen. Bearbeiten Sie vorhandene Probleme im Batch von der Problemlisten-Seite, wenn Sie möchten, dass sie diese neuen Felder haben");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("File Patterns", "Dateimuster");
m.put("File Protection", "Dateischutz");
m.put("File Protections", "Dateischutzmaßnahmen");
m.put("File and Symbol Search", "Datei- und Symbolsuche");
m.put("File changes", "Dateiänderungen");
m.put("File is too large to edit here", "Datei ist zu groß, um hier bearbeitet zu werden");
m.put("File missing or obsolete", "Datei fehlt oder ist veraltet");
@ -1305,6 +1306,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Force", "Erzwingen");
m.put("Force Garbage Collection", "Müllsammlung erzwingen");
m.put("Forgot Password?", "Passwort vergessen?");
m.put("Fork Project", "Projekt forken");
m.put("Fork now", "Jetzt forken");
m.put("Forks Of", "Forks von");
m.put("Frequencies", "Frequenzen");
@ -1455,10 +1457,10 @@ public class Translation_de extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"Wenn aktiviert, wird der Quellzweig automatisch gelöscht, nachdem der Pull-Request zusammengeführt wurde, wenn der Benutzer die Berechtigung dazu hat");
m.put("If specified, OneDev will only display iterations with this prefix", "Wenn angegeben, zeigt OneDev nur Iterationen mit diesem Präfix an");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"Wenn angegeben, verwenden alle öffentlichen und internen Projekte, die von GitLab importiert wurden, dies als Standardrolle. Private Projekte sind nicht betroffen");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"Wenn angegeben, verwenden alle öffentlichen Repositories, die von GitHub importiert wurden, dies als Standardrolle. Private Repositories sind nicht betroffen");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"Wenn angegeben, werden alle öffentlichen und internen Projekte, die von GitLab importiert werden, diese als Standardrollen verwenden. Private Projekte sind nicht betroffen");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"Wenn angegeben, werden alle öffentlichen Repositories, die von GitHub importiert werden, diese als Standardrollen verwenden. Private Repositories sind nicht betroffen");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"Wenn angegeben, wird die geschätzte/aufgewendete Gesamtzeit eines Problems auch verknüpfte Probleme dieses Typs einschließen");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("New User Bean", "Neue Benutzer-Bean");
m.put("New Value", "Neuer Wert");
m.put("New issue board created", "Neues Issue-Board erstellt");
m.put("New project created", "Neues Projekt erstellt");
m.put("New user created", "Neuer Benutzer erstellt");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"Neue Version verfügbar. Rot für Sicherheits-/kritisches Update, Gelb für Fehlerbehebung, Blau für Funktionsupdate. Klicken, um Änderungen anzuzeigen. Deaktivieren in den Systemeinstellungen");
@ -2000,6 +2003,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("No agents to resume", "Keine Agenten zum Fortsetzen");
m.put("No aggregation", "Keine Aggregation");
m.put("No any", "Kein Einziger");
m.put("No any matches", "Keine Übereinstimmungen");
m.put("No applicable transitions or no permission to transit", "Keine anwendbaren Übergänge oder keine Berechtigung zum Übergang");
m.put("No artifacts published", "Keine Artefakte veröffentlicht");
m.put("No attributes defined (can only be edited when agent is online)", "Keine Attribute definiert (können nur bearbeitet werden, wenn der Agent online ist)");
@ -2026,7 +2030,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("No data", "Keine Daten");
m.put("No default branch", "Kein Standard-Branch");
m.put("No default group", "Keine Standardgruppe");
m.put("No default role", "Keine Standardrolle");
m.put("No default roles", "Keine Standardrollen");
m.put("No default value", "Kein Standardwert");
m.put("No description", "Keine Beschreibung");
m.put("No diffs", "Keine Unterschiede");
@ -2097,6 +2101,8 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Not Active Since", "Nicht aktiv seit");
m.put("Not Used Since", "Nicht verwendet seit");
m.put("Not assigned", "Nicht zugewiesen");
m.put("Not authorized to create project under \"{0}\"", "Nicht berechtigt, ein Projekt unter \"{0}\" zu erstellen");
m.put("Not authorized to create root project", "Nicht berechtigt, ein Root-Projekt zu erstellen");
m.put("Not authorized to move project under this parent", "Keine Berechtigung, Projekt unter diesem Elternteil zu verschieben");
m.put("Not authorized to set as root project", "Keine Berechtigung, als Root-Projekt festzulegen");
m.put("Not covered", "Nicht abgedeckt");
@ -2635,6 +2641,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Project Replicas", "Projekt-Replikate");
m.put("Project authorizations updated", "Projekt-Autorisierungen aktualisiert");
m.put("Project does not have any code yet", "Projekt hat noch keinen Code");
m.put("Project forked", "Projekt geforkt");
m.put("Project id", "Projekt-ID");
m.put("Project list", "Projektliste");
m.put("Project manage privilege required to delete \"{0}\"", "Projekt-Verwaltungsberechtigung erforderlich, um \"{0}\" zu löschen");
@ -2662,7 +2669,7 @@ public class Translation_de extends TranslationResourceBundle {
"Bild-Cache des Docker-Buildx-Builders bereinigen. Dieser Schritt ruft den Docker-Builder-Prune-Befehl auf, um den Cache des angegebenen Buildx-Builders im Server-Docker-Executor oder Remote-Docker-Executor zu entfernen");
m.put("Public", "Öffentlich");
m.put("Public Key", "Öffentlicher Schlüssel");
m.put("Public Role", "Öffentliche Rolle");
m.put("Public Roles", "Öffentliche Rollen");
m.put("Publish", "Veröffentlichen");
m.put("Publish Coverage Report Step", "Schritt zur Veröffentlichung des Abdeckungsberichts");
m.put("Publish Problem Report Step", "Schritt zur Veröffentlichung des Problemberichts");
@ -2973,6 +2980,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Search branch", "Branch suchen");
m.put("Search files, symbols and texts", "Dateien, Symbole und Texte durchsuchen");
m.put("Search for", "Suchen nach");
m.put("Search inside current tree", "Suche im aktuellen Baum");
m.put("Search is too general", "Suche ist zu allgemein");
m.put("Search job", "Job suchen");
m.put("Search project", "Projekt suchen");
@ -3104,6 +3112,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("Show issues in list", "Probleme in der Liste anzeigen");
m.put("Show issues not scheduled into current iteration", "Probleme anzeigen, die nicht in die aktuelle Iteration eingeplant sind");
m.put("Show matching agents", "Passende Agenten anzeigen");
m.put("Show more", "Mehr anzeigen");
m.put("Show more lines", "Mehr Zeilen anzeigen");
m.put("Show next match", "Nächste Übereinstimmung anzeigen");
m.put("Show previous match", "Vorherige Übereinstimmung anzeigen");
@ -4265,6 +4274,7 @@ public class Translation_de extends TranslationResourceBundle {
m.put("found {0} users", "{0} Benutzer gefunden");
m.put("has any value of", "hat einen beliebigen Wert von");
m.put("head", "Kopf");
m.put("in current commit", "im aktuellen Commit");
m.put("ineffective", "unwirksam");
m.put("inherited", "geerbt");
m.put("initial", "initial");
@ -4412,11 +4422,69 @@ public class Translation_de extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "Datei- und Symbolsuche");
m.put("No any matches", "Keine Übereinstimmungen");
m.put("Search inside current tree", "Suche im aktuellen Baum");
m.put("Show more", "Mehr anzeigen");
m.put("in current commit", "im aktuellen Commit");
m.put("Account set up successfully", "Konto erfolgreich eingerichtet");
m.put("All RESTful Resources", "Alle RESTful-Ressourcen");
m.put("An unexpected exception occurred", "Es ist eine unerwartete Ausnahme aufgetreten");
m.put("Back To Home", "Zurück zur Startseite");
m.put("Can not reset password for service account or disabled user", "Passwort kann nicht für Dienstkonto oder deaktivierten Benutzer zurückgesetzt werden");
m.put("Can not reset password for user authenticating via external system", "Passwort kann nicht für Benutzer zurückgesetzt werden, der sich über ein externes System authentifiziert");
m.put("Content Type", "Inhaltstyp");
m.put("Email Address Verification", "E-Mail-Adressüberprüfung");
m.put("Email address already used: ", "E-Mail-Adresse bereits verwendet:");
m.put("End Point", "Endpunkt");
m.put("Enter New Password", "Neues Passwort eingeben");
m.put("Enter your user name or email to reset password", "Geben Sie Ihren Benutzernamen oder Ihre E-Mail ein, um das Passwort zurückzusetzen");
m.put("Error detail of content type &quot;text/plain&quot;", "Fehlerdetails des Inhaltstyps &quot;text/plain&quot;");
m.put("Example", "Beispiel");
m.put("Failed to verify your email address", "Fehler bei der Überprüfung Ihrer E-Mail-Adresse");
m.put("Forgotten Password?", "Passwort vergessen?");
m.put("Go Back", "Zurückgehen");
m.put("Http Method", "HTTP-Methode");
m.put("I didn't eat it. I swear!", "Ich habe es nicht gegessen. Ich schwöre!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"Falls anonymer Zugriff deaktiviert ist oder der anonyme Benutzer nicht genügend Berechtigungen für eine Ressourcenoperation hat, müssen Sie sich authentifizieren, indem Sie Benutzername und Passwort (oder Zugriffstoken) über den HTTP-Basic-Auth-Header bereitstellen");
m.put("Invalid invitation code", "Ungültiger Einladungscode");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"Ungültiger Zustand. Bitte stellen Sie sicher, dass Sie OneDev über die in den Systemeinstellungen angegebene Server-URL besuchen");
m.put("No response body", "Kein Antwortinhalt");
m.put("No user found with login name or email: ", "Kein Benutzer mit Anmeldenamen oder E-Mail gefunden:");
m.put("OOPS! There Is An Error", "OOPS! Es gibt einen Fehler");
m.put("Operation", "Operation");
m.put("Operation Failed", "Operation fehlgeschlagen");
m.put("Operation Successful", "Operation erfolgreich");
m.put("Page Not Found", "Seite nicht gefunden");
m.put("Parameter", "Parameter");
m.put("Password changed. Please login with your new password", "Passwort geändert. Bitte melden Sie sich mit Ihrem neuen Passwort an");
m.put("Password reset url is invalid or obsolete", "Passwort-Reset-URL ist ungültig oder veraltet");
m.put("Placeholder", "Platzhalter");
m.put("Please check your email for password reset instructions", "Bitte überprüfen Sie Ihre E-Mail für Anweisungen zum Zurücksetzen des Passworts");
m.put("Primary email address not specified", "Primäre E-Mail-Adresse nicht angegeben");
m.put("Query Parameters", "Abfrageparameter");
m.put("RESTful API Help", "RESTful API-Hilfe");
m.put("Request Body", "Anfrageinhalt");
m.put("Required", "Erforderlich");
m.put("Reset", "Zurücksetzen");
m.put("Resource", "Ressource");
m.put("Resources", "Ressourcen");
m.put("Response", "Antwort");
m.put("Response Body", "Antwortinhalt");
m.put("Set Up Your Account", "Richten Sie Ihr Konto ein");
m.put("Show Error Detail", "Fehlerdetails anzeigen");
m.put("Status Code", "Statuscode");
m.put("Status code", "Statuscode");
m.put("Status code other than 200 indicating the error type", "Statuscode ungleich 200, der den Fehlertyp angibt");
m.put("Sync Replica Status and Back to Home", "Synchronisieren Sie den Replikatstatus und kehren Sie zur Startseite zurück");
m.put("The object you are deleting/disabling is still being used", "Das Objekt, das Sie löschen/deaktivieren, wird noch verwendet");
m.put("The password reset url is invalid or obsolete", "Die Passwort-Reset-URL ist ungültig oder veraltet");
m.put("There are incompatibilities since your upgraded version", "Es gibt Inkompatibilitäten seit Ihrer aktualisierten Version");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"Dieses Datum verwendet das <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601-Format</a>");
m.put("Unable To Delete/Disable Right Now", "Kann derzeit nicht gelöscht/deaktiviert werden");
m.put("Unable to send password reset email as mail service is not configured", "Passwort-Reset-E-Mail kann nicht gesendet werden, da der Maildienst nicht konfiguriert ist");
m.put("Your email address is now verified", "Ihre E-Mail-Adresse ist jetzt verifiziert");
m.put("Your primary email address is not verified", "Ihre primäre E-Mail-Adresse ist nicht verifiziert");
m.put("cURL Example", "cURL-Beispiel");
m.put("you may show this page later via incompatibilities link in help menu", "Sie können diese Seite später über den Inkompatibilitätslink im Hilfemenü anzeigen");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "Proveedor de valores múltiples predeterminado");
m.put("Default Project", "Proyecto predeterminado");
m.put("Default Project Setting", "Configuración predeterminada del proyecto");
m.put("Default Role", "Rol predeterminado");
m.put("Default Role Bean", "Bean de rol predeterminado");
m.put("Default Roles", "Roles Predeterminados");
m.put("Default Roles Bean", "Bean de Roles Predeterminados");
m.put("Default Value", "Valor predeterminado");
m.put("Default Value Provider", "Proveedor de valor predeterminado");
m.put("Default Values", "Valores predeterminados");
@ -848,8 +848,8 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Default branding settings restored", "Configuraciones de marca predeterminadas restauradas");
m.put("Default fixed issue filters saved", "Filtros de problemas solucionados predeterminados guardados");
m.put("Default merge strategy", "Estrategia de fusión predeterminada");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"El rol predeterminado afecta los permisos predeterminados otorgados a todos en el sistema. Los permisos predeterminados reales serán <b class='text-warning'>todos los permisos</b> contenidos en los roles predeterminados de este proyecto y todos sus proyectos principales");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Los roles predeterminados afectan los permisos predeterminados otorgados a todos en el sistema. Los permisos predeterminados reales serán <b class='text-warning'>todos los permisos</b> contenidos en los roles predeterminados de este proyecto y todos sus proyectos padres");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"Defina todos los campos personalizados de problemas aquí. Cada proyecto puede decidir usar todos o un subconjunto de estos campos a través de su configuración de transición de problemas. <b class=\"text-warning\">NOTA: </b> Los campos recién definidos por defecto solo aparecen en nuevos problemas. Edite en lote los problemas existentes desde la página de lista de problemas si desea que tengan estos nuevos campos");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("File Patterns", "Patrones de Archivo");
m.put("File Protection", "Protección de Archivo");
m.put("File Protections", "Protecciones de Archivo");
m.put("File and Symbol Search", "Búsqueda de Archivos y Símbolos");
m.put("File changes", "Cambios en el Archivo");
m.put("File is too large to edit here", "El archivo es demasiado grande para editar aquí");
m.put("File missing or obsolete", "Archivo faltante u obsoleto");
@ -1305,6 +1306,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Force", "Forzar");
m.put("Force Garbage Collection", "Forzar Recolección de Basura");
m.put("Forgot Password?", "¿Olvidó su Contraseña?");
m.put("Fork Project", "Crear bifurcación del proyecto");
m.put("Fork now", "Bifurcar ahora");
m.put("Forks Of", "Bifurcaciones de");
m.put("Frequencies", "Frecuencias");
@ -1455,10 +1457,10 @@ public class Translation_es extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"Si está habilitado, la rama fuente se eliminará automáticamente después de fusionar la solicitud de extracción si el usuario tiene permiso para hacerlo");
m.put("If specified, OneDev will only display iterations with this prefix", "Si se especifica, OneDev solo mostrará iteraciones con este prefijo");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"Si se especifica, todos los proyectos públicos e internos importados de GitLab usarán esto como rol predeterminado. Los proyectos privados no se ven afectados");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"Si se especifica, todos los repositorios públicos importados de GitHub usarán esto como rol predeterminado. Los repositorios privados no se ven afectados");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"Si se especifica, todos los proyectos públicos e internos importados de GitLab usarán estos como roles predeterminados. Los proyectos privados no se ven afectados");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"Si se especifica, todos los repositorios públicos importados de GitHub usarán estos como roles predeterminados. Los repositorios privados no se ven afectados");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"Si se especifica, el tiempo total estimado/gastado de un problema también incluirá problemas vinculados de este tipo");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("New User Bean", "Nuevo Bean de usuario");
m.put("New Value", "Nuevo valor");
m.put("New issue board created", "Nuevo tablero de incidencias creado");
m.put("New project created", "Nuevo proyecto creado");
m.put("New user created", "Nuevo usuario creado");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"Nueva versión disponible. Rojo para actualización de seguridad/crítica, amarillo para corrección de errores, azul para actualización de características. Haga clic para mostrar los cambios. Deshabilitar en la configuración del sistema");
@ -2000,6 +2003,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("No agents to resume", "No hay agentes para reanudar");
m.put("No aggregation", "No hay agregación");
m.put("No any", "No hay ninguno");
m.put("No any matches", "No hay coincidencias");
m.put("No applicable transitions or no permission to transit", "No hay transiciones aplicables o no hay permiso para transitar");
m.put("No artifacts published", "No se publicaron artefactos");
m.put("No attributes defined (can only be edited when agent is online)", "No hay atributos definidos (solo se pueden editar cuando el agente está en línea)");
@ -2026,7 +2030,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("No data", "No hay datos");
m.put("No default branch", "No hay rama predeterminada");
m.put("No default group", "No hay grupo predeterminado");
m.put("No default role", "No hay rol predeterminado");
m.put("No default roles", "No hay roles predeterminados");
m.put("No default value", "No hay valor predeterminado");
m.put("No description", "No hay descripción");
m.put("No diffs", "No hay diferencias");
@ -2097,6 +2101,8 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Not Active Since", "No activo desde");
m.put("Not Used Since", "No usado desde");
m.put("Not assigned", "No asignado");
m.put("Not authorized to create project under \"{0}\"", "No autorizado para crear un proyecto bajo \"{0}\"");
m.put("Not authorized to create root project", "No autorizado para crear un proyecto raíz");
m.put("Not authorized to move project under this parent", "No autorizado para mover el proyecto bajo este padre");
m.put("Not authorized to set as root project", "No autorizado para establecer como proyecto raíz");
m.put("Not covered", "No cubierto");
@ -2635,6 +2641,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Project Replicas", "Réplicas del proyecto");
m.put("Project authorizations updated", "Autorizaciones del proyecto actualizadas");
m.put("Project does not have any code yet", "El proyecto aún no tiene ningún código");
m.put("Project forked", "Proyecto bifurcado");
m.put("Project id", "Id del proyecto");
m.put("Project list", "Lista de proyectos");
m.put("Project manage privilege required to delete \"{0}\"", "Se requiere privilegio de gestión del proyecto para eliminar \"{0}\"");
@ -2662,7 +2669,7 @@ public class Translation_es extends TranslationResourceBundle {
"Limpiar la caché de imágenes del constructor de docker buildx. Este paso ejecuta el comando docker builder prune para eliminar la caché del constructor buildx especificado en el ejecutor docker del servidor o el ejecutor docker remoto");
m.put("Public", "Público");
m.put("Public Key", "Clave pública");
m.put("Public Role", "Rol público");
m.put("Public Roles", "Roles Públicos");
m.put("Publish", "Publicar");
m.put("Publish Coverage Report Step", "Paso de publicación del informe de cobertura");
m.put("Publish Problem Report Step", "Paso de publicación del informe de problemas");
@ -2973,6 +2980,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Search branch", "Buscar rama.");
m.put("Search files, symbols and texts", "Buscar archivos, símbolos y textos.");
m.put("Search for", "Buscar por.");
m.put("Search inside current tree", "Buscar dentro del árbol actual");
m.put("Search is too general", "La búsqueda es demasiado general.");
m.put("Search job", "Buscar trabajo.");
m.put("Search project", "Buscar proyecto.");
@ -3104,6 +3112,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("Show issues in list", "Mostrar problemas en la lista");
m.put("Show issues not scheduled into current iteration", "Mostrar problemas no programados en la iteración actual");
m.put("Show matching agents", "Mostrar agentes coincidentes");
m.put("Show more", "Mostrar más");
m.put("Show more lines", "Mostrar más líneas");
m.put("Show next match", "Mostrar siguiente coincidencia");
m.put("Show previous match", "Mostrar coincidencia anterior");
@ -4265,6 +4274,7 @@ public class Translation_es extends TranslationResourceBundle {
m.put("found {0} users", "encontrados {0} usuarios");
m.put("has any value of", "tiene algún valor de");
m.put("head", "cabecera");
m.put("in current commit", "en el commit actual");
m.put("ineffective", "ineficaz");
m.put("inherited", "heredado");
m.put("initial", "inicial");
@ -4412,11 +4422,69 @@ public class Translation_es extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "Búsqueda de Archivos y Símbolos");
m.put("No any matches", "No hay coincidencias");
m.put("Search inside current tree", "Buscar dentro del árbol actual");
m.put("Show more", "Mostrar más");
m.put("in current commit", "en el commit actual");
m.put("Account set up successfully", "Configuración de cuenta exitosa");
m.put("All RESTful Resources", "Todos los recursos RESTful");
m.put("An unexpected exception occurred", "Ocurrió una excepción inesperada");
m.put("Back To Home", "Volver a Inicio");
m.put("Can not reset password for service account or disabled user", "No se puede restablecer la contraseña para la cuenta de servicio o usuario deshabilitado");
m.put("Can not reset password for user authenticating via external system", "No se puede restablecer la contraseña para el usuario que se autentica a través de un sistema externo");
m.put("Content Type", "Tipo de contenido");
m.put("Email Address Verification", "Verificación de dirección de correo electrónico");
m.put("Email address already used: ", "Dirección de correo electrónico ya utilizada:");
m.put("End Point", "Punto final");
m.put("Enter New Password", "Ingrese nueva contraseña");
m.put("Enter your user name or email to reset password", "Ingrese su nombre de usuario o correo electrónico para restablecer la contraseña");
m.put("Error detail of content type &quot;text/plain&quot;", "Detalle de error del tipo de contenido &quot;text/plain&quot;");
m.put("Example", "Ejemplo");
m.put("Failed to verify your email address", "No se pudo verificar su dirección de correo electrónico");
m.put("Forgotten Password?", "¿Contraseña olvidada?");
m.put("Go Back", "Regresar");
m.put("Http Method", "Método Http");
m.put("I didn't eat it. I swear!", "No me lo comí. ¡Lo juro!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"En caso de que el acceso anónimo esté deshabilitado o el usuario anónimo no tenga suficiente permiso para una operación de recurso, necesitará autenticarse proporcionando nombre de usuario y contraseña (o token de acceso) a través del encabezado de autenticación básica http");
m.put("Invalid invitation code", "Código de invitación inválido");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"Estado inválido. Por favor asegúrese de estar visitando OneDev usando la URL del servidor especificada en la configuración del sistema");
m.put("No response body", "Sin cuerpo de respuesta");
m.put("No user found with login name or email: ", "No se encontró usuario con nombre de inicio de sesión o correo electrónico:");
m.put("OOPS! There Is An Error", "¡UPS! Hay un error");
m.put("Operation", "Operación");
m.put("Operation Failed", "Operación fallida");
m.put("Operation Successful", "Operación exitosa");
m.put("Page Not Found", "Página no encontrada");
m.put("Parameter", "Parámetro");
m.put("Password changed. Please login with your new password", "Contraseña cambiada. Por favor inicie sesión con su nueva contraseña");
m.put("Password reset url is invalid or obsolete", "La URL de restablecimiento de contraseña es inválida o obsoleta");
m.put("Placeholder", "Marcador de posición");
m.put("Please check your email for password reset instructions", "Por favor revise su correo electrónico para las instrucciones de restablecimiento de contraseña");
m.put("Primary email address not specified", "Dirección de correo electrónico principal no especificada");
m.put("Query Parameters", "Parámetros de consulta");
m.put("RESTful API Help", "Ayuda de API RESTful");
m.put("Request Body", "Cuerpo de la solicitud");
m.put("Required", "Requerido");
m.put("Reset", "Restablecer");
m.put("Resource", "Recurso");
m.put("Resources", "Recursos");
m.put("Response", "Respuesta");
m.put("Response Body", "Cuerpo de la respuesta");
m.put("Set Up Your Account", "Configure su cuenta");
m.put("Show Error Detail", "Mostrar detalle de error");
m.put("Status Code", "Código de estado");
m.put("Status code", "Código de estado");
m.put("Status code other than 200 indicating the error type", "Código de estado distinto de 200 indicando el tipo de error");
m.put("Sync Replica Status and Back to Home", "Sincronizar estado de réplica y volver a inicio");
m.put("The object you are deleting/disabling is still being used", "El objeto que está eliminando/deshabilitando todavía está siendo utilizado");
m.put("The password reset url is invalid or obsolete", "La URL de restablecimiento de contraseña es inválida o obsoleta");
m.put("There are incompatibilities since your upgraded version", "Hay incompatibilidades desde su versión actualizada");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"Esta fecha está usando <a href=\"https://www.w3.org/TR/NOTE-datetime\">formato ISO 8601</a>");
m.put("Unable To Delete/Disable Right Now", "No se puede eliminar/deshabilitar en este momento");
m.put("Unable to send password reset email as mail service is not configured", "No se puede enviar el correo electrónico de restablecimiento de contraseña ya que el servicio de correo no está configurado");
m.put("Your email address is now verified", "Su dirección de correo electrónico ahora está verificada");
m.put("Your primary email address is not verified", "Su dirección de correo electrónico principal no está verificada");
m.put("cURL Example", "Ejemplo de cURL");
m.put("you may show this page later via incompatibilities link in help menu", "puede mostrar esta página más tarde a través del enlace de incompatibilidades en el menú de ayuda");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "Fournisseur de valeurs multiples par défaut");
m.put("Default Project", "Projet par défaut");
m.put("Default Project Setting", "Paramètre de projet par défaut");
m.put("Default Role", "Rôle par défaut");
m.put("Default Role Bean", "Bean de rôle par défaut");
m.put("Default Roles", "Rôles par défaut");
m.put("Default Roles Bean", "Bean des rôles par défaut");
m.put("Default Value", "Valeur par défaut");
m.put("Default Value Provider", "Fournisseur de valeur par défaut");
m.put("Default Values", "Valeurs par défaut");
@ -848,8 +848,8 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Default branding settings restored", "Paramètres de marque par défaut restaurés");
m.put("Default fixed issue filters saved", "Filtres de problème résolu par défaut enregistrés");
m.put("Default merge strategy", "Stratégie de fusion par défaut");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Le rôle par défaut affecte les permissions par défaut accordées à tout le monde dans le système. Les permissions par défaut réelles seront <b class='text-warning'>toutes les permissions</b> contenues dans les rôles par défaut de ce projet et de tous ses projets parents");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Les rôles par défaut affectent les autorisations par défaut accordées à tout le monde dans le système. Les autorisations par défaut réelles seront <b class='text-warning'>toutes les autorisations</b> contenues dans les rôles par défaut de ce projet et de tous ses projets parents");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"Définissez tous les champs de problème personnalisés ici. Chaque projet peut décider d'utiliser tous ou une partie de ces champs via son paramètre de transition de problème. <b class=\"text-warning\">NOTE : </b> Les champs nouvellement définis apparaissent par défaut uniquement dans les nouveaux problèmes. Modifiez en lot les problèmes existants depuis la page de liste des problèmes si vous souhaitez qu'ils aient ces nouveaux champs");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("File Patterns", "Modèles de fichiers");
m.put("File Protection", "Protection du fichier");
m.put("File Protections", "Protections des fichiers");
m.put("File and Symbol Search", "Recherche de fichiers et de symboles");
m.put("File changes", "Modifications du fichier");
m.put("File is too large to edit here", "Le fichier est trop volumineux pour être édité ici");
m.put("File missing or obsolete", "Fichier manquant ou obsolète");
@ -1305,6 +1306,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Force", "Forcer");
m.put("Force Garbage Collection", "Forcer la collecte des déchets");
m.put("Forgot Password?", "Mot de passe oublié ?");
m.put("Fork Project", "Forker le projet");
m.put("Fork now", "Fork maintenant");
m.put("Forks Of", "Forks de");
m.put("Frequencies", "Fréquences");
@ -1455,10 +1457,10 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"Si activé, la branche source sera supprimée automatiquement après la fusion de la demande de tirage si l'utilisateur a la permission de le faire");
m.put("If specified, OneDev will only display iterations with this prefix", "Si spécifié, OneDev n'affichera que les itérations avec ce préfixe");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"Si spécifié, tous les projets publics et internes importés de GitLab utiliseront ce rôle par défaut. Les projets privés ne sont pas affectés");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"Si spécifié, tous les dépôts publics importés de GitHub utiliseront ce rôle par défaut. Les dépôts privés ne sont pas affectés");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"Si spécifié, tous les projets publics et internes importés de GitLab utiliseront ceux-ci comme rôles par défaut. Les projets privés ne sont pas affectés");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"Si spécifié, tous les dépôts publics importés de GitHub utiliseront ceux-ci comme rôles par défaut. Les dépôts privés ne sont pas affectés");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"Si spécifié, le temps total estimé/passé d'un problème inclura également les problèmes liés de ce type");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("New User Bean", "Bean d'utilisateur nouveau");
m.put("New Value", "Nouvelle valeur");
m.put("New issue board created", "Nouveau tableau d'issues créé");
m.put("New project created", "Nouveau projet créé");
m.put("New user created", "Nouvel utilisateur créé");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"Nouvelle version disponible. Rouge pour mise à jour de sécurité/critique, jaune pour correction de bug, bleu pour mise à jour de fonctionnalité. Cliquez pour afficher les changements. Désactiver dans les paramètres système");
@ -2000,6 +2003,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("No agents to resume", "Aucun agent à reprendre");
m.put("No aggregation", "Aucune agrégation");
m.put("No any", "Aucun");
m.put("No any matches", "Aucune correspondance");
m.put("No applicable transitions or no permission to transit", "Aucune transition applicable ou aucune permission pour effectuer la transition");
m.put("No artifacts published", "Aucun artefact publié");
m.put("No attributes defined (can only be edited when agent is online)", "Aucun attribut défini (peut être modifié uniquement lorsque l'agent est en ligne)");
@ -2026,7 +2030,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("No data", "Aucune donnée");
m.put("No default branch", "Aucune branche par défaut");
m.put("No default group", "Aucun groupe par défaut");
m.put("No default role", "Aucun rôle par défaut");
m.put("No default roles", "Aucun rôle par défaut");
m.put("No default value", "Aucune valeur par défaut");
m.put("No description", "Aucune description");
m.put("No diffs", "Aucune différence");
@ -2097,6 +2101,8 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Not Active Since", "Non actif depuis");
m.put("Not Used Since", "Non utilisé depuis");
m.put("Not assigned", "Non assigné");
m.put("Not authorized to create project under \"{0}\"", "Non autorisé à créer un projet sous \"{0}\"");
m.put("Not authorized to create root project", "Non autorisé à créer un projet racine");
m.put("Not authorized to move project under this parent", "Non autorisé à déplacer le projet sous ce parent");
m.put("Not authorized to set as root project", "Non autorisé à définir comme projet racine");
m.put("Not covered", "Non couvert");
@ -2635,6 +2641,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Project Replicas", "Répliques du projet");
m.put("Project authorizations updated", "Autorisations de projet mises à jour");
m.put("Project does not have any code yet", "Le projet n'a pas encore de code");
m.put("Project forked", "Projet forké");
m.put("Project id", "Identifiant du projet");
m.put("Project list", "Liste des projets");
m.put("Project manage privilege required to delete \"{0}\"", "Privilège de gestion de projet requis pour supprimer \"{0}\"");
@ -2662,7 +2669,7 @@ public class Translation_fr extends TranslationResourceBundle {
"Nettoyer le cache d'image du constructeur docker buildx. Cette étape appelle la commande docker builder prune pour supprimer le cache du constructeur buildx spécifié dans l'exécuteur docker du serveur ou l'exécuteur docker distant");
m.put("Public", "Public");
m.put("Public Key", "Clé publique");
m.put("Public Role", "Rôle public");
m.put("Public Roles", "Rôles publics");
m.put("Publish", "Publier");
m.put("Publish Coverage Report Step", "Étape de publication du rapport de couverture");
m.put("Publish Problem Report Step", "Étape de publication du rapport de problème");
@ -2973,6 +2980,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Search branch", "Rechercher une branche");
m.put("Search files, symbols and texts", "Rechercher des fichiers, des symboles et des textes");
m.put("Search for", "Rechercher pour");
m.put("Search inside current tree", "Rechercher dans l'arborescence actuelle");
m.put("Search is too general", "La recherche est trop générale");
m.put("Search job", "Rechercher un travail");
m.put("Search project", "Rechercher un projet");
@ -3104,6 +3112,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("Show issues in list", "Afficher les problèmes dans la liste");
m.put("Show issues not scheduled into current iteration", "Afficher les problèmes non planifiés dans l'itération actuelle");
m.put("Show matching agents", "Afficher les agents correspondants");
m.put("Show more", "Afficher plus");
m.put("Show more lines", "Afficher plus de lignes");
m.put("Show next match", "Afficher la correspondance suivante");
m.put("Show previous match", "Afficher la correspondance précédente");
@ -4265,6 +4274,7 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("found {0} users", "trouvé {0} utilisateurs");
m.put("has any value of", "a une valeur quelconque de");
m.put("head", "tête");
m.put("in current commit", "dans le commit actuel");
m.put("ineffective", "inefficace");
m.put("inherited", "hérité");
m.put("initial", "initial");
@ -4412,11 +4422,69 @@ public class Translation_fr extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "Recherche de fichiers et de symboles");
m.put("No any matches", "Aucune correspondance");
m.put("Search inside current tree", "Rechercher dans l'arborescence actuelle");
m.put("Show more", "Afficher plus");
m.put("in current commit", "dans le commit actuel");
m.put("Account set up successfully", "Configuration du compte réussie");
m.put("All RESTful Resources", "Toutes les ressources RESTful");
m.put("An unexpected exception occurred", "Une exception inattendue s'est produite");
m.put("Back To Home", "Retour à l'accueil");
m.put("Can not reset password for service account or disabled user", "Impossible de réinitialiser le mot de passe pour un compte de service ou un utilisateur désactivé");
m.put("Can not reset password for user authenticating via external system", "Impossible de réinitialiser le mot de passe pour un utilisateur s'authentifiant via un système externe");
m.put("Content Type", "Type de contenu");
m.put("Email Address Verification", "Vérification de l'adresse e-mail");
m.put("Email address already used: ", "Adresse e-mail déjà utilisée :");
m.put("End Point", "Point de terminaison");
m.put("Enter New Password", "Entrez un nouveau mot de passe");
m.put("Enter your user name or email to reset password", "Entrez votre nom d'utilisateur ou e-mail pour réinitialiser le mot de passe");
m.put("Error detail of content type &quot;text/plain&quot;", "Détail de l'erreur du type de contenu &quot;text/plain&quot;");
m.put("Example", "Exemple");
m.put("Failed to verify your email address", "Échec de la vérification de votre adresse e-mail");
m.put("Forgotten Password?", "Mot de passe oublié ?");
m.put("Go Back", "Retourner");
m.put("Http Method", "Méthode Http");
m.put("I didn't eat it. I swear!", "Je ne l'ai pas mangé. Je le jure !");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"En cas d'accès anonyme désactivé ou si l'utilisateur anonyme n'a pas suffisamment de permissions pour une opération de ressource, vous devrez vous authentifier en fournissant un nom d'utilisateur et un mot de passe (ou un jeton d'accès) via l'en-tête d'authentification basique http");
m.put("Invalid invitation code", "Code d'invitation invalide");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"État invalide. Veuillez vous assurer que vous visitez OneDev en utilisant l'URL du serveur spécifiée dans les paramètres système");
m.put("No response body", "Aucun corps de réponse");
m.put("No user found with login name or email: ", "Aucun utilisateur trouvé avec le nom de connexion ou l'e-mail :");
m.put("OOPS! There Is An Error", "OUPS ! Il y a une erreur");
m.put("Operation", "Opération");
m.put("Operation Failed", "Échec de l'opération");
m.put("Operation Successful", "Opération réussie");
m.put("Page Not Found", "Page non trouvée");
m.put("Parameter", "Paramètre");
m.put("Password changed. Please login with your new password", "Mot de passe changé. Veuillez vous connecter avec votre nouveau mot de passe");
m.put("Password reset url is invalid or obsolete", "L'URL de réinitialisation du mot de passe est invalide ou obsolète");
m.put("Placeholder", "Espace réservé");
m.put("Please check your email for password reset instructions", "Veuillez vérifier votre e-mail pour les instructions de réinitialisation du mot de passe");
m.put("Primary email address not specified", "Adresse e-mail principale non spécifiée");
m.put("Query Parameters", "Paramètres de requête");
m.put("RESTful API Help", "Aide API RESTful");
m.put("Request Body", "Corps de la requête");
m.put("Required", "Requis");
m.put("Reset", "Réinitialiser");
m.put("Resource", "Ressource");
m.put("Resources", "Ressources");
m.put("Response", "Réponse");
m.put("Response Body", "Corps de la réponse");
m.put("Set Up Your Account", "Configurez votre compte");
m.put("Show Error Detail", "Afficher le détail de l'erreur");
m.put("Status Code", "Code de statut");
m.put("Status code", "Code de statut");
m.put("Status code other than 200 indicating the error type", "Code de statut autre que 200 indiquant le type d'erreur");
m.put("Sync Replica Status and Back to Home", "Synchroniser le statut de la réplique et retourner à l'accueil");
m.put("The object you are deleting/disabling is still being used", "L'objet que vous supprimez/désactivez est toujours utilisé");
m.put("The password reset url is invalid or obsolete", "L'URL de réinitialisation du mot de passe est invalide ou obsolète");
m.put("There are incompatibilities since your upgraded version", "Il y a des incompatibilités depuis votre version mise à jour");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"Cette date utilise le <a href=\"https://www.w3.org/TR/NOTE-datetime\">format ISO 8601</a>");
m.put("Unable To Delete/Disable Right Now", "Impossible de supprimer/désactiver pour le moment");
m.put("Unable to send password reset email as mail service is not configured", "Impossible d'envoyer l'e-mail de réinitialisation du mot de passe car le service de messagerie n'est pas configuré");
m.put("Your email address is now verified", "Votre adresse e-mail est maintenant vérifiée");
m.put("Your primary email address is not verified", "Votre adresse e-mail principale n'est pas vérifiée");
m.put("cURL Example", "Exemple cURL");
m.put("you may show this page later via incompatibilities link in help menu", "vous pouvez afficher cette page plus tard via le lien des incompatibilités dans le menu d'aide");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "Provider Valore Multiplo Predefinito");
m.put("Default Project", "Progetto Predefinito");
m.put("Default Project Setting", "Impostazione Progetto Predefinita");
m.put("Default Role", "Ruolo Predefinito");
m.put("Default Role Bean", "Bean Ruolo Predefinito");
m.put("Default Roles", "Ruoli Predefiniti");
m.put("Default Roles Bean", "Bean Ruoli Predefiniti");
m.put("Default Value", "Valore Predefinito");
m.put("Default Value Provider", "Provider Valore Predefinito");
m.put("Default Values", "Valori Predefiniti");
@ -848,8 +848,8 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Default branding settings restored", "Impostazioni di branding predefinite ripristinate");
m.put("Default fixed issue filters saved", "Filtri problemi risolti predefiniti salvati");
m.put("Default merge strategy", "Strategia di merge predefinita");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Il ruolo predefinito influisce sui permessi predefiniti concessi a tutti nel sistema. I permessi predefiniti effettivi saranno <b class='text-warning'>tutti i permessi</b> contenuti nei ruoli predefiniti di questo progetto e di tutti i suoi progetti genitori");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"I ruoli predefiniti influenzano i permessi predefiniti concessi a tutti nel sistema. I permessi predefiniti effettivi saranno <b class='text-warning'>tutti i permessi</b> contenuti nei ruoli predefiniti di questo progetto e di tutti i suoi progetti genitori");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"Definisci qui tutti i campi personalizzati dei problemi. Ogni progetto può decidere di utilizzare tutti o un sottoinsieme di questi campi tramite la sua impostazione di transizione dei problemi. <b class=\"text-warning\">NOTA: </b> I campi appena definiti per impostazione predefinita appaiono solo nei nuovi problemi. Modifica in batch i problemi esistenti dalla pagina dell'elenco dei problemi se desideri che abbiano questi nuovi campi");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("File Patterns", "Modelli File");
m.put("File Protection", "Protezione File");
m.put("File Protections", "Protezioni File");
m.put("File and Symbol Search", "Ricerca di File e Simboli");
m.put("File changes", "modifiche file");
m.put("File is too large to edit here", "Il file è troppo grande per essere modificato qui");
m.put("File missing or obsolete", "File mancante o obsoleto");
@ -1305,6 +1306,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Force", "Forza");
m.put("Force Garbage Collection", "Forza Raccolta Garbage");
m.put("Forgot Password?", "Password Dimenticata?");
m.put("Fork Project", "Fork Progetto");
m.put("Fork now", "Fai un Fork ora");
m.put("Forks Of", "Fork di");
m.put("Frequencies", "Frequenze");
@ -1455,10 +1457,10 @@ public class Translation_it extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"Se abilitato, il branch sorgente verrà eliminato automaticamente dopo la fusione della pull request se l'utente ha il permesso di farlo");
m.put("If specified, OneDev will only display iterations with this prefix", "Se specificato, OneDev mostrerà solo le iterazioni con questo prefisso");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"Se specificato, tutti i progetti pubblici e interni importati da GitLab utilizzeranno questo ruolo come predefinito. I progetti privati non sono interessati");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"Se specificato, tutti i repository pubblici importati da GitHub utilizzeranno questo ruolo come predefinito. I repository privati non sono interessati");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"Se specificato, tutti i progetti pubblici e interni importati da GitLab utilizzeranno questi come ruoli predefiniti. I progetti privati non sono interessati");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"Se specificato, tutti i repository pubblici importati da GitHub utilizzeranno questi come ruoli predefiniti. I repository privati non sono interessati");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"Se specificato, il tempo totale stimato/speso di un problema includerà anche i problemi collegati di questo tipo");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("New User Bean", "Bean utente nuovo");
m.put("New Value", "Nuovo valore");
m.put("New issue board created", "Nuova bacheca di issue creata");
m.put("New project created", "Nuovo progetto creato");
m.put("New user created", "Nuovo utente creato");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"Nuova versione disponibile. Rosso per aggiornamenti di sicurezza/critici, giallo per correzioni di bug, blu per aggiornamenti di funzionalità. Clicca per mostrare le modifiche. Disabilita nelle impostazioni di sistema");
@ -2000,6 +2003,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("No agents to resume", "Nessun agente da riprendere");
m.put("No aggregation", "Nessuna aggregazione");
m.put("No any", "Nessuno");
m.put("No any matches", "Nessuna corrispondenza");
m.put("No applicable transitions or no permission to transit", "Nessuna transizione applicabile o nessun permesso per transitare");
m.put("No artifacts published", "Nessun artefatto pubblicato");
m.put("No attributes defined (can only be edited when agent is online)", "Nessun attributo definito (modificabile solo quando l'agente è online)");
@ -2026,7 +2030,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("No data", "Nessun dato");
m.put("No default branch", "Nessun branch predefinito");
m.put("No default group", "Nessun gruppo predefinito");
m.put("No default role", "Nessun ruolo predefinito");
m.put("No default roles", "Nessun ruolo predefinito");
m.put("No default value", "Nessun valore predefinito");
m.put("No description", "Nessuna descrizione");
m.put("No diffs", "Nessuna differenza");
@ -2097,6 +2101,8 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Not Active Since", "Non attivo da");
m.put("Not Used Since", "Non utilizzato da");
m.put("Not assigned", "Non assegnato");
m.put("Not authorized to create project under \"{0}\"", "Non autorizzato a creare un progetto sotto \"{0}\"");
m.put("Not authorized to create root project", "Non autorizzato a creare un progetto root");
m.put("Not authorized to move project under this parent", "Non autorizzato a spostare il progetto sotto questo genitore");
m.put("Not authorized to set as root project", "Non autorizzato a impostare come progetto radice");
m.put("Not covered", "Non coperto");
@ -2635,6 +2641,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Project Replicas", "Repliche del progetto");
m.put("Project authorizations updated", "Autorizzazioni del progetto aggiornate");
m.put("Project does not have any code yet", "Il progetto non ha ancora alcun codice");
m.put("Project forked", "Progetto biforcato");
m.put("Project id", "ID del progetto");
m.put("Project list", "Elenco dei progetti");
m.put("Project manage privilege required to delete \"{0}\"", "Privilegio di gestione del progetto richiesto per eliminare \"{0}\"");
@ -2662,7 +2669,7 @@ public class Translation_it extends TranslationResourceBundle {
"Potare la cache delle immagini del builder docker buildx. Questo passaggio chiama il comando docker builder prune per rimuovere la cache del builder buildx specificato nell'executor docker del server o nell'executor docker remoto");
m.put("Public", "Pubblico");
m.put("Public Key", "Chiave pubblica");
m.put("Public Role", "Ruolo pubblico");
m.put("Public Roles", "Ruoli Pubblici");
m.put("Publish", "Pubblica");
m.put("Publish Coverage Report Step", "Passaggio di pubblicazione del rapporto di copertura");
m.put("Publish Problem Report Step", "Passaggio di pubblicazione del rapporto dei problemi");
@ -2973,6 +2980,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Search branch", "Cerca branch.");
m.put("Search files, symbols and texts", "Cerca file, simboli e testi.");
m.put("Search for", "Cerca per.");
m.put("Search inside current tree", "Cerca all'interno dell'albero corrente");
m.put("Search is too general", "La ricerca è troppo generica.");
m.put("Search job", "Cerca lavoro.");
m.put("Search project", "Cerca progetto.");
@ -3104,6 +3112,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("Show issues in list", "Mostra problematiche nella lista");
m.put("Show issues not scheduled into current iteration", "Mostra problematiche non pianificate nell'iterazione corrente");
m.put("Show matching agents", "Mostra agenti corrispondenti");
m.put("Show more", "Mostra di più");
m.put("Show more lines", "Mostra più righe");
m.put("Show next match", "Mostra corrispondenza successiva");
m.put("Show previous match", "Mostra corrispondenza precedente");
@ -4265,6 +4274,7 @@ public class Translation_it extends TranslationResourceBundle {
m.put("found {0} users", "trovati {0} utenti");
m.put("has any value of", "ha qualsiasi valore di");
m.put("head", "testa");
m.put("in current commit", "nel commit corrente");
m.put("ineffective", "inefficace");
m.put("inherited", "ereditato");
m.put("initial", "iniziale");
@ -4412,11 +4422,69 @@ public class Translation_it extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "Ricerca di File e Simboli");
m.put("No any matches", "Nessuna corrispondenza");
m.put("Search inside current tree", "Cerca all'interno dell'albero corrente");
m.put("Show more", "Mostra di più");
m.put("in current commit", "nel commit corrente");
m.put("Account set up successfully", "Account configurato con successo");
m.put("All RESTful Resources", "Tutte le risorse RESTful");
m.put("An unexpected exception occurred", "Si è verificata un'eccezione imprevista");
m.put("Back To Home", "Torna alla Home");
m.put("Can not reset password for service account or disabled user", "Impossibile reimpostare la password per account di servizio o utente disabilitato");
m.put("Can not reset password for user authenticating via external system", "Impossibile reimpostare la password per utente che si autentica tramite sistema esterno");
m.put("Content Type", "Tipo di Contenuto");
m.put("Email Address Verification", "Verifica Indirizzo Email");
m.put("Email address already used: ", "Indirizzo email già utilizzato:");
m.put("End Point", "Punto di Accesso");
m.put("Enter New Password", "Inserisci Nuova Password");
m.put("Enter your user name or email to reset password", "Inserisci il tuo nome utente o email per reimpostare la password");
m.put("Error detail of content type &quot;text/plain&quot;", "Dettaglio errore del tipo di contenuto &quot;text/plain&quot;");
m.put("Example", "Esempio");
m.put("Failed to verify your email address", "Verifica del tuo indirizzo email fallita");
m.put("Forgotten Password?", "Password Dimenticata?");
m.put("Go Back", "Torna Indietro");
m.put("Http Method", "Metodo Http");
m.put("I didn't eat it. I swear!", "Non l'ho mangiato. Lo giuro!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"Nel caso in cui l'accesso anonimo sia disabilitato o l'utente anonimo non abbia abbastanza permessi per un'operazione di risorsa, sarà necessario autenticarsi fornendo nome utente e password (o token di accesso) tramite l'intestazione di autenticazione di base http");
m.put("Invalid invitation code", "Codice di invito non valido");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"Stato non valido. Assicurati di visitare OneDev utilizzando l'url del server specificato nelle impostazioni di sistema");
m.put("No response body", "Nessun corpo di risposta");
m.put("No user found with login name or email: ", "Nessun utente trovato con nome di login o email:");
m.put("OOPS! There Is An Error", "OOPS! C'è un errore");
m.put("Operation", "Operazione");
m.put("Operation Failed", "Operazione Fallita");
m.put("Operation Successful", "Operazione Riuscita");
m.put("Page Not Found", "Pagina Non Trovata");
m.put("Parameter", "Parametro");
m.put("Password changed. Please login with your new password", "Password cambiata. Effettua il login con la tua nuova password");
m.put("Password reset url is invalid or obsolete", "L'url per reimpostare la password non è valido o è obsoleto");
m.put("Placeholder", "Segnaposto");
m.put("Please check your email for password reset instructions", "Controlla la tua email per le istruzioni di reimpostazione della password");
m.put("Primary email address not specified", "Indirizzo email principale non specificato");
m.put("Query Parameters", "Parametri di Query");
m.put("RESTful API Help", "Guida API RESTful");
m.put("Request Body", "Corpo della Richiesta");
m.put("Required", "Richiesto");
m.put("Reset", "Reimposta");
m.put("Resource", "Risorsa");
m.put("Resources", "Risorse");
m.put("Response", "Risposta");
m.put("Response Body", "Corpo della Risposta");
m.put("Set Up Your Account", "Configura il Tuo Account");
m.put("Show Error Detail", "Mostra Dettaglio Errore");
m.put("Status Code", "Codice di Stato");
m.put("Status code", "Codice di stato");
m.put("Status code other than 200 indicating the error type", "Codice di stato diverso da 200 che indica il tipo di errore");
m.put("Sync Replica Status and Back to Home", "Sincronizza Stato Replica e Torna alla Home");
m.put("The object you are deleting/disabling is still being used", "L'oggetto che stai eliminando/disabilitando è ancora in uso");
m.put("The password reset url is invalid or obsolete", "L'url per reimpostare la password non è valido o è obsoleto");
m.put("There are incompatibilities since your upgraded version", "Ci sono incompatibilità dalla tua versione aggiornata");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"Questa data utilizza il <a href=\"https://www.w3.org/TR/NOTE-datetime\">formato ISO 8601</a>");
m.put("Unable To Delete/Disable Right Now", "Impossibile Eliminare/Disabilitare Ora");
m.put("Unable to send password reset email as mail service is not configured", "Impossibile inviare email di reimpostazione password poiché il servizio di posta non è configurato");
m.put("Your email address is now verified", "Il tuo indirizzo email è ora verificato");
m.put("Your primary email address is not verified", "Il tuo indirizzo email principale non è verificato");
m.put("cURL Example", "Esempio cURL");
m.put("you may show this page later via incompatibilities link in help menu", "puoi mostrare questa pagina più tardi tramite il link delle incompatibilità nel menu di aiuto");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "デフォルトの複数値プロバイダー");
m.put("Default Project", "デフォルトプロジェクト");
m.put("Default Project Setting", "デフォルトプロジェクト設定");
m.put("Default Role", "デフォルトロール");
m.put("Default Role Bean", "デフォルトロールBean");
m.put("Default Roles", "デフォルトの役割");
m.put("Default Roles Bean", "デフォルトの役割Bean");
m.put("Default Value", "デフォルト値");
m.put("Default Value Provider", "デフォルト値プロバイダー");
m.put("Default Values", "デフォルト値");
@ -848,8 +848,8 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Default branding settings restored", "デフォルトのブランディング設定が復元されました");
m.put("Default fixed issue filters saved", "デフォルトの解決済み課題フィルターが保存されました");
m.put("Default merge strategy", "デフォルトのマージ戦略");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"デフォルトロールはシステム内の全員に付与されるデフォルト権限に影響します。実際のデフォルト権限はこのプロジェクトおよびその親プロジェクトのデフォルトロールに含まれる<b class='text-warning'>すべての権限</b>になります");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"デフォルトの役割は、システム内の全員に付与されるデフォルトの権限に影響を与えます。実際のデフォルトの権限は、このプロジェクトとそのすべての親プロジェクトのデフォルトの役割に含まれる<b class='text-warning'>すべての権限</b>になります");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"ここでカスタム課題フィールドをすべて定義します。各プロジェクトは課題遷移設定を通じてこれらのフィールドをすべて使用するか、またはその一部を使用するかを決定できます。<b class=\"text-warning\">注意: </b>新しく定義されたフィールドはデフォルトで新しい課題にのみ表示されます。課題リストページから既存の課題を一括編集してこれらの新しいフィールドを持たせることができます");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("File Patterns", "ファイルパターン");
m.put("File Protection", "ファイル保護");
m.put("File Protections", "ファイル保護一覧");
m.put("File and Symbol Search", "ファイルとシンボル検索");
m.put("File changes", "ファイル変更");
m.put("File is too large to edit here", "ファイルが大きすぎてここでは編集できません");
m.put("File missing or obsolete", "ファイルが欠落しているか廃止されています");
@ -1305,6 +1306,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Force", "強制");
m.put("Force Garbage Collection", "ガベージコレクションを強制");
m.put("Forgot Password?", "パスワードを忘れましたか?");
m.put("Fork Project", "フォークプロジェクト");
m.put("Fork now", "今すぐフォーク");
m.put("Forks Of", "フォーク元");
m.put("Frequencies", "頻度");
@ -1455,10 +1457,10 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"有効化されている場合、プルリクエストをマージした後、ユーザーが権限を持っている場合、ソースブランチは自動的に削除されます");
m.put("If specified, OneDev will only display iterations with this prefix", "指定されている場合、OneDevはこのプレフィックスを持つイテレーションのみを表示します");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"指定されている場合、GitLabからインポートされたすべての公開および内部プロジェクトはこれをデフォルトの役割として使用します。プライベートプロジェクトは影響を受けません");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"指定されている場合、GitHubからインポートされたすべての公開リポジトリはこれをデフォルトの役割として使用します。プライベートリポジトリは影響を受けません");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"指定され場合、GitLabからインポートされたすべての公開および内部プロジェクトはこれをデフォルトの役割として使用します。プライベートプロジェクトには影響しません");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"指定され場合、GitHubからインポートされたすべての公開リポジトリはこれをデフォルトの役割として使用します。プライベートリポジトリには影響しません");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"指定されている場合、課題の総推定/消費時間にはこのタイプのリンクされた課題も含まれます");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("New User Bean", "新しいユーザーBean");
m.put("New Value", "新しい値");
m.put("New issue board created", "新しい課題ボードが作成されました");
m.put("New project created", "新しいプロジェクトが作成されました");
m.put("New user created", "新しいユーザーが作成されました");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"新しいバージョンが利用可能です。セキュリティ/重要な更新は赤、バグ修正は黄色、機能更新は青です。変更を表示するにはクリックしてください。システム設定で無効化できます。");
@ -2000,6 +2003,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("No agents to resume", "再開するエージェントなし");
m.put("No aggregation", "集計なし");
m.put("No any", "何もなし");
m.put("No any matches", "一致するものがありません");
m.put("No applicable transitions or no permission to transit", "適用可能な遷移がないか、遷移する権限がありません");
m.put("No artifacts published", "公開されたアーティファクトなし");
m.put("No attributes defined (can only be edited when agent is online)", "定義された属性なし(エージェントがオンラインの場合のみ編集可能)");
@ -2026,7 +2030,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("No data", "データなし");
m.put("No default branch", "デフォルトブランチなし");
m.put("No default group", "デフォルトグループなし");
m.put("No default role", "デフォルトロールなし");
m.put("No default roles", "デフォルトの役割なし");
m.put("No default value", "デフォルト値なし");
m.put("No description", "説明なし");
m.put("No diffs", "差分なし");
@ -2097,6 +2101,8 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Not Active Since", "以降アクティブではありません");
m.put("Not Used Since", "以降使用されていません");
m.put("Not assigned", "未割り当て");
m.put("Not authorized to create project under \"{0}\"", "\"{0}\"の下にプロジェクトを作成する権限がありません");
m.put("Not authorized to create root project", "ルートプロジェクトを作成する権限がありません");
m.put("Not authorized to move project under this parent", "この親プロジェクトの下にプロジェクトを移動する権限がありません");
m.put("Not authorized to set as root project", "ルートプロジェクトとして設定する権限がありません");
m.put("Not covered", "カバーされていません");
@ -2635,6 +2641,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Project Replicas", "プロジェクトレプリカ");
m.put("Project authorizations updated", "プロジェクト認可が更新されました");
m.put("Project does not have any code yet", "プロジェクトにはまだコードがありません");
m.put("Project forked", "プロジェクトがフォークされました");
m.put("Project id", "プロジェクトID");
m.put("Project list", "プロジェクトリスト");
m.put("Project manage privilege required to delete \"{0}\"", "「{0}」を削除するにはプロジェクト管理権限が必要です");
@ -2662,7 +2669,7 @@ public class Translation_ja extends TranslationResourceBundle {
"Docker buildxビルダーのイメージキャッシュを削除します。このステップは、サーバーDockerエグゼキューターまたはリモートDockerエグゼキューターで指定されたbuildxビルダーのキャッシュを削除するためにdocker builder pruneコマンドを呼び出します");
m.put("Public", "公開");
m.put("Public Key", "公開鍵");
m.put("Public Role", "公開ロール");
m.put("Public Roles", "公開の役割");
m.put("Publish", "公開");
m.put("Publish Coverage Report Step", "カバレッジレポート公開ステップ");
m.put("Publish Problem Report Step", "問題レポート公開ステップ");
@ -2973,6 +2980,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Search branch", "ブランチを検索");
m.put("Search files, symbols and texts", "ファイル、シンボル、テキストを検索");
m.put("Search for", "検索対象");
m.put("Search inside current tree", "現在のツリー内を検索");
m.put("Search is too general", "検索が一般的すぎます");
m.put("Search job", "ジョブを検索");
m.put("Search project", "プロジェクトを検索");
@ -3104,6 +3112,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("Show issues in list", "リスト内の課題を表示");
m.put("Show issues not scheduled into current iteration", "現在のイテレーションにスケジュールされていない課題を表示");
m.put("Show matching agents", "一致するエージェントを表示");
m.put("Show more", "さらに表示");
m.put("Show more lines", "さらに多くの行を表示");
m.put("Show next match", "次の一致を表示");
m.put("Show previous match", "前の一致を表示");
@ -4265,6 +4274,7 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("found {0} users", "{0} ユーザーが見つかりました");
m.put("has any value of", "任意の値を持っています");
m.put("head", "ヘッド");
m.put("in current commit", "現在のコミット内");
m.put("ineffective", "無効");
m.put("inherited", "継承済み");
m.put("initial", "初期");
@ -4412,11 +4422,69 @@ public class Translation_ja extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "ファイルとシンボル検索");
m.put("No any matches", "一致するものがありません");
m.put("Search inside current tree", "現在のツリー内を検索");
m.put("Show more", "さらに表示");
m.put("in current commit", "現在のコミット内");
m.put("Account set up successfully", "アカウントが正常に設定されました");
m.put("All RESTful Resources", "すべてのRESTfulリソース");
m.put("An unexpected exception occurred", "予期しない例外が発生しました");
m.put("Back To Home", "ホームに戻る");
m.put("Can not reset password for service account or disabled user", "サービスアカウントまたは無効なユーザーのパスワードをリセットできません");
m.put("Can not reset password for user authenticating via external system", "外部システムで認証するユーザーのパスワードをリセットできません");
m.put("Content Type", "コンテンツタイプ");
m.put("Email Address Verification", "メールアドレスの確認");
m.put("Email address already used: ", "メールアドレスは既に使用されています:");
m.put("End Point", "エンドポイント");
m.put("Enter New Password", "新しいパスワードを入力");
m.put("Enter your user name or email to reset password", "パスワードをリセットするには、ユーザー名またはメールを入力してください");
m.put("Error detail of content type &quot;text/plain&quot;", "コンテンツタイプ&quot;text/plain&quot;のエラー詳細");
m.put("Example", "");
m.put("Failed to verify your email address", "メールアドレスの確認に失敗しました");
m.put("Forgotten Password?", "パスワードを忘れましたか?");
m.put("Go Back", "戻る");
m.put("Http Method", "HTTPメソッド");
m.put("I didn't eat it. I swear!", "私は食べていません。誓います!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"匿名アクセスが無効になっているか、匿名ユーザーがリソース操作のための十分な権限を持っていない場合、ユーザー名とパスワードまたはアクセストークンをHTTP基本認証ヘッダーを介して提供して認証する必要があります");
m.put("Invalid invitation code", "無効な招待コード");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"無効な状態です。システム設定で指定されたサーバーURLを使用してOneDevを訪問していることを確認してください");
m.put("No response body", "レスポンスボディなし");
m.put("No user found with login name or email: ", "ログイン名またはメールでユーザーが見つかりません:");
m.put("OOPS! There Is An Error", "おっと!エラーがあります");
m.put("Operation", "操作");
m.put("Operation Failed", "操作に失敗しました");
m.put("Operation Successful", "操作が成功しました");
m.put("Page Not Found", "ページが見つかりません");
m.put("Parameter", "パラメータ");
m.put("Password changed. Please login with your new password", "パスワードが変更されました。新しいパスワードでログインしてください");
m.put("Password reset url is invalid or obsolete", "パスワードリセットURLが無効または古くなっています");
m.put("Placeholder", "プレースホルダー");
m.put("Please check your email for password reset instructions", "パスワードリセットの指示についてはメールを確認してください");
m.put("Primary email address not specified", "プライマリメールアドレスが指定されていません");
m.put("Query Parameters", "クエリパラメータ");
m.put("RESTful API Help", "RESTful APIヘルプ");
m.put("Request Body", "リクエストボディ");
m.put("Required", "必須");
m.put("Reset", "リセット");
m.put("Resource", "リソース");
m.put("Resources", "リソース");
m.put("Response", "レスポンス");
m.put("Response Body", "レスポンスボディ");
m.put("Set Up Your Account", "アカウントを設定する");
m.put("Show Error Detail", "エラー詳細を表示");
m.put("Status Code", "ステータスコード");
m.put("Status code", "ステータスコード");
m.put("Status code other than 200 indicating the error type", "エラータイプを示す200以外のステータスコード");
m.put("Sync Replica Status and Back to Home", "レプリカステータスを同期してホームに戻る");
m.put("The object you are deleting/disabling is still being used", "削除/無効化しようとしているオブジェクトはまだ使用されています");
m.put("The password reset url is invalid or obsolete", "パスワードリセットURLが無効または古くなっています");
m.put("There are incompatibilities since your upgraded version", "アップグレードされたバージョンには互換性の問題があります");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"この日付は<a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601形式</a>を使用しています");
m.put("Unable To Delete/Disable Right Now", "今すぐ削除/無効化できません");
m.put("Unable to send password reset email as mail service is not configured", "メールサービスが設定されていないため、パスワードリセットメールを送信できません");
m.put("Your email address is now verified", "メールアドレスが確認されました");
m.put("Your primary email address is not verified", "プライマリメールアドレスが確認されていません");
m.put("cURL Example", "cURLの例");
m.put("you may show this page later via incompatibilities link in help menu", "ヘルプメニューの互換性リンクから後でこのページを表示できます");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "기본 다중 값 제공자");
m.put("Default Project", "기본 프로젝트");
m.put("Default Project Setting", "기본 프로젝트 설정");
m.put("Default Role", "기본 역할");
m.put("Default Role Bean", "기본 역할 빈");
m.put("Default Roles", "기본 역할");
m.put("Default Roles Bean", "기본 역할 빈");
m.put("Default Value", "기본값");
m.put("Default Value Provider", "기본값 제공자");
m.put("Default Values", "기본값들");
@ -848,8 +848,8 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Default branding settings restored", "기본 브랜딩 설정 복원됨");
m.put("Default fixed issue filters saved", "기본 고정 이슈 필터 저장됨");
m.put("Default merge strategy", "기본 병합 전략");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"기본 역할은 시스템 모든 사용자에게 부여되는 기본 권한에 영향을 미칩니다. 실제 기본 권한은 이 프로젝트와 모든 상위 프로젝트의 기본 역할에 포함된 <b class='text-warning'>모든 권한</b>이 니다");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"기본 역할은 시스템 모든 사용자에게 부여되는 기본 권한에 영향을 미칩니다. 실제 기본 권한은 이 프로젝트와 모든 상위 프로젝트의 기본 역할에 포함된 <b class='text-warning'>모든 권한</b>이 될 것입니다");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"여기에서 모든 사용자 정의 이슈 필드를 정의하세요. 각 프로젝트는 이슈 전환 설정을 통해 이러한 필드의 전체 또는 일부를 사용할지 결정할 수 있습니다. <b class=\"text-warning\">참고: </b> 새로 정의된 필드는 기본적으로 새 이슈에만 나타납니다. 기존 이슈 목록 페이지에서 일괄 편집하여 새 필드를 포함하도록 설정할 수 있습니다");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("File Patterns", "파일 패턴");
m.put("File Protection", "파일 보호");
m.put("File Protections", "파일 보호들");
m.put("File and Symbol Search", "파일 및 심볼 검색");
m.put("File changes", "파일 변경 사항");
m.put("File is too large to edit here", "파일이 너무 커서 여기서 편집할 수 없습니다");
m.put("File missing or obsolete", "파일 누락 또는 오래됨");
@ -1305,6 +1306,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Force", "강제");
m.put("Force Garbage Collection", "강제 가비지 컬렉션");
m.put("Forgot Password?", "비밀번호를 잊으셨나요?");
m.put("Fork Project", "프로젝트 포크");
m.put("Fork now", "지금 포크하기");
m.put("Forks Of", "포크된 프로젝트");
m.put("Frequencies", "빈도");
@ -1455,9 +1457,9 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"활성화되면 사용자가 권한이 있는 경우 풀 리퀘스트 병합 후 소스 브랜치가 자동으로 삭제됩니다");
m.put("If specified, OneDev will only display iterations with this prefix", "지정된 경우, OneDev는 이 접두사가 있는 반복만 표시합니다");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"지정된 경우, GitLab에서 가져온 모든 공개 및 내부 프로젝트는 이를 기본 역할로 사용합니다. 비공개 프로젝트는 영향을 받지 않습니다");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"지정된 경우, GitHub에서 가져온 모든 공개 저장소는 이를 기본 역할로 사용합니다. 비공개 저장소는 영향을 받지 않습니다");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"지정된 경우, 문제의 총 예상/소요 시간에 이 유형의 연결된 문제도 포함됩니다");
@ -1981,6 +1983,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("New User Bean", "새 사용자 Bean");
m.put("New Value", "새 값");
m.put("New issue board created", "새 이슈 보드 생성됨");
m.put("New project created", "새 프로젝트가 생성되었습니다");
m.put("New user created", "새 사용자 생성됨");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"새 버전이 사용 가능합니다. 보안/중요 업데이트는 빨간색, 버그 수정은 노란색, 기능 업데이트는 파란색으로 표시됩니다. 변경 사항을 보려면 클릭하세요. 시스템 설정에서 비활성화할 수 있습니다.");
@ -2000,6 +2003,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("No agents to resume", "재개할 에이전트 없음");
m.put("No aggregation", "집계 없음");
m.put("No any", "없음");
m.put("No any matches", "일치하는 항목이 없습니다");
m.put("No applicable transitions or no permission to transit", "적용 가능한 전환 없음 또는 전환 권한 없음");
m.put("No artifacts published", "게시된 아티팩트 없음");
m.put("No attributes defined (can only be edited when agent is online)", "정의된 속성 없음 (에이전트가 온라인 상태일 때만 편집 가능)");
@ -2026,7 +2030,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("No data", "데이터 없음");
m.put("No default branch", "기본 브랜치 없음");
m.put("No default group", "기본 그룹 없음");
m.put("No default role", "기본 역할 없음");
m.put("No default roles", "기본 역할 없음");
m.put("No default value", "기본값 없음");
m.put("No description", "설명 없음");
m.put("No diffs", "차이 없음");
@ -2097,6 +2101,8 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Not Active Since", "활성 상태가 아닌 이후");
m.put("Not Used Since", "사용되지 않은 이후");
m.put("Not assigned", "할당되지 않음");
m.put("Not authorized to create project under \"{0}\"", "\"{0}\" 아래에 프로젝트를 생성할 권한이 없습니다.");
m.put("Not authorized to create root project", "루트 프로젝트를 생성할 권한이 없습니다.");
m.put("Not authorized to move project under this parent", "이 부모 아래로 프로젝트를 이동할 권한이 없습니다");
m.put("Not authorized to set as root project", "루트 프로젝트로 설정할 권한이 없습니다");
m.put("Not covered", "포함되지 않음");
@ -2635,6 +2641,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Project Replicas", "프로젝트 복제본");
m.put("Project authorizations updated", "프로젝트 권한이 업데이트되었습니다");
m.put("Project does not have any code yet", "프로젝트에 아직 코드가 없습니다");
m.put("Project forked", "프로젝트가 포크되었습니다");
m.put("Project id", "프로젝트 ID");
m.put("Project list", "프로젝트 목록");
m.put("Project manage privilege required to delete \"{0}\"", "\"{0}\"를 삭제하려면 프로젝트 관리 권한이 필요합니다");
@ -2662,7 +2669,7 @@ public class Translation_ko extends TranslationResourceBundle {
"도커 buildx 빌더의 이미지 캐시를 정리합니다. 이 단계는 서버 도커 실행자 또는 원격 도커 실행자에서 지정된 buildx 빌더의 캐시를 제거하기 위해 도커 빌더 정리 명령을 호출합니다");
m.put("Public", "공개");
m.put("Public Key", "공개 키");
m.put("Public Role", "공개 역할");
m.put("Public Roles", "공개 역할");
m.put("Publish", "게시");
m.put("Publish Coverage Report Step", "커버리지 보고서 게시 단계");
m.put("Publish Problem Report Step", "문제 보고서 게시 단계");
@ -2973,6 +2980,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Search branch", "브랜치 검색");
m.put("Search files, symbols and texts", "파일, 심볼 및 텍스트 검색");
m.put("Search for", "검색 대상");
m.put("Search inside current tree", "현재 트리 내에서 검색");
m.put("Search is too general", "검색이 너무 일반적입니다");
m.put("Search job", "작업 검색");
m.put("Search project", "프로젝트 검색");
@ -3104,6 +3112,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("Show issues in list", "목록에서 이슈 보기");
m.put("Show issues not scheduled into current iteration", "현재 반복에 일정되지 않은 이슈 보기");
m.put("Show matching agents", "일치하는 에이전트 보기");
m.put("Show more", "더 보기");
m.put("Show more lines", "더 많은 줄 보기");
m.put("Show next match", "다음 일치 항목 보기");
m.put("Show previous match", "이전 일치 항목 보기");
@ -4265,6 +4274,7 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("found {0} users", "{0}명의 사용자를 찾았습니다");
m.put("has any value of", "값이 존재합니다");
m.put("head", "헤드");
m.put("in current commit", "현재 커밋에서");
m.put("ineffective", "비효율적");
m.put("inherited", "상속됨");
m.put("initial", "초기");
@ -4412,11 +4422,69 @@ public class Translation_ko extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "파일 및 심볼 검색");
m.put("No any matches", "일치하는 항목이 없습니다");
m.put("Search inside current tree", "현재 트리 내에서 검색");
m.put("Show more", "더 보기");
m.put("in current commit", "현재 커밋에서");
m.put("Account set up successfully", "계정이 성공적으로 설정되었습니다");
m.put("All RESTful Resources", "모든 RESTful 리소스");
m.put("An unexpected exception occurred", "예기치 않은 예외가 발생했습니다");
m.put("Back To Home", "홈으로 돌아가기");
m.put("Can not reset password for service account or disabled user", "서비스 계정 또는 비활성화된 사용자의 비밀번호를 재설정할 수 없습니다");
m.put("Can not reset password for user authenticating via external system", "외부 시스템을 통해 인증하는 사용자의 비밀번호를 재설정할 수 없습니다");
m.put("Content Type", "콘텐츠 유형");
m.put("Email Address Verification", "이메일 주소 확인");
m.put("Email address already used: ", "이미 사용된 이메일 주소:");
m.put("End Point", "엔드 포인트");
m.put("Enter New Password", "새 비밀번호 입력");
m.put("Enter your user name or email to reset password", "비밀번호를 재설정하려면 사용자 이름 또는 이메일을 입력하세요");
m.put("Error detail of content type &quot;text/plain&quot;", "콘텐츠 유형 &quot;text/plain&quot;의 오류 세부 정보");
m.put("Example", "예제");
m.put("Failed to verify your email address", "이메일 주소를 확인하지 못했습니다");
m.put("Forgotten Password?", "비밀번호를 잊으셨나요?");
m.put("Go Back", "돌아가기");
m.put("Http Method", "Http 메서드");
m.put("I didn't eat it. I swear!", "나는 그것을 먹지 않았어. 맹세해!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"익명 액세스가 비활성화되었거나 익명 사용자가 리소스 작업에 대한 충분한 권한이 없는 경우, 사용자 이름과 비밀번호(또는 액세스 토큰)를 제공하여 http 기본 인증 헤더를 통해 인증해야 합니다");
m.put("Invalid invitation code", "초대 코드가 유효하지 않습니다");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"유효하지 않은 상태입니다. 시스템 설정에 지정된 서버 URL을 사용하여 OneDev를 방문하고 있는지 확인하세요");
m.put("No response body", "응답 본문 없음");
m.put("No user found with login name or email: ", "로그인 이름 또는 이메일로 사용자를 찾을 수 없습니다:");
m.put("OOPS! There Is An Error", "이런! 오류가 발생했습니다");
m.put("Operation", "작업");
m.put("Operation Failed", "작업 실패");
m.put("Operation Successful", "작업 성공");
m.put("Page Not Found", "페이지를 찾을 수 없습니다");
m.put("Parameter", "매개변수");
m.put("Password changed. Please login with your new password", "비밀번호가 변경되었습니다. 새 비밀번호로 로그인하세요");
m.put("Password reset url is invalid or obsolete", "비밀번호 재설정 URL이 유효하지 않거나 오래되었습니다");
m.put("Placeholder", "플레이스홀더");
m.put("Please check your email for password reset instructions", "비밀번호 재설정 지침을 이메일로 확인하세요");
m.put("Primary email address not specified", "기본 이메일 주소가 지정되지 않았습니다");
m.put("Query Parameters", "쿼리 매개변수");
m.put("RESTful API Help", "RESTful API 도움말");
m.put("Request Body", "요청 본문");
m.put("Required", "필수");
m.put("Reset", "재설정");
m.put("Resource", "리소스");
m.put("Resources", "리소스들");
m.put("Response", "응답");
m.put("Response Body", "응답 본문");
m.put("Set Up Your Account", "계정을 설정하세요");
m.put("Show Error Detail", "오류 세부 정보 표시");
m.put("Status Code", "상태 코드");
m.put("Status code", "상태 코드");
m.put("Status code other than 200 indicating the error type", "오류 유형을 나타내는 200이 아닌 상태 코드");
m.put("Sync Replica Status and Back to Home", "복제본 상태 동기화 및 홈으로 돌아가기");
m.put("The object you are deleting/disabling is still being used", "삭제/비활성화하려는 객체가 여전히 사용 중입니다");
m.put("The password reset url is invalid or obsolete", "비밀번호 재설정 URL이 유효하지 않거나 오래되었습니다");
m.put("There are incompatibilities since your upgraded version", "업그레이드된 버전 이후로 호환되지 않는 부분이 있습니다");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"이 날짜는 <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 형식</a>을 사용합니다");
m.put("Unable To Delete/Disable Right Now", "지금 삭제/비활성화할 수 없습니다");
m.put("Unable to send password reset email as mail service is not configured", "메일 서비스가 구성되지 않아 비밀번호 재설정 이메일을 보낼 수 없습니다");
m.put("Your email address is now verified", "이메일 주소가 이제 확인되었습니다");
m.put("Your primary email address is not verified", "기본 이메일 주소가 확인되지 않았습니다");
m.put("cURL Example", "cURL 예제");
m.put("you may show this page later via incompatibilities link in help menu", "도움말 메뉴의 호환성 링크를 통해 나중에 이 페이지를 표시할 수 있습니다");
}
@Override

View File

@ -839,8 +839,8 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "Provedor de Valor Múltiplo Padrão");
m.put("Default Project", "Projeto Padrão");
m.put("Default Project Setting", "Configuração de Projeto Padrão");
m.put("Default Role", "Função Padrão");
m.put("Default Role Bean", "Bean de Função Padrão");
m.put("Default Roles", "Funções Padrão");
m.put("Default Roles Bean", "Bean de Funções Padrão");
m.put("Default Value", "Valor Padrão");
m.put("Default Value Provider", "Provedor de Valor Padrão");
m.put("Default Values", "Valores Padrão");
@ -848,8 +848,8 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Default branding settings restored", "Configurações de marca padrão restauradas");
m.put("Default fixed issue filters saved", "Filtros de problemas resolvidos padrão salvos");
m.put("Default merge strategy", "Estratégia de mesclagem padrão");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"A função padrão afeta as permissões padrão concedidas a todos no sistema. As permissões padrão reais serão <b class='text-warning'>todas as permissões</b> contidas nas funções padrão deste projeto e de todos os seus projetos pai");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"Funções padrão afetam permissões padrão concedidas a todos no sistema. As permissões padrão reais serão <b class='text-warning'>todas as permissões</b> contidas nas funções padrão deste projeto e de todos os seus projetos pai");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"Defina todos os campos personalizados de problemas aqui. Cada projeto pode decidir usar todos ou um subconjunto desses campos por meio de sua configuração de transição de problemas. <b class=\"text-warning\">NOTA: </b> Campos recém-definidos por padrão só aparecem em novos problemas. Edite em lote problemas existentes na página de lista de problemas se desejar que eles tenham esses novos campos");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1227,6 +1227,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("File Patterns", "Padrões de Arquivo");
m.put("File Protection", "Proteção de Arquivo");
m.put("File Protections", "Proteções de Arquivo");
m.put("File and Symbol Search", "Busca de Arquivo e Símbolo");
m.put("File changes", "alterações no arquivo");
m.put("File is too large to edit here", "Arquivo muito grande para editar aqui");
m.put("File missing or obsolete", "Arquivo ausente ou obsoleto");
@ -1305,6 +1306,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Force", "Forçar");
m.put("Force Garbage Collection", "Forçar Coleta de Lixo");
m.put("Forgot Password?", "Esqueceu a Senha?");
m.put("Fork Project", "Forkar Projeto");
m.put("Fork now", "Fazer Fork agora");
m.put("Forks Of", "Forks de");
m.put("Frequencies", "Frequências");
@ -1455,10 +1457,10 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"Se habilitado, a branch de origem será excluída automaticamente após a mesclagem do pull request, se o usuário tiver permissão para isso");
m.put("If specified, OneDev will only display iterations with this prefix", "Se especificado, o OneDev exibirá apenas iterações com este prefixo");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"Se especificado, todos os projetos públicos e internos importados do GitLab usarão isso como função padrão. Projetos privados não são afetados");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"Se especificado, todos os repositórios públicos importados do GitHub usarão isso como função padrão. Repositórios privados não são afetados");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"Se especificado, todos os projetos públicos e internos importados do GitLab usarão estas como funções padrão. Projetos privados não são afetados");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"Se especificado, todos os repositórios públicos importados do GitHub usarão estas como funções padrão. Repositórios privados não são afetados");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"Se especificado, o tempo total estimado/gasto de um problema também incluirá problemas vinculados deste tipo");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1981,6 +1983,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("New User Bean", "Bean de Usuário Novo");
m.put("New Value", "Novo Valor");
m.put("New issue board created", "Novo quadro de issues criado");
m.put("New project created", "Novo projeto criado");
m.put("New user created", "Novo usuário criado");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"Nova versão disponível. Vermelho para atualização de segurança/crítica, amarelo para correção de bugs, azul para atualização de recursos. Clique para mostrar alterações. Desative nas configurações do sistema");
@ -2000,6 +2003,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("No agents to resume", "Sem agentes para retomar");
m.put("No aggregation", "Sem agregação");
m.put("No any", "Nenhum");
m.put("No any matches", "Nenhuma correspondência");
m.put("No applicable transitions or no permission to transit", "Sem transições aplicáveis ou sem permissão para transitar");
m.put("No artifacts published", "Sem artefatos publicados");
m.put("No attributes defined (can only be edited when agent is online)", "Sem atributos definidos (só podem ser editados quando o agente está online)");
@ -2026,7 +2030,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("No data", "Sem dados");
m.put("No default branch", "Sem branch padrão");
m.put("No default group", "Sem grupo padrão");
m.put("No default role", "Sem função padrão");
m.put("No default roles", "Sem funções padrão");
m.put("No default value", "Sem valor padrão");
m.put("No description", "Sem descrição");
m.put("No diffs", "Sem diferenças");
@ -2097,6 +2101,8 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Not Active Since", "Não ativo desde");
m.put("Not Used Since", "Não usado desde");
m.put("Not assigned", "Não atribuído");
m.put("Not authorized to create project under \"{0}\"", "Não autorizado a criar projeto em \"{0}\"");
m.put("Not authorized to create root project", "Não autorizado a criar projeto raiz");
m.put("Not authorized to move project under this parent", "Não autorizado a mover o projeto para este pai");
m.put("Not authorized to set as root project", "Não autorizado a definir como projeto raiz");
m.put("Not covered", "Não coberto");
@ -2635,6 +2641,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Project Replicas", "Réplicas do Projeto");
m.put("Project authorizations updated", "Autorizações de projeto atualizadas");
m.put("Project does not have any code yet", "O projeto ainda não possui nenhum código");
m.put("Project forked", "Projeto bifurcado");
m.put("Project id", "ID do projeto");
m.put("Project list", "Lista de Projetos");
m.put("Project manage privilege required to delete \"{0}\"", "Privilégio de gerenciamento de projeto necessário para excluir \"{0}\"");
@ -2662,7 +2669,7 @@ public class Translation_pt extends TranslationResourceBundle {
"Limpar cache de imagem do builder do docker buildx. Esta etapa chama o comando docker builder prune para remover o cache do builder buildx especificado no executor docker do servidor ou executor docker remoto");
m.put("Public", "Público");
m.put("Public Key", "Chave Pública");
m.put("Public Role", "Função Pública");
m.put("Public Roles", "Funções Públicas");
m.put("Publish", "Publicar");
m.put("Publish Coverage Report Step", "Etapa de Publicação de Relatório de Cobertura");
m.put("Publish Problem Report Step", "Etapa de Publicação de Relatório de Problemas");
@ -2973,6 +2980,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Search branch", "Pesquisar branch");
m.put("Search files, symbols and texts", "Pesquisar arquivos, símbolos e textos");
m.put("Search for", "Pesquisar por");
m.put("Search inside current tree", "Buscar dentro da árvore atual");
m.put("Search is too general", "A pesquisa é muito geral");
m.put("Search job", "Pesquisar trabalho");
m.put("Search project", "Pesquisar projeto");
@ -3104,6 +3112,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("Show issues in list", "Mostrar questões na lista");
m.put("Show issues not scheduled into current iteration", "Mostrar questões não agendadas na iteração atual");
m.put("Show matching agents", "Mostrar agentes correspondentes");
m.put("Show more", "Mostrar mais");
m.put("Show more lines", "Mostrar mais linhas");
m.put("Show next match", "Mostrar próxima correspondência");
m.put("Show previous match", "Mostrar correspondência anterior");
@ -4265,6 +4274,7 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("found {0} users", "encontrados {0} usuários");
m.put("has any value of", "tem qualquer valor de");
m.put("head", "cabeçalho");
m.put("in current commit", "no commit atual");
m.put("ineffective", "ineficaz");
m.put("inherited", "herdado");
m.put("initial", "inicial");
@ -4412,11 +4422,69 @@ public class Translation_pt extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "{javax.validation.constraints.NotEmpty.message}");
m.put("{javax.validation.constraints.NotNull.message}", "{javax.validation.constraints.NotNull.message}");
m.put("{javax.validation.constraints.Size.message}", "{javax.validation.constraints.Size.message}");
m.put("File and Symbol Search", "Busca de Arquivo e Símbolo");
m.put("No any matches", "Nenhuma correspondência");
m.put("Search inside current tree", "Buscar dentro da árvore atual");
m.put("Show more", "Mostrar mais");
m.put("in current commit", "no commit atual");
m.put("Account set up successfully", "Conta configurada com sucesso");
m.put("All RESTful Resources", "Todos os Recursos RESTful");
m.put("An unexpected exception occurred", "Ocorreu uma exceção inesperada");
m.put("Back To Home", "Voltar Para a Página Inicial");
m.put("Can not reset password for service account or disabled user", "Não é possível redefinir a senha para conta de serviço ou usuário desativado");
m.put("Can not reset password for user authenticating via external system", "Não é possível redefinir a senha para usuário autenticando via sistema externo");
m.put("Content Type", "Tipo de Conteúdo");
m.put("Email Address Verification", "Verificação de Endereço de Email");
m.put("Email address already used: ", "Endereço de email já utilizado:");
m.put("End Point", "Ponto de Extremidade");
m.put("Enter New Password", "Digite a Nova Senha");
m.put("Enter your user name or email to reset password", "Digite seu nome de usuário ou email para redefinir a senha");
m.put("Error detail of content type &quot;text/plain&quot;", "Detalhe do erro do tipo de conteúdo &quot;text/plain&quot;");
m.put("Example", "Exemplo");
m.put("Failed to verify your email address", "Falha ao verificar seu endereço de email");
m.put("Forgotten Password?", "Esqueceu a Senha?");
m.put("Go Back", "Voltar");
m.put("Http Method", "Método Http");
m.put("I didn't eat it. I swear!", "Eu não comi. Eu juro!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"No caso de acesso anônimo estar desativado ou o usuário anônimo não ter permissão suficiente para uma operação de recurso, você precisará autenticar fornecendo nome de usuário e senha (ou token de acesso) via cabeçalho de autenticação básica http");
m.put("Invalid invitation code", "Código de convite inválido");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"Estado inválido. Por favor, certifique-se de que está visitando o OneDev usando a URL do servidor especificada na configuração do sistema");
m.put("No response body", "Sem corpo de resposta");
m.put("No user found with login name or email: ", "Nenhum usuário encontrado com nome de login ou email:");
m.put("OOPS! There Is An Error", "OOPS! Há Um Erro");
m.put("Operation", "Operação");
m.put("Operation Failed", "Falha na Operação");
m.put("Operation Successful", "Operação Bem-Sucedida");
m.put("Page Not Found", "Página Não Encontrada");
m.put("Parameter", "Parâmetro");
m.put("Password changed. Please login with your new password", "Senha alterada. Por favor, faça login com sua nova senha");
m.put("Password reset url is invalid or obsolete", "A URL de redefinição de senha é inválida ou obsoleta");
m.put("Placeholder", "Espaço Reservado");
m.put("Please check your email for password reset instructions", "Por favor, verifique seu email para instruções de redefinição de senha");
m.put("Primary email address not specified", "Endereço de email principal não especificado");
m.put("Query Parameters", "Parâmetros de Consulta");
m.put("RESTful API Help", "Ajuda da API RESTful");
m.put("Request Body", "Corpo da Solicitação");
m.put("Required", "Obrigatório");
m.put("Reset", "Redefinir");
m.put("Resource", "Recurso");
m.put("Resources", "Recursos");
m.put("Response", "Resposta");
m.put("Response Body", "Corpo da Resposta");
m.put("Set Up Your Account", "Configure Sua Conta");
m.put("Show Error Detail", "Mostrar Detalhe do Erro");
m.put("Status Code", "Código de Status");
m.put("Status code", "Código de status");
m.put("Status code other than 200 indicating the error type", "Código de status diferente de 200 indicando o tipo de erro");
m.put("Sync Replica Status and Back to Home", "Sincronizar Status da Réplica e Voltar para a Página Inicial");
m.put("The object you are deleting/disabling is still being used", "O objeto que você está excluindo/desativando ainda está sendo usado");
m.put("The password reset url is invalid or obsolete", "A URL de redefinição de senha é inválida ou obsoleta");
m.put("There are incompatibilities since your upgraded version", "Existem incompatibilidades desde a sua versão atualizada");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"Esta data está usando o <a href=\"https://www.w3.org/TR/NOTE-datetime\">formato ISO 8601</a>");
m.put("Unable To Delete/Disable Right Now", "Incapaz de Excluir/Desativar Agora");
m.put("Unable to send password reset email as mail service is not configured", "Incapaz de enviar email de redefinição de senha pois o serviço de email não está configurado");
m.put("Your email address is now verified", "Seu endereço de email agora está verificado");
m.put("Your primary email address is not verified", "Seu endereço de email principal não está verificado");
m.put("cURL Example", "Exemplo de cURL");
m.put("you may show this page later via incompatibilities link in help menu", "você pode mostrar esta página mais tarde via link de incompatibilidades no menu de ajuda");
}
@Override

View File

@ -846,8 +846,8 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Default Multi Value Provider", "默认多值提供器");
m.put("Default Project", "默认项目");
m.put("Default Project Setting", "默认项目设置");
m.put("Default Role", "默认角色");
m.put("Default Role Bean", "默认角色 Bean");
m.put("Default Roles", "默认角色");
m.put("Default Roles Bean", "默认角色 Bean");
m.put("Default Value", "默认值");
m.put("Default Value Provider", "默认值提供器");
m.put("Default Values", "默认值");
@ -855,8 +855,8 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Default branding settings restored", "已恢复默认品牌设置");
m.put("Default fixed issue filters saved", "默认固定工单过滤器已保存");
m.put("Default merge strategy", "默认合并策略");
m.put("Default role affects default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"默认角色影响系统中所有用户获得的默认权限。实际的默认权限将是该项目及其所有父项目中默认角色包含的<b class='text-warning'>所有权限</b>");
m.put("Default roles affect default permissions granted to everyone in the system. The actual default permissions will be <b class='text-warning'>all permissions</b> contained in default roles of this project and all its parent projects",
"默认角色影响系统中每个人的默认权限。实际的默认权限将是该项目及其所有父项目中默认角色包含的<b class='text-warning'>所有权限</b>");
m.put("Define all custom issue fields here. Each project can decide to use all or a subset of these fields via its issue transition setting. <b class=\"text-warning\">NOTE: </b> Newly defined fields by default only appear in new issues. Batch edit existing issues from issue list page if you want them to have these new fields",
"在此处定义所有自定义工单字段。每个项目可以通过其工单状态设置决定使用所有或这些字段的一个子集。<b class=\"text-warning\">注意:</b> 默认情况下,新定义的字段仅出现在新工单中。如果您希望这些新字段出现在现有工单中,请从工单列表页面批量编辑这些工单");
m.put("Define all custom issue states here. The first state will be used as initial state of created issues",
@ -1234,6 +1234,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("File Patterns", "文件模式");
m.put("File Protection", "文件保护");
m.put("File Protections", "文件保护");
m.put("File and Symbol Search", "文件和符号搜索");
m.put("File changes", "文件更改");
m.put("File is too large to edit here", "文件太大,无法在此编辑");
m.put("File missing or obsolete", "文件缺失或过时");
@ -1312,6 +1313,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Force", "强制");
m.put("Force Garbage Collection", "强制垃圾回收");
m.put("Forgot Password?", "忘记密码?");
m.put("Fork Project", "分叉项目");
m.put("Fork now", "立即分叉");
m.put("Forks Of", "分叉");
m.put("Frequencies", "频率");
@ -1462,10 +1464,10 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("If enabled, source branch will be deleted automatically after merge the pull request if user has permission to do that",
"如果启用,在用户有权限的情况下,源分支将在合并合并请求后自动删除");
m.put("If specified, OneDev will only display iterations with this prefix", "如果指定OneDev 将只显示具有此前缀的迭代");
m.put("If specified, all public and internal projects imported from GitLab will use this as default role. Private projects are not affected",
"如果指定,所有从 GitLab 导入的公共和内部项目将使用此作为默认角色。私有项目不受影响");
m.put("If specified, all public repositories imported from GitHub will use this as default role. Private repositories are not affected",
"如果指定,所有从 GitHub 导入的公共仓库将使用此作为默认角色。私有仓库不受影响");
m.put("If specified, all public and internal projects imported from GitLab will use these as default roles. Private projects are not affected",
"如果指定,从 GitLab 导入的所有公共和内部项目将使用这些作为默认角色。私人项目不受影响");
m.put("If specified, all public repositories imported from GitHub will use these as default roles. Private repositories are not affected",
"如果指定,从 GitHub 导入的所有公共仓库将使用这些作为默认角色。私人仓库不受影响");
m.put("If specified, total estimated/spent time of an issue will also include linked issues of this type",
"如果指定,工单的预计/已用时间也将包括此类型的链接工单");
m.put("If this option is enabled, git lfs command needs to be installed on OneDev server (even this step runs on other node)",
@ -1988,6 +1990,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("New User Bean", "新用户Bean");
m.put("New Value", "新值");
m.put("New issue board created", "新建工单看板");
m.put("New project created", "新项目已创建");
m.put("New user created", "新用户创建成功");
m.put("New version available. Red for security/critical update, yellow for bug fix, blue for feature update. Click to show changes. Disable in system setting",
"新版本可用。红色表示安全/关键更新,黄色表示错误修复,蓝色表示功能更新。点击查看更改。可在系统设置中禁用");
@ -2007,6 +2010,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("No agents to resume", "没有要恢复的任务代理");
m.put("No aggregation", "无聚合");
m.put("No any", "无任何");
m.put("No any matches", "没有任何匹配项");
m.put("No applicable transitions or no permission to transit", "没有适用的转换或没有权限转换");
m.put("No artifacts published", "没有发布制品");
m.put("No attributes defined (can only be edited when agent is online)", "没有定义属性(仅当代理在线时可编辑)");
@ -2033,7 +2037,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("No data", "没有数据");
m.put("No default branch", "没有默认分支");
m.put("No default group", "无默认组");
m.put("No default role", "默认角色");
m.put("No default roles", "没有默认角色");
m.put("No default value", "无默认值");
m.put("No description", "无描述");
m.put("No diffs", "没有差异");
@ -2104,6 +2108,8 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Not Active Since", "不活跃起");
m.put("Not Used Since", "未使用时间");
m.put("Not assigned", "未分配");
m.put("Not authorized to create project under \"{0}\"", "无权限在 \"{0}\" 下创建项目");
m.put("Not authorized to create root project", "无权限创建根项目");
m.put("Not authorized to move project under this parent", "无权将项目移动到此父项目下");
m.put("Not authorized to set as root project", "无权设置为根项目");
m.put("Not covered", "未覆盖");
@ -2642,6 +2648,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Project Replicas", "项目副本");
m.put("Project authorizations updated", "项目授权已更新");
m.put("Project does not have any code yet", "项目还没有代码");
m.put("Project forked", "项目已分叉");
m.put("Project id", "项目 ID");
m.put("Project list", "项目列表");
m.put("Project manage privilege required to delete \"{0}\"", "删除 \"{0}\" 需要项目管理员权限");
@ -2669,7 +2676,7 @@ public class Translation_zh extends TranslationResourceBundle {
"此步骤调用 docker builder prune 命令来删除服务器 docker 执行器或远程 docker 执行器中指定的 buildx 构建器缓存");
m.put("Public", "公开");
m.put("Public Key", "公钥");
m.put("Public Role", "公共角色");
m.put("Public Roles", "公共角色");
m.put("Publish", "发布");
m.put("Publish Coverage Report Step", "发布覆盖率报告步骤");
m.put("Publish Problem Report Step", "发布问题报告步骤");
@ -2980,6 +2987,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Search branch", "搜索分支");
m.put("Search files, symbols and texts", "搜索文件、符号和文本");
m.put("Search for", "搜索");
m.put("Search inside current tree", "在当前树内搜索");
m.put("Search is too general", "搜索过于笼统");
m.put("Search job", "搜索任务");
m.put("Search project", "搜索项目");
@ -3111,6 +3119,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("Show issues in list", "在列表中显示工单");
m.put("Show issues not scheduled into current iteration", "显示未安排到当前迭代的工单");
m.put("Show matching agents", "显示匹配的代理");
m.put("Show more", "显示更多");
m.put("Show more lines", "显示更多行");
m.put("Show next match", "显示下一个匹配");
m.put("Show previous match", "显示上一个匹配");
@ -4272,6 +4281,7 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("found {0} users", "找到 {0} 个用户");
m.put("has any value of", "具有下列任何值");
m.put("head", "头部");
m.put("in current commit", "在当前提交中");
m.put("ineffective", "无效");
m.put("inherited", "继承");
m.put("initial", "初始");
@ -4419,11 +4429,69 @@ public class Translation_zh extends TranslationResourceBundle {
m.put("{javax.validation.constraints.NotEmpty.message}", "不能为空");
m.put("{javax.validation.constraints.NotNull.message}", "不能为空");
m.put("{javax.validation.constraints.Size.message}", "至少需要指定一个值");
m.put("File and Symbol Search", "文件和符号搜索");
m.put("No any matches", "没有任何匹配项");
m.put("Search inside current tree", "在当前树内搜索");
m.put("Show more", "显示更多");
m.put("in current commit", "在当前提交中");
m.put("Account set up successfully", "账户设置成功");
m.put("All RESTful Resources", "所有RESTful资源");
m.put("An unexpected exception occurred", "发生意外异常");
m.put("Back To Home", "返回主页");
m.put("Can not reset password for service account or disabled user", "无法重置服务账户或禁用用户的密码");
m.put("Can not reset password for user authenticating via external system", "无法重置通过外部系统认证的用户密码");
m.put("Content Type", "内容类型");
m.put("Email Address Verification", "邮箱地址验证");
m.put("Email address already used: ", "邮箱地址已被使用:");
m.put("End Point", "端点");
m.put("Enter New Password", "输入新密码");
m.put("Enter your user name or email to reset password", "输入您的用户名或邮箱以重置密码");
m.put("Error detail of content type &quot;text/plain&quot;", "内容类型为\"text/plain\"的错误详情");
m.put("Example", "示例");
m.put("Failed to verify your email address", "未能验证您的邮箱地址");
m.put("Forgotten Password?", "忘记密码?");
m.put("Go Back", "返回");
m.put("Http Method", "Http方法");
m.put("I didn't eat it. I swear!", "我没吃它。我发誓!");
m.put("In case anonymous access is disabled or anonymous user does not have enough permission for a resource operation, you will need to authenticate by providing user name and password (or access token) via http basic auth header",
"如果匿名访问被禁用或匿名用户没有足够的权限进行资源操作您需要通过http基本认证头提供用户名和密码或访问令牌进行认证");
m.put("Invalid invitation code", "无效的邀请代码");
m.put("Invalid state. Please make sure you are visiting OneDev using server url specified in system setting",
"无效的状态。请确保您使用系统设置中指定的服务器URL访问OneDev");
m.put("No response body", "无响应体");
m.put("No user found with login name or email: ", "未找到登录名或邮箱为的用户:");
m.put("OOPS! There Is An Error", "哎呀!发生错误");
m.put("Operation", "操作");
m.put("Operation Failed", "操作失败");
m.put("Operation Successful", "操作成功");
m.put("Page Not Found", "页面未找到");
m.put("Parameter", "参数");
m.put("Password changed. Please login with your new password", "密码已更改。请使用新密码登录");
m.put("Password reset url is invalid or obsolete", "密码重置URL无效或已过期");
m.put("Placeholder", "占位符");
m.put("Please check your email for password reset instructions", "请检查您的邮箱以获取密码重置说明");
m.put("Primary email address not specified", "未指定主要邮箱地址");
m.put("Query Parameters", "查询参数");
m.put("RESTful API Help", "RESTful API帮助");
m.put("Request Body", "请求体");
m.put("Required", "必需");
m.put("Reset", "重置");
m.put("Resource", "资源");
m.put("Resources", "资源");
m.put("Response", "响应");
m.put("Response Body", "响应体");
m.put("Set Up Your Account", "设置您的账户");
m.put("Show Error Detail", "显示错误详情");
m.put("Status Code", "状态码");
m.put("Status code", "状态码");
m.put("Status code other than 200 indicating the error type", "非200的状态码表示错误类型");
m.put("Sync Replica Status and Back to Home", "同步副本状态并返回主页");
m.put("The object you are deleting/disabling is still being used", "您正在删除/禁用的对象仍在使用中");
m.put("The password reset url is invalid or obsolete", "密码重置URL无效或已过期");
m.put("There are incompatibilities since your upgraded version", "由于您的版本升级,存在不兼容性");
m.put("This date is using <a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601 format</a>",
"此日期使用<a href=\"https://www.w3.org/TR/NOTE-datetime\">ISO 8601格式</a>");
m.put("Unable To Delete/Disable Right Now", "目前无法删除/禁用");
m.put("Unable to send password reset email as mail service is not configured", "由于邮件服务未配置,无法发送密码重置邮件");
m.put("Your email address is now verified", "您的邮箱地址已验证");
m.put("Your primary email address is not verified", "您的主要邮箱地址未验证");
m.put("cURL Example", "cURL示例");
m.put("you may show this page later via incompatibilities link in help menu", "您可以稍后通过帮助菜单中的不兼容性链接显示此页面");
}
@Override

View File

@ -1,14 +1,14 @@
package io.onedev.server.util;
import com.google.common.io.Resources;
import org.junit.Test;
import org.mozilla.universalchardet.Constants;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com.google.common.io.Resources;
public class ContentDetectorTest {

View File

@ -1,40 +1,36 @@
package io.onedev.server.plugin.imports.bitbucketcloud;
import java.io.Serializable;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
@Editable
public class ImportOption implements Serializable {
private static final long serialVersionUID = 1L;
private String publicRoleName;
private List<String> publicRoleNames = new ArrayList<>();
@Editable(order=100, name="Public Role", description="If specified, all public repositories imported from GitHub "
+ "will use this as default role. Private repositories are not affected")
@Editable(order=100, name="Public Roles", description="If specified, all public repositories imported from GitHub "
+ "will use these as default roles. Private repositories are not affected")
@RoleChoice
@Nullable
public String getPublicRoleName() {
return publicRoleName;
public List<String> getPublicRoleNames() {
return publicRoleNames;
}
public void setPublicRoleName(String publicRoleName) {
this.publicRoleName = publicRoleName;
public void setPublicRoleNames(List<String> publicRoleNames) {
this.publicRoleNames = publicRoleNames;
}
@Nullable
public Role getPublicRole() {
if (publicRoleName != null)
return OneDev.getInstance(RoleManager.class).find(publicRoleName);
else
return null;
public List<Role> getPublicRoles() {
return publicRoleNames.stream().map(name -> OneDev.getInstance(RoleManager.class).find(name)).collect(Collectors.toList());
}
}

View File

@ -1,6 +1,30 @@
package io.onedev.server.plugin.imports.bitbucketcloud;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.NotEmpty;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import org.apache.http.client.utils.URIBuilder;
import org.apache.shiro.authz.UnauthorizedException;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.JsonNode;
import io.onedev.commons.bootstrap.SecretMasker;
import io.onedev.commons.utils.ExplicitException;
import io.onedev.commons.utils.StringUtils;
@ -9,6 +33,7 @@ import io.onedev.server.OneDev;
import io.onedev.server.annotation.ClassValidating;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.Password;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.ProjectManager;
import io.onedev.server.git.command.LsRemoteCommand;
import io.onedev.server.model.Project;
@ -20,27 +45,6 @@ import io.onedev.server.util.JerseyUtils.PageDataConsumer;
import io.onedev.server.validation.Validatable;
import io.onedev.server.web.component.taskbutton.TaskResult;
import io.onedev.server.web.component.taskbutton.TaskResult.PlainMessage;
import org.apache.http.client.utils.URIBuilder;
import org.apache.shiro.authz.UnauthorizedException;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.NotEmpty;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Editable
@ClassValidating
@ -202,12 +206,7 @@ public class ImportServer implements Serializable, Validatable {
project.setDescription(repoNode.get("description").asText(null));
boolean isPrivate = repoNode.get("is_private").asBoolean();
if (!isPrivate && option.getPublicRole() != null)
project.setDefaultRole(option.getPublicRole());
boolean newlyCreated = project.isNew();
if (newlyCreated || project.getDefaultBranch() == null) {
if (project.isNew() || project.getDefaultBranch() == null) {
logger.log("Cloning code...");
String cloneUrl = null;
@ -228,7 +227,7 @@ public class ImportServer implements Serializable, Validatable {
if (dryRun) {
new LsRemoteCommand(builder.build().toString()).refs("HEAD").quiet(true).run();
} else {
if (newlyCreated)
if (project.isNew())
projectManager.create(project);
projectManager.clone(project, builder.build().toString());
}
@ -238,6 +237,10 @@ public class ImportServer implements Serializable, Validatable {
} else {
logger.warning("Skipping code clone as the project already has code");
}
boolean isPrivate = repoNode.get("is_private").asBoolean();
if (!isPrivate && !option.getPublicRoles().isEmpty())
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(project, option.getPublicRoles());
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}

View File

@ -49,6 +49,7 @@ import io.onedev.server.annotation.ClassValidating;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.Password;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.IterationManager;
import io.onedev.server.entitymanager.ProjectManager;
@ -529,10 +530,6 @@ public class ImportServer implements Serializable, Validatable {
project.setDescription(repoNode.get("description").asText(null));
project.setIssueManagement(repoNode.get("has_issues").asBoolean());
boolean isPrivate = repoNode.get("private").asBoolean();
if (!isPrivate && option.getPublicRole() != null)
project.setDefaultRole(option.getPublicRole());
if (project.isNew() || project.getDefaultBranch() == null) {
logger.log("Cloning code...");
@ -555,6 +552,10 @@ public class ImportServer implements Serializable, Validatable {
logger.warning("Skipping code clone as the project already has code");
}
boolean isPrivate = repoNode.get("private").asBoolean();
if (!isPrivate && !option.getPublicRoles().isEmpty())
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(project, option.getPublicRoles());
if (option.getIssueImportOption() != null) {
logger.log("Importing milestones...");
apiEndpoint = getApiEndpoint("/repos/" + giteaRepository + "/milestones?state=all");

View File

@ -1,42 +1,40 @@
package io.onedev.server.plugin.imports.gitea;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
@Editable
public class ProjectImportOption implements Serializable {
private static final long serialVersionUID = 1L;
private String publicRoleName;
private List<String> publicRoleNames = new ArrayList<>();
private IssueImportOption issueImportOption;
@Editable(order=100, name="Public Role", description="If specified, all public repositories imported from GitHub "
+ "will use this as default role. Private repositories are not affected")
@Editable(order=100, name="Public Roles", description="If specified, all public repositories imported from GitHub "
+ "will use these as default roles. Private repositories are not affected")
@RoleChoice
@Nullable
public String getPublicRoleName() {
return publicRoleName;
public List<String> getPublicRoleNames() {
return publicRoleNames;
}
public void setPublicRoleName(String publicRoleName) {
this.publicRoleName = publicRoleName;
public void setPublicRoleNames(List<String> publicRoleNames) {
this.publicRoleNames = publicRoleNames;
}
@Nullable
public Role getPublicRole() {
if (publicRoleName != null)
return OneDev.getInstance(RoleManager.class).find(publicRoleName);
else
return null;
public List<Role> getPublicRoles() {
return publicRoleNames.stream().map(name -> OneDev.getInstance(RoleManager.class).find(name)).collect(Collectors.toList());
}
@Editable(order=200, name="Import Issues")

View File

@ -46,6 +46,7 @@ import io.onedev.server.annotation.ClassValidating;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.Password;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.IterationManager;
import io.onedev.server.entitymanager.ProjectManager;
@ -578,9 +579,6 @@ public class ImportServer implements Serializable, Validatable {
project.setDescription(repoNode.get("description").asText(null));
project.setIssueManagement(repoNode.get("has_issues").asBoolean());
boolean isPrivate = repoNode.get("private").asBoolean();
if (!isPrivate && option.getPublicRole() != null)
project.setDefaultRole(option.getPublicRole());
if (project.isNew() || project.getDefaultBranch() == null) {
logger.log("Cloning code...");
@ -603,6 +601,10 @@ public class ImportServer implements Serializable, Validatable {
logger.warning("Skipping code clone as the project already has code");
}
boolean isPrivate = repoNode.get("private").asBoolean();
if (!isPrivate && !option.getPublicRoles().isEmpty())
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(project, option.getPublicRoles());
if (option.getIssueImportOption() != null) {
logger.log("Importing milestones...");
apiEndpoint = getApiEndpoint("/repos/" + gitHubRepository + "/milestones?state=all");

View File

@ -1,42 +1,41 @@
package io.onedev.server.plugin.imports.github;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
@Editable
public class ProjectImportOption implements Serializable {
private static final long serialVersionUID = 1L;
private String publicRoleName;
private List<String> publicRoleNames = new ArrayList<>();
private IssueImportOption issueImportOption;
@Editable(order=100, name="Public Role", description="If specified, all public repositories imported from GitHub "
+ "will use this as default role. Private repositories are not affected")
@Editable(order=100, name="Public Roles", description="If specified, all public repositories imported from GitHub "
+ "will use these as default roles. Private repositories are not affected")
@RoleChoice
@Nullable
public String getPublicRoleName() {
return publicRoleName;
public List<String> getPublicRoleNames() {
return publicRoleNames;
}
public void setPublicRoleName(String publicRoleName) {
this.publicRoleName = publicRoleName;
public void setPublicRoleNames(List<String> publicRoleNames) {
this.publicRoleNames = publicRoleNames;
}
@Nullable
public Role getPublicRole() {
if (publicRoleName != null)
return OneDev.getInstance(RoleManager.class).find(publicRoleName);
else
return null;
public List<Role> getPublicRoles() {
return publicRoleNames.stream().map(name -> OneDev.getInstance(RoleManager.class).find(name)).collect(Collectors.toList());
}
@Editable(order=200, name="Import Issues")

View File

@ -51,6 +51,7 @@ import io.onedev.server.annotation.Password;
import io.onedev.server.attachment.AttachmentManager;
import io.onedev.server.attachment.AttachmentTooLargeException;
import io.onedev.server.buildspecmodel.inputspec.InputSpec;
import io.onedev.server.entitymanager.BaseAuthorizationManager;
import io.onedev.server.entitymanager.IssueManager;
import io.onedev.server.entitymanager.IterationManager;
import io.onedev.server.entitymanager.ProjectManager;
@ -309,10 +310,6 @@ public class ImportServer implements Serializable, Validatable {
project.setDescription(projectNode.get("description").asText(null));
project.setIssueManagement(projectNode.get("issues_enabled").asBoolean());
String visibility = projectNode.get("visibility").asText();
if (!visibility.equals("private") && option.getPublicRole() != null)
project.setDefaultRole(option.getPublicRole());
if (project.isNew() || project.getDefaultBranch() == null) {
logger.log("Cloning code...");
URIBuilder builder = new URIBuilder(projectNode.get("http_url_to_repo").asText());
@ -341,6 +338,10 @@ public class ImportServer implements Serializable, Validatable {
logger.warning("Skipping code clone as the project already has code");
}
String visibility = projectNode.get("visibility").asText();
if (!visibility.equals("private") && !option.getPublicRoles().isEmpty())
OneDev.getInstance(BaseAuthorizationManager.class).syncRoles(project, option.getPublicRoles());
if (option.getIssueImportOption() != null) {
List<Iteration> iterations = new ArrayList<>();
logger.log("Importing milestones...");

View File

@ -1,42 +1,40 @@
package io.onedev.server.plugin.imports.gitlab;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import io.onedev.server.OneDev;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
import io.onedev.server.annotation.Editable;
import io.onedev.server.annotation.RoleChoice;
import io.onedev.server.entitymanager.RoleManager;
import io.onedev.server.model.Role;
@Editable
public class ProjectImportOption implements Serializable {
private static final long serialVersionUID = 1L;
private String publicRoleName;
private List<String> publicRoleNames = new ArrayList<>();
private IssueImportOption issueImportOption;
@Editable(order=100, name="Public Role", description="If specified, all public and internal projects imported from GitLab "
+ "will use this as default role. Private projects are not affected")
@Editable(order=100, name="Public Roles", description="If specified, all public and internal projects imported from GitLab "
+ "will use these as default roles. Private projects are not affected")
@RoleChoice
@Nullable
public String getPublicRoleName() {
return publicRoleName;
public List<String> getPublicRoleNames() {
return publicRoleNames;
}
public void setPublicRoleName(String publicRoleName) {
this.publicRoleName = publicRoleName;
public void setPublicRoleNames(List<String> publicRoleNames) {
this.publicRoleNames = publicRoleNames;
}
@Nullable
public Role getPublicRole() {
if (publicRoleName != null)
return OneDev.getInstance(RoleManager.class).find(publicRoleName);
else
return null;
public List<Role> getPublicRoles() {
return publicRoleNames.stream().map(name -> OneDev.getInstance(RoleManager.class).find(name)).collect(Collectors.toList());
}
@Editable(order=200, name="Import Issues")

View File

@ -1,3 +1,9 @@
# 11.11.0
### RESTful API
Project default role is replaced with [base authorization](~help/api/io.onedev.server.rest.resource.BaseAuthorizationResource) to support multiple default role assignment. The defaultRoleId field should be removed when create/update the project resource.
# 11.8.0
### Query Syntax