update for i18n reviews.

This commit is contained in:
kunw 2016-07-06 16:39:40 +08:00
parent be3110634a
commit bf06a2e1b0
12 changed files with 57 additions and 56 deletions

View File

@ -1,5 +1,5 @@
reset_email_hint = Please click this link to reset your password reset_email_hint = Please click this link to reset your password
reset_email_subject = Reset your password reset_email_subject = Reset your password of Harbor account
page_title_index = Harbor page_title_index = Harbor
page_title_dashboard = Dashboard - Harbor page_title_dashboard = Dashboard - Harbor
@ -8,8 +8,8 @@ page_title_reset_password = Reset Password - Harbor
page_title_change_password = Change Password - Harbor page_title_change_password = Change Password - Harbor
page_title_forgot_password = Forgot Password - Harbor page_title_forgot_password = Forgot Password - Harbor
page_title_project = Project - Harbor page_title_project = Project - Harbor
page_title_repository = Details - Harbor page_title_repository = Project Details - Harbor
page_title_search = Search - Harbor page_title_search = Search - Harbor
page_title_sign_up = Sign Up - Harbor page_title_sign_up = Sign Up - Harbor
page_title_add_new = Add New - Harbor page_title_add_new = Add New User - Harbor
page_title_admin_option = Admin Options - Harbor page_title_admin_option = Admin Options - Harbor

View File

@ -1,14 +1,14 @@
reset_email_hint = 请点击下面的链接进行重置密码操作 reset_email_hint = 请点击下面的链接进行重置密码操作
reset_email_subject = 重置您的密码 reset_email_subject = 重置您的 Harbor 密码
page_title_index = Harbor page_title_index = Harbor
page_title_dashboard = 控制面板 - Harbor page_title_dashboard = 控制面板 - Harbor
page_title_account_setting = 个人设置 - Harbor page_title_account_setting = 账户设置 - Harbor
page_title_reset_password = 重置密码 - Harbor page_title_reset_password = 重置密码 - Harbor
page_title_change_password = 修改密码 - Harbor page_title_change_password = 修改密码 - Harbor
page_title_forgot_password = 忘记密码 - Harbor page_title_forgot_password = 忘记密码 - Harbor
page_title_project = 项目 - Harbor page_title_project = 项目 - Harbor
page_title_repository = 明细信息 - Harbor page_title_repository = 项目明细 - Harbor
page_title_search = 搜索 - Harbor page_title_search = 搜索 - Harbor
page_title_sign_up = 注册 - Harbor page_title_sign_up = 注册 - Harbor
page_title_add_new = 增加用户 - Harbor page_title_add_new = 增加用户 - Harbor

View File

@ -45,7 +45,7 @@
</div> </div>
<div class="col-xs-2 col-md-2"> <div class="col-xs-2 col-md-2">
<form> <form>
<div class="form-group" style="margin-top: 40%;"> <div class="form-group" style="margin-top: 69%;">
<button type="button" class="btn btn-primary" ng-click="vm.doSearch({op: vm.op})">// 'search' | tr //</button> <button type="button" class="btn btn-primary" ng-click="vm.doSearch({op: vm.op})">// 'search' | tr //</button>
</div> </div>
</form> </form>

View File

@ -102,12 +102,7 @@
$scope.$emit('modalTitle', $filter('tr')('alert_delete_tag_title', [vm.tag])); $scope.$emit('modalTitle', $filter('tr')('alert_delete_tag_title', [vm.tag]));
var message; var message;
console.log('vm.tagCount:' + angular.toJson(vm.tagCount[vm.repoName])); console.log('vm.tagCount:' + angular.toJson(vm.tagCount[vm.repoName]));
if(vm.tagCount[vm.repoName] === 1) { $scope.$emit('modalMessage', $filter('tr')('alert_delete_tag', [vm.tag]));
message = $filter('tr')('alert_delete_last_tag', [vm.tag]);
}else {
message = $filter('tr')('alert_delete_tag', [vm.tag]);
}
$scope.$emit('modalMessage', message);
var emitInfo = { var emitInfo = {
'confirmOnly': false, 'confirmOnly': false,

View File

@ -13,10 +13,10 @@
<table class="table table-pane"> <table class="table table-pane">
<tbody> <tbody>
<tr> <tr>
<td colspan="5" height="120px" class="empty-hint" ng-if="vm.top10Repositories.length === 0"><h3 class="text-muted">// 'no_top_repositories' | tr //</h3></td> <td colspan="5" height="120px" class="empty-hint" ng-if="vm.top10Repositories.length === 0"><h4 class="text-muted">// 'no_top_repositories' | tr //</h4></td>
</tr> </tr>
<tr ng-if="vm.top10Repositories.length > 0" ng-repeat="t in vm.top10Repositories"> <tr ng-if="vm.top10Repositories.length > 0" ng-repeat="t in vm.top10Repositories">
<td width="60%">//t.name//</td><td width="15%">//t.count//</td><td width="25%">//t.creator === '' ? 'N/A' : t.creator //</td> <td width="60%">//t.name//</td><td width="15%">//t.count//</td><td width="25%">//t.creator === '' ? '-' : t.creator //</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -2,7 +2,7 @@
<div class="table-head-container"> <div class="table-head-container">
<table class="table table-pane table-header"> <table class="table table-pane table-header">
<thead> <thead>
<th width="25%">// 'task_name' | tr //</th> <th width="25%">// 'operation' | tr //</th>
<th width="25%">// 'details' | tr //</th> <th width="25%">// 'details' | tr //</th>
<th width="25%">// 'user' | tr //</th> <th width="25%">// 'user' | tr //</th>
<th width="25%">// 'creation_time' | tr //</th> <th width="25%">// 'creation_time' | tr //</th>
@ -13,7 +13,7 @@
<table class="table table-pane"> <table class="table table-pane">
<tbody> <tbody>
<tr> <tr>
<td colspan="5" height="120px" class="empty-hint" ng-if="vm.integratedLogs.length === 0"><h3 class="text-muted">// 'no_user_logs' | tr //</h3></td> <td colspan="5" height="120px" class="empty-hint" ng-if="vm.integratedLogs.length === 0"><h4 class="text-muted">// 'no_user_logs' | tr //</h4></td>
</tr> </tr>
<tr ng-if="vm.integratedLogs.length > 0" ng-repeat="t in vm.integratedLogs"> <tr ng-if="vm.integratedLogs.length > 0" ng-repeat="t in vm.integratedLogs">
<td width="25%">//t.operation//</td><td width="25%">//t.repo_name//</td><td width="25%">//t.username//</td><td width="25%">//t.op_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td> <td width="25%">//t.operation//</td><td width="25%">//t.repo_name//</td><td width="25%">//t.username//</td><td width="25%">//t.op_time | dateL : 'YYYY-MM-DD HH:mm:ss'//</td>

View File

@ -7,6 +7,13 @@
$interpolateProvider.endSymbol('//'); $interpolateProvider.endSymbol('//');
}) })
.config(function($httpProvider) { .config(function($httpProvider) {
// if(!$httpProvider.defaults.headers) {
// $httpProvider.defaults.headers = {};
// }
// $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
// $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
$httpProvider.defaults.headers.common = {'Accept': 'application/json, text/javascript, */*; q=0.01'}; $httpProvider.defaults.headers.common = {'Accept': 'application/json, text/javascript, */*; q=0.01'};
$httpProvider.interceptors.push('redirectInterceptor'); $httpProvider.interceptors.push('redirectInterceptor');
}) })

View File

@ -26,6 +26,7 @@
var indexDesc3 = $filter('tr')('index_desc_3', []); var indexDesc3 = $filter('tr')('index_desc_3', []);
var indexDesc4 = $filter('tr')('index_desc_4', []); var indexDesc4 = $filter('tr')('index_desc_4', []);
var indexDesc5 = $filter('tr')('index_desc_5', []); var indexDesc5 = $filter('tr')('index_desc_5', []);
var indexDesc6 = $filter('tr')('index_desc_6', []);
$scope.$emit('modalTitle', $filter('tr')('harbor_intro_title')); $scope.$emit('modalTitle', $filter('tr')('harbor_intro_title'));
$scope.$emit('modalMessage', '<p class="page-content text-justify">'+ $scope.$emit('modalMessage', '<p class="page-content text-justify">'+
@ -37,6 +38,7 @@
'<li class="long-line">▪︎ ' + indexDesc3 + '</li>' + '<li class="long-line">▪︎ ' + indexDesc3 + '</li>' +
'<li class="long-line">▪︎ ' + indexDesc4 + '</li>' + '<li class="long-line">▪︎ ' + indexDesc4 + '</li>' +
'<li class="long-line">▪︎ ' + indexDesc5 + '</li>' + '<li class="long-line">▪︎ ' + indexDesc5 + '</li>' +
'<li class="long-line">▪︎ ' + indexDesc6 + '</li>' +
'</ul>'); '</ul>');
var emitInfo = { var emitInfo = {
'contentType': 'text/html', 'contentType': 'text/html',

View File

@ -4,16 +4,17 @@ var locale_messages = {
'forgot_password': 'Forgot Password', 'forgot_password': 'Forgot Password',
'login_now': 'Login Now', 'login_now': 'Login Now',
'its_easy_to_get_started': 'It\'s easy to get started ...', 'its_easy_to_get_started': 'It\'s easy to get started ...',
'anybody_can_read_public_projects': 'Anybody can read public projects', 'icon_label_1': 'Anonymous repository access',
'create_projects_and_connect_repositories': 'Create projects and connect repositories', 'icon_label_2': 'Repositories managed by project',
'user_management_and_role_assignment': 'User management and role assignment', 'icon_label_3': 'Role based access control',
'why_use_harbor': 'Why use Harbor?', 'why_use_harbor': 'Why use Harbor?',
'index_desc': 'Project Harbor is to build an enterprise-class, reliable registry server. Enterprises can set up a private registry server in their own environment to improve productivity as well as security. Project Harbor can be used in both development and production environment.', 'index_desc': 'Project Harbor is an enterprise-class registry server, which extends the open source Docker Registry server by adding the functionality usually required by an enterprise, such as security, control, and management. Harbor is primarily designed to be a private registry - providing the needed security and control that enterprises require. It also helps minimize bandwidth usage, which is helpful to both improve productivity as well as performance.',
'index_desc_1': '<strong>Security:</strong> Keep their intellectual properties within their organizations.', 'index_desc_1': '<strong>Security:</strong> Keep their intellectual properties within their organizations.',
'index_desc_2': '<strong>Efficiency:</strong> A private registry server is set up within the organization\'s network and can reduce significantly the internet traffic to the public service. ', 'index_desc_2': '<strong>Efficiency:</strong> A private registry server is set up within the organization\'s network and can reduce significantly the internet traffic to the public service. ',
'index_desc_3': '<strong>Access Control:</strong> RBAC (Role Based Access Control) is provided. User management can be integrated with existing enterprise identity services like AD/LDAP. ', 'index_desc_3': '<strong>Access Control:</strong> RBAC (Role Based Access Control) is provided. User management can be integrated with existing enterprise identity services like AD/LDAP. ',
'index_desc_4': '<strong>Audit:</strong> All access to the registry are logged and can be used for audit purpose.', 'index_desc_4': '<strong>Audit:</strong> All access to the registry are logged and can be used for audit purpose.',
'index_desc_5': '<strong>GUI:</strong> User friendly single-pane-of-glass management console.', 'index_desc_5': '<strong>GUI:</strong> User friendly single-pane-of-glass management console.',
'index_desc_6': '<strong>Image Replication:</strong> Replicate images between instances.',
'view_all': 'View all...', 'view_all': 'View all...',
'repositories': 'Repositories', 'repositories': 'Repositories',
'project_repo_name': 'Project/Repository Name', 'project_repo_name': 'Project/Repository Name',
@ -61,7 +62,7 @@ var locale_messages = {
'top_10_repositories': 'Top 10 Repositories', 'top_10_repositories': 'Top 10 Repositories',
'repository_name': 'Repository Name', 'repository_name': 'Repository Name',
'size': 'Size', 'size': 'Size',
'count': 'Count', 'count': 'Downloads',
'creator': 'Creator', 'creator': 'Creator',
'no_top_repositories': 'No data, start with Harbor now!', 'no_top_repositories': 'No data, start with Harbor now!',
'logs': 'Logs', 'logs': 'Logs',
@ -80,7 +81,7 @@ var locale_messages = {
'save': 'Save', 'save': 'Save',
'cancel': 'Cancel', 'cancel': 'Cancel',
'confirm': 'Confirm', 'confirm': 'Confirm',
'items': 'items', 'items': 'item(s)',
'add_member': 'Add Member', 'add_member': 'Add Member',
'operation': 'Operation', 'operation': 'Operation',
'advanced_search': 'Advanced Search', 'advanced_search': 'Advanced Search',
@ -93,12 +94,12 @@ var locale_messages = {
'timestamp': 'Timestamp', 'timestamp': 'Timestamp',
'dashboard': 'Dashboard', 'dashboard': 'Dashboard',
'admin_options': 'Admin Options', 'admin_options': 'Admin Options',
'account_setting': 'Account Setting', 'account_setting': 'Account Settings',
'log_out': 'Log Out', 'log_out': 'Log Out',
'registration_time': 'Registration Time', 'registration_time': 'Registration Time',
'system_management': 'System Management', 'system_management': 'System Management',
'change_password': 'Change Password', 'change_password': 'Change Password',
'search_result': 'Search Results', 'search_result': 'Search Result',
'old_password': 'Old Password', 'old_password': 'Old Password',
'old_password_is_required': 'Old password is required.', 'old_password_is_required': 'Old password is required.',
'old_password_is_incorrect': 'Old password is incorrect.', 'old_password_is_incorrect': 'Old password is incorrect.',
@ -118,15 +119,12 @@ var locale_messages = {
'tag': 'Tag', 'tag': 'Tag',
'image_details': 'Image Details', 'image_details': 'Image Details',
'pull_command': 'Pull Command', 'pull_command': 'Pull Command',
'alert_delete_repo_title': 'Delete repository - $0', 'alert_delete_repo_title': 'Confirm Deletion',
'alert_delete_repo': 'After deleting the associated tags with the repository will be deleted together.<br/>' + 'alert_delete_repo': 'All tags under this repository will be deleted. ' +
'And the corresponding image will be removed from the system.<br/>' + 'The space of this repository will be recycled during garbage collection.<br/>' +
'<br/>Delete this "$0" repository now?', '<br/>Delete repository "$0" now?',
'alert_delete_last_tag': 'After deleting the associated repository with the tag will be deleted together,<br/>' + 'alert_delete_tag_title': 'Confirm Deletion',
'because a repository contains at least one tag. And the corresponding image will be removed from the system.<br/>' + 'alert_delete_tag': 'Delete tag "$0" now?',
'<br/>Delete this "$0" tag now?',
'alert_delete_tag_title': 'Delete tag - $0',
'alert_delete_tag': 'Delete this "$0" tag now?',
'close': 'Close', 'close': 'Close',
'ok': 'OK', 'ok': 'OK',
'welcome': 'Welcome ', 'welcome': 'Welcome ',

View File

@ -2,11 +2,11 @@ var locale_messages = {
'sign_in': '登录', 'sign_in': '登录',
'sign_up': '注册', 'sign_up': '注册',
'forgot_password': '忘记密码', 'forgot_password': '忘记密码',
'login_now': '立刻登录', 'login_now': '登录',
'its_easy_to_get_started': '这很容易上手...', 'its_easy_to_get_started': '这很容易上手...',
'anybody_can_read_public_projects': '任何人都可以访问公开的项目', 'icon_label_1': '匿名访问公开镜像仓库',
'create_projects_and_connect_repositories': '创建项目并关联镜像仓库', 'icon_label_2': '基于项目的镜像管理',
'user_management_and_role_assignment': '用户管理和角色分派', 'icon_label_3': '用户角色访问控制',
'why_use_harbor': '为什么要使用Harbor', 'why_use_harbor': '为什么要使用Harbor',
'index_desc': 'Harbor是可靠的企业级Registry服务器。企业用户可使用Harbor搭建私有容器Registry服务提高生产效率和安全度既可应用于生产环境也可以在开发环境中使用。', 'index_desc': 'Harbor是可靠的企业级Registry服务器。企业用户可使用Harbor搭建私有容器Registry服务提高生产效率和安全度既可应用于生产环境也可以在开发环境中使用。',
'index_desc_1': '<strong>安全:</strong> 确保知识产权在自己组织内部的管控之下。', 'index_desc_1': '<strong>安全:</strong> 确保知识产权在自己组织内部的管控之下。',
@ -14,6 +14,7 @@ var locale_messages = {
'index_desc_3': '<strong>访问控制:</strong> 提供基于角色的访问控制,可集成企业目前拥有的用户管理系统(如:AD/LDAP。', 'index_desc_3': '<strong>访问控制:</strong> 提供基于角色的访问控制,可集成企业目前拥有的用户管理系统(如:AD/LDAP。',
'index_desc_4': '<strong>审计:</strong> 所有访问Registry服务的操作均被记录便于日后审计。', 'index_desc_4': '<strong>审计:</strong> 所有访问Registry服务的操作均被记录便于日后审计。',
'index_desc_5': '<strong>管理界面:</strong> 具有友好易用图形管理界面。', 'index_desc_5': '<strong>管理界面:</strong> 具有友好易用图形管理界面。',
'index_desc_6': '<strong>镜像复制:</strong> 在实例之间复制镜像。',
'view_all': '显示全部...', 'view_all': '显示全部...',
'repositories': '镜像仓库', 'repositories': '镜像仓库',
'project_repo_name': '项目/镜像仓库名称', 'project_repo_name': '项目/镜像仓库名称',
@ -60,22 +61,22 @@ var locale_messages = {
'total_repo_count': '全部镜像仓库', 'total_repo_count': '全部镜像仓库',
'top_10_repositories': 'Top 10 镜像仓库', 'top_10_repositories': 'Top 10 镜像仓库',
'repository_name': '镜像仓库名', 'repository_name': '镜像仓库名',
'size': '规格', 'size': '大小',
'count': '次数', 'count': '下载次数',
'creator': '创建者', 'creator': '创建者',
'no_top_repositories': '没有数据开始使用Harbor', 'no_top_repositories': '暂时没有数据。',
'logs': '日志', 'logs': '日志',
'task_name': '任务名称', 'task_name': '任务名称',
'details': '详细信息', 'details': '详细信息',
'user': '用户', 'user': '用户',
'no_user_logs': '没有数据开始使用Harbor', 'no_user_logs': '暂时没有数据。',
'users': '用户', 'users': '用户',
'my_projects': '我的项目', 'my_projects': '我的项目',
'project_name': '项目名称', 'project_name': '项目名称',
'role': '角色', 'role': '角色',
'publicity': '公开', 'publicity': '公开',
'button_on': '打开', 'button_on': '',
'button_off': '关闭', 'button_off': '',
'new_project': '新增项目', 'new_project': '新增项目',
'save': '保存', 'save': '保存',
'cancel': '取消', 'cancel': '取消',
@ -93,7 +94,7 @@ var locale_messages = {
'timestamp': '时间戳', 'timestamp': '时间戳',
'dashboard': '控制面板', 'dashboard': '控制面板',
'admin_options': '管理员选项', 'admin_options': '管理员选项',
'account_setting': '个人设置', 'account_setting': '账户设置',
'log_out': '注销', 'log_out': '注销',
'registration_time': '注册时间', 'registration_time': '注册时间',
'system_management': '系统管理', 'system_management': '系统管理',
@ -113,17 +114,15 @@ var locale_messages = {
'project_already_exist': '项目已存在。', 'project_already_exist': '项目已存在。',
'project_name_is_invalid': '项目名称无效。全部为小写字母,且不能包含空格。', 'project_name_is_invalid': '项目名称无效。全部为小写字母,且不能包含空格。',
'project_name_is_too_short': '项目名称长度过短至少多于4个字符。', 'project_name_is_too_short': '项目名称长度过短至少多于4个字符。',
'projecT_name_is_too_long': '项目名称长度超出限制最长30个字符。', 'project_name_is_too_long': '项目名称长度超出限制最长30个字符。',
'search_projects_or_repositories': '搜索项目和镜像资源', 'search_projects_or_repositories': '搜索项目和镜像资源',
'tag': '标签', 'tag': '标签',
'image_details': '镜像明细', 'image_details': '镜像明细',
'pull_command': 'Pull 命令', 'pull_command': 'Pull 命令',
'alert_delete_repo_title': '删除镜像仓库 - $0', 'alert_delete_repo_title': '确认删除',
'alert_delete_repo': '删除镜像仓库也会删除其所有相关联的镜像标签,<br/>并且其对应镜像资源文件也会被从系统删除。<br/>' + 'alert_delete_repo': '即将删除镜像仓库下的所有标签,镜像空间将在垃圾回收过程中释放。<br/>' +
'<br/>是否删除镜像仓库 "$0" ?', '<br/>是否删除镜像仓库 "$0" ?',
'alert_delete_last_tag': '当删除只包含一个镜像标签的镜像仓库时,其对应的镜像仓库也会被从系统中删除。<br/>' + 'alert_delete_tag_title': '确认删除',
'<br/>删除镜像标签 "$0" ?',
'alert_delete_tag_title': '删除镜像标签 - $0',
'alert_delete_tag': '删除镜像标签 "$0" ?', 'alert_delete_tag': '删除镜像标签 "$0" ?',
'close': '关闭', 'close': '关闭',
'ok': '确认', 'ok': '确认',

View File

@ -19,15 +19,15 @@
<div style="margin-left: auto; margin-right: auto; width: 100%;"> <div style="margin-left: auto; margin-right: auto; width: 100%;">
<div class="thumbnail display-inline-block"> <div class="thumbnail display-inline-block">
<img src="/static/resources/img/Step1.png" alt="Step 1"> <img src="/static/resources/img/Step1.png" alt="Step 1">
<h5 class="step-content">// 'anybody_can_read_public_projects' | tr //</h5> <h5 class="step-content">// 'icon_label_1' | tr //</h5>
</div> </div>
<div class="thumbnail display-inline-block"> <div class="thumbnail display-inline-block">
<img src="/static/resources/img/Step2.png" alt="Step 2"> <img src="/static/resources/img/Step2.png" alt="Step 2">
<h5 class="step-content">// 'create_projects_and_connect_repositories' | tr //</h5> <h5 class="step-content">// 'icon_label_2' | tr //</h5>
</div> </div>
<div class="thumbnail display-inline-block"> <div class="thumbnail display-inline-block">
<img src="/static/resources/img/Step3.png" alt="Step 3"> <img src="/static/resources/img/Step3.png" alt="Step 3">
<h5 class="step-content">// 'user_management_and_role_assignment' | tr //</h5> <h5 class="step-content">// 'icon_label_3' | tr //</h5>
</div> </div>
</div> </div>
</div> </div>

View File

@ -6,13 +6,13 @@
<h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'search_result' | tr //</h1> <h1 class="col-md-12 col-md-offset-2 main-title title-color">// 'search_result' | tr //</h1>
<div class="row"> <div class="row">
<div class="col-md-12 col-md-offset-2 main-content"> <div class="col-md-12 col-md-offset-2 main-content">
<h4 class="page-header title-color underlined">Projects&nbsp;&nbsp;<span class="badge">//vm.project.length//</span></h4> <h4 class="page-header title-color underlined">// 'projects' | tr //&nbsp;&nbsp;<span class="badge">//vm.project.length//</span></h4>
<div class="search-result"> <div class="search-result">
<ul> <ul>
<li ng-repeat="p in vm.project"><a href="/repository#/repositories?project_id=//p.id//&is_public=//p.public === 1//">//p.name//</a></li> <li ng-repeat="p in vm.project"><a href="/repository#/repositories?project_id=//p.id//&is_public=//p.public === 1//">//p.name//</a></li>
</ul> </ul>
</div> </div>
<h4 class="page-header title-color underlined">Repositories&nbsp;&nbsp;<span class="badge">//vm.repository.length//</span></h4> <h4 class="page-header title-color underlined">// 'repositories' | tr //&nbsp;&nbsp;<span class="badge">//vm.repository.length//</span></h4>
<div class="search-result"> <div class="search-result">
<ul> <ul>
<li ng-repeat="r in vm.repository"><a href="/repository#/repositories?project_id=//r.project_id//&is_public=//r.project_public === 1//#//r.repository_name//">//r.repository_name//</a></li> <li ng-repeat="r in vm.repository"><a href="/repository#/repositories?project_id=//r.project_id//&is_public=//r.project_public === 1//#//r.repository_name//">//r.repository_name//</a></li>