diff options
237 files changed, 8139 insertions, 2946 deletions
diff --git a/.scss-lint.yml b/.scss-lint.yml index 16a168b7c60..a855ef3c6e9 100644 --- a/.scss-lint.yml +++ b/.scss-lint.yml @@ -14,7 +14,7 @@ linters: # Whether or not to prefer `border: 0` over `border: none`. BorderZero: - enabled: false + enabled: true # Reports when you define a rule set using a selector with chained classes # (a.k.a. adjoining classes). diff --git a/app/assets/images/icons.json b/app/assets/images/icons.json index c0ed2ffdcb2..d8d173612d5 100644 --- a/app/assets/images/icons.json +++ b/app/assets/images/icons.json @@ -1 +1 @@ -{"iconCount":164,"spriteSize":72823,"icons":["abuse","account","admin","angle-double-left","angle-double-right","angle-down","angle-left","angle-right","angle-up","appearance","applications","approval","arrow-right","assignee","bold","book","branch","calendar","cancel","chevron-down","chevron-left","chevron-right","chevron-up","clock","close","code","collapse","comment-dots","comment-next","comment","comments","commit","credit-card","dashboard","disk","doc_code","doc_image","doc_text","download","duplicate","earth","eye-slash","eye","file-additions","file-deletion","file-modified","filter","folder","fork","geo-nodes","git-merge","group","history","home","hook","image-comment-dark","import","issue-block","issue-child","issue-close","issue-duplicate","issue-new","issue-open-m","issue-open","issue-parent","issues","key-2","key","label","labels","leave","level-up","license","link","list-bulleted","list-numbered","location-dot","location","lock-open","lock","log","mail","menu","merge-request-close","messages","mobile-issue-close","monitor","more","notifications-off","notifications","overview","pencil","pipeline","play","plus-square-o","plus-square","plus","preferences","profile","project","push-rules","question-o","question","quote","redo","remove","repeat","retry","scale","screen-full","screen-normal","scroll_down","scroll_up","search","settings","shield","slight-frown","slight-smile","smile","smiley","snippet","spam","star-o","star","status_canceled_borderless","status_canceled","status_closed","status_created_borderless","status_created","status_failed_borderless","status_failed","status_manual_borderless","status_manual","status_notfound_borderless","status_open","status_pending_borderless","status_pending","status_running_borderless","status_running","status_skipped_borderless","status_skipped","status_success_borderless","status_success_solid","status_success","status_warning_borderless","status_warning","stop","talic","task-done","template","thump-down","thump-up","timer","todo-add","todo-done","token","unapproval","unassignee","unlink","user","users","volume-up","warning","work"]}
\ No newline at end of file +{"iconCount":173,"spriteSize":75815,"icons":["abuse","account","admin","angle-double-left","angle-double-right","angle-down","angle-left","angle-right","angle-up","appearance","applications","approval","arrow-right","assignee","bold","book","branch","bullhorn","calendar","cancel","chart","chevron-down","chevron-left","chevron-right","chevron-up","clock","close","code","collapse","comment-dots","comment-next","comment","comments","commit","credit-card","cut","dashboard","disk","doc_code","doc_image","doc_text","double-headed-arrow","download","duplicate","earth","external-link","eye-slash","eye","file-addition","file-deletion","file-modified","filter","folder","fork","geo-nodes","git-merge","group","history","home","hook","hourglass","image-comment-dark","import","issue-block","issue-child","issue-close","issue-duplicate","issue-new","issue-open-m","issue-open","issue-parent","issues","italic","key-2","key","label","labels","leave","level-up","license","link","list-bulleted","list-numbered","location-dot","location","lock-open","lock","log","mail","menu","merge-request-close","messages","mobile-issue-close","monitor","more","notifications-off","notifications","overview","pencil","pipeline","play","plus-square-o","plus-square","plus","preferences","profile","project","push-rules","question-o","question","quote","redo","remove","repeat","retry","scale","screen-full","screen-normal","scroll_down","scroll_up","search","settings","shield","slight-frown","slight-smile","smile","smiley","snippet","spam","spinner","star-o","star","status_canceled_borderless","status_canceled","status_closed","status_created_borderless","status_created","status_failed_borderless","status_failed","status_manual_borderless","status_manual","status_notfound_borderless","status_open","status_pending_borderless","status_pending","status_running_borderless","status_running","status_skipped_borderless","status_skipped","status_success_borderless","status_success_solid","status_success","status_warning_borderless","status_warning","stop","task-done","template","terminal","thumb-down","thumb-up","thumbtack","timer","todo-add","todo-done","token","unapproval","unassignee","unlink","user","users","volume-up","warning","work"]}
\ No newline at end of file diff --git a/app/assets/images/icons.svg b/app/assets/images/icons.svg index b9829d0d450..c8f10628713 100644 --- a/app/assets/images/icons.svg +++ b/app/assets/images/icons.svg @@ -1 +1 @@ -<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol viewBox="0 0 16 16" id="abuse" xmlns="http://www.w3.org/2000/svg"><path d="M11.408.328l4.029 3.222A1.5 1.5 0 0 1 16 4.72v6.555a1.5 1.5 0 0 1-.563 1.171l-4.026 3.224a1.5 1.5 0 0 1-.937.329H5.529a1.5 1.5 0 0 1-.937-.328L.563 12.45A1.5 1.5 0 0 1 0 11.28V4.724a1.5 1.5 0 0 1 .563-1.171L4.589.329A1.5 1.5 0 0 1 5.526 0h4.945c.34 0 .67.116.937.328zM10.296 2H5.702L2 4.964v6.074L5.704 14h4.594L14 11.036V4.962L10.296 2zM8 4a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0V5a1 1 0 0 1 1-1zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="account" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9.195 9.965l-.568-.875a.25.25 0 0 1 .015-.294l.405-.5a.25.25 0 0 1 .283-.075l.938.36c.257-.183.543-.325.851-.42l.322-.988A.25.25 0 0 1 11.679 7h.642a.25.25 0 0 1 .238.173l.322.988c.308.095.594.237.851.42l.938-.36a.25.25 0 0 1 .283.076l.405.5a.25.25 0 0 1 .015.293l-.568.875c.113.297.18.616.193.95l.898.54a.25.25 0 0 1 .115.27l-.144.626a.25.25 0 0 1-.222.193l-1.115.098a3.015 3.015 0 0 1-.512.608l.165 1.18a.25.25 0 0 1-.138.259l-.577.281a.25.25 0 0 1-.29-.05l-.874-.905a3.035 3.035 0 0 1-.608 0l-.875.904a.25.25 0 0 1-.289.051l-.577-.281a.25.25 0 0 1-.138-.26l.165-1.18a3.015 3.015 0 0 1-.512-.607l-1.115-.098a.25.25 0 0 1-.222-.193l-.144-.626a.25.25 0 0 1 .115-.27l.898-.54c.013-.334.08-.653.193-.95zM6.789 8.023A12.845 12.845 0 0 0 6 8c-5.036 0-6 2.74-6 4.48C0 14.22.076 15 6 15c.553 0 1.055-.006 1.51-.02A5.977 5.977 0 0 1 6 11c0-1.083.287-2.1.79-2.977zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM12 12a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="admin" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.162 2.5a3.5 3.5 0 0 1-3.163 5.479L6.08 14.766a1.5 1.5 0 0 1-2.598-1.5L7.4 6.479A3.5 3.5 0 0 1 10.564 1L8.9 3.88l2.599 1.5 1.663-2.88zm-8.63 11.949a.5.5 0 1 0 .5-.866.5.5 0 0 0-.5.866z"/></symbol><symbol viewBox="0 0 16 16" id="angle-double-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.414 7.95l4.243-4.243a1 1 0 0 0-1.414-1.414l-4.95 4.95a.997.997 0 0 0 0 1.414l4.95 4.95a1 1 0 1 0 1.414-1.415L10.414 7.95zm-7 0l4.243-4.243a1 1 0 0 0-1.414-1.414l-4.95 4.95a.997.997 0 0 0 0 1.414l4.95 4.95a1 1 0 0 0 1.414-1.415L3.414 7.95z"/></symbol><symbol viewBox="0 0 16 16" id="angle-double-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.536 7.95L1.293 3.707a1 1 0 0 1 1.414-1.414l4.95 4.95a.997.997 0 0 1 0 1.414l-4.95 4.95a1 1 0 1 1-1.414-1.415L5.536 7.95zm7 0L8.293 3.707a1 1 0 0 1 1.414-1.414l4.95 4.95a.997.997 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.414-1.415l4.243-4.242z"/></symbol><symbol viewBox="0 0 16 16" id="angle-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 10.243l-4.95-4.95a1 1 0 0 0-1.414 1.414l5.657 5.657a.997.997 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L8 10.243z"/></symbol><symbol viewBox="0 0 16 16" id="angle-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.757 8l4.95-4.95a1 1 0 1 0-1.414-1.414L3.636 7.293a.997.997 0 0 0 0 1.414l5.657 5.657a1 1 0 0 0 1.414-1.414L5.757 8z"/></symbol><symbol viewBox="0 0 16 16" id="angle-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.243 8l-4.95-4.95a1 1 0 0 1 1.414-1.414l5.657 5.657a.997.997 0 0 1 0 1.414l-5.657 5.657a1 1 0 0 1-1.414-1.414L10.243 8z"/></symbol><symbol viewBox="0 0 16 16" id="angle-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 6.757l-4.95 4.95a1 1 0 1 1-1.414-1.414l5.657-5.657a.997.997 0 0 1 1.414 0l5.657 5.657a1 1 0 0 1-1.414 1.414L8 6.757z"/></symbol><symbol viewBox="0 0 16 16" id="appearance" xmlns="http://www.w3.org/2000/svg"><path d="M11.161 12.456l.232.121c.1.053.175.094.249.137.53.318.844.75.857 1.402.012 1.397-1.116 1.756-3.12 1.858a23.85 23.85 0 0 1-1.38.026A8 8 0 0 1 0 8a8 8 0 0 1 8-8c4.417 0 7.998 3.582 7.998 7.977.06 2.621-1.312 3.586-4.48 3.648-.602.008-1.068.043-1.4.104.228.192.598.47 1.043.727zm-3.287-.943c-.019-1.495 1.228-1.856 3.611-1.888C13.67 9.582 14.028 9.33 13.998 8A6 6 0 1 0 8 14c.603 0 .91-.004 1.277-.023a9.7 9.7 0 0 0 .478-.035c-1.172-.738-1.868-1.47-1.88-2.43zM6 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-2-3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zM4 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="applications" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 0h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm6-6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 1v2h2V1H7zm0 5h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm6-6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm0 1v2h2V7h-2zM1 12h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zm0 1v2h2v-2H1zm6-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zm6 0h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="approval" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.536 10.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 1 1 9.12 9.243l1.415 1.414zM7.632 8.109A2 2 0 0 0 7 11.364l2.121 2.121a1.996 1.996 0 0 0 2.807.021C11.686 14.554 10.627 15 6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8c.6 0 1.142.038 1.632.109zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="arrow-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9 6H2a2 2 0 1 0 0 4h7v2.586a1 1 0 0 0 1.707.707l4.586-4.586a1 1 0 0 0 0-1.414l-4.586-4.586A1 1 0 0 0 9 3.414V6z"/></symbol><symbol viewBox="0 0 16 16" id="assignee" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12 5V4a1 1 0 0 1 2 0v1h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V7h-1a1 1 0 0 1 0-2h1zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="bold" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2 15V1a1 1 0 0 1 1-1h4.604c.93 0 1.762.088 2.495.264.733.176 1.353.445 1.863.807.509.363.897.82 1.164 1.369.268.549.401 1.197.401 1.945 0 .366-.045.718-.137 1.055-.091.337-.23.652-.417.945a3.453 3.453 0 0 1-.71.796 3.645 3.645 0 0 1-1.021.588c.469.117.87.295 1.203.533.333.238.608.515.824.83.216.315.374.657.473 1.027.099.37.148.75.148 1.138 0 1.553-.5 2.725-1.5 3.516-1 .791-2.423 1.187-4.27 1.187H3a1 1 0 0 1-1-1zm3.297-5.967v4.319H8.12c.425 0 .791-.053 1.099-.16.307-.106.564-.252.769-.44.205-.186.357-.406.456-.659.099-.252.148-.529.148-.83a3.04 3.04 0 0 0-.131-.928 1.78 1.78 0 0 0-.413-.703 1.8 1.8 0 0 0-.73-.445c-.3-.103-.66-.154-1.077-.154H5.297zm0-2.33h2.44c.842-.014 1.468-.192 1.878-.533.41-.34.616-.826.616-1.456 0-.725-.21-1.247-.632-1.566-.421-.318-1.086-.478-1.995-.478H5.297v4.033z"/></symbol><symbol viewBox="0 0 16 16" id="book" xmlns="http://www.w3.org/2000/svg"><path d="M7 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2v4.191a.5.5 0 0 1-.724.447l-1.052-.526a.5.5 0 0 0-.448 0l-1.052.526A.5.5 0 0 1 7 6.191V2zM5 0h6a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"/></symbol><symbol viewBox="0 0 16 16" id="branch" xmlns="http://www.w3.org/2000/svg"><path d="M6 11.978v.29a2 2 0 1 1-2 0V3.732a2 2 0 1 1 2 0v3.849c.592-.491 1.31-.854 2.15-1.081 1.308-.353 1.875-.882 1.893-1.743a2 2 0 1 1 2.002-.051C12.053 6.54 10.857 7.84 8.67 8.43 7.056 8.867 6.195 9.98 6 11.978zM5 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm6 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2zM5 15a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="calendar" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12 2h2a2 2 0 0 1 2 2H0a2 2 0 0 1 2-2h2V1a1 1 0 1 1 2 0v1h4V1a1 1 0 1 1 2 0v1zM0 4h16v9a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V4zm2 2.5V13a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6.5a.5.5 0 0 0-.5-.5h-11a.5.5 0 0 0-.5.5zM5 8h2a1 1 0 1 1 0 2H5a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="cancel" xmlns="http://www.w3.org/2000/svg"><path d="M3.11 4.523a6 6 0 0 0 8.367 8.367L3.109 4.524zM4.522 3.11l8.368 8.368A6 6 0 0 0 4.524 3.11zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.078 8.2l3.535-3.536a2 2 0 0 1 2.828 2.828l-4.949 4.95c-.39.39-.902.586-1.414.586a1.994 1.994 0 0 1-1.414-.586l-4.95-4.95a2 2 0 1 1 2.828-2.828l3.536 3.535z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.977 7.998l3.535-3.535a2 2 0 1 0-2.828-2.828l-4.95 4.949c-.39.39-.586.902-.586 1.414 0 .512.196 1.024.586 1.414l4.95 4.95a2 2 0 1 0 2.828-2.828L7.977 7.998z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.22 7.998L4.683 4.463a2 2 0 0 1 2.828-2.828l4.95 4.949c.39.39.586.902.586 1.414a1.99 1.99 0 0 1-.586 1.414l-4.95 4.95a2 2 0 0 1-2.828-2.828l3.535-3.536z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.778 8.957l3.535 3.535a2 2 0 1 0 2.828-2.828l-4.949-4.95a1.994 1.994 0 0 0-1.414-.586c-.512 0-1.024.196-1.414.586l-4.95 4.95a2 2 0 1 0 2.828 2.828l3.536-3.535z"/></symbol><symbol viewBox="0 0 16 16" id="clock" xmlns="http://www.w3.org/2000/svg"><path d="M9 7h1a1 1 0 0 1 0 2H8a.997.997 0 0 1-1-1V5a1 1 0 1 1 2 0v2zm-1 9A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="close" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9.414 8l4.95-4.95a1 1 0 0 0-1.414-1.414L8 6.586l-4.95-4.95A1 1 0 0 0 1.636 3.05L6.586 8l-4.95 4.95a1 1 0 1 0 1.414 1.414L8 9.414l4.95 4.95a1 1 0 1 0 1.414-1.414L9.414 8z"/></symbol><symbol viewBox="0 0 16 16" id="code" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M15.871 8.243a.997.997 0 0 0-.293-.707L12.75 4.707a1 1 0 0 0-1.414 1.414l2.12 2.122-2.12 2.121a1 1 0 0 0 1.414 1.414l2.828-2.828a.997.997 0 0 0 .293-.707zm-13.243 0L4.75 6.12a1 1 0 1 0-1.414-1.414L.507 7.536a.997.997 0 0 0 0 1.414l2.829 2.828a1 1 0 1 0 1.414-1.414L2.628 8.243zm6.407-4.107a1 1 0 0 1 .707 1.225L8.19 11.157a1 1 0 1 1-1.931-.518L7.81 4.843a1 1 0 0 1 1.224-.707z"/></symbol><symbol viewBox="0 0 9 13" id="collapse"><path d="M.084.25C.01.18-.015.12.008.071.031.024.093 0 .194 0h8.521c.1 0 .162.024.185.072.023.048-.002.107-.075.177l-4.11 3.935a.372.372 0 0 1-.11.072h-.301a.508.508 0 0 1-.11-.072L.084.249zM.377 6.88a.364.364 0 0 1-.26-.105.334.334 0 0 1-.11-.25v-.709c0-.096.036-.179.11-.249a.364.364 0 0 1 .26-.105h8.15c.101 0 .188.035.261.105.074.07.11.153.11.25v.709c0 .096-.036.179-.11.249a.364.364 0 0 1-.26.105H.377zM.084 12.132c-.074.07-.099.129-.076.177.023.048.085.072.186.072h8.521c.1 0 .162-.024.185-.072.023-.048-.002-.107-.075-.177l-4.11-3.935a.372.372 0 0 0-.11-.072h-.301a.508.508 0 0 0-.11.072l-4.11 3.935z"/></symbol><symbol viewBox="0 0 16 16" id="comment" xmlns="http://www.w3.org/2000/svg"><path d="M1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586z"/></symbol><symbol viewBox="0 0 16 16" id="comment-dots" xmlns="http://www.w3.org/2000/svg"><path d="M1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586zM5 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="comment-next" xmlns="http://www.w3.org/2000/svg"><path d="M8 5V4a.5.5 0 0 1 .8-.4l2.667 2a.5.5 0 0 1 0 .8L8.8 8.4A.5.5 0 0 1 8 8V7H6a1 1 0 1 1 0-2h2zM1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586z"/></symbol><symbol viewBox="0 0 16 16" id="comments" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3.75 10L0 13V3a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H3.75zM13 5h1a2 2 0 0 1 2 2v8l-2.667-2H8a2 2 0 0 1-2-2h4a3 3 0 0 0 3-3V5z"/></symbol><symbol viewBox="0 0 16 16" id="commit" xmlns="http://www.w3.org/2000/svg"><path d="M8 10a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm3.876-1.008a4.002 4.002 0 0 1-7.752 0A1.01 1.01 0 0 1 4 9H1a1 1 0 1 1 0-2h3c.042 0 .083.003.124.008a4.002 4.002 0 0 1 7.752 0A1.01 1.01 0 0 1 12 7h3a1 1 0 0 1 0 2h-3a1.01 1.01 0 0 1-.124-.008z"/></symbol><symbol viewBox="0 0 16 16" id="credit-card" xmlns="http://www.w3.org/2000/svg"><path d="M14 5a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1h12zm0 3H2v3a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V8zM3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm6.5 8h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1z"/></symbol><symbol viewBox="0 0 16 16" id="dashboard" xmlns="http://www.w3.org/2000/svg"><path d="M7.709 10.021l.696-2.6a.5.5 0 0 1 .966.26l-.657 2.45A2 2 0 0 1 10 12H6a2 2 0 0 1 1.709-1.979zM0 8.9a8 8 0 0 1 15.998 0H16v3.6a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5V8.9zM14 9A6 6 0 1 0 2 9v3.5a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5V9zM3.5 9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9 0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-7-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm5 0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1z"/></symbol><symbol viewBox="0 0 16 16" id="disk" xmlns="http://www.w3.org/2000/svg"><path d="M16 11.764V3a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3v8.764A2.989 2.989 0 0 1 2 11V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v8c.768 0 1.47.289 2 .764zM2 12h12a2 2 0 1 1 0 4H2a2 2 0 1 1 0-4zm10 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="doc_code" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zm1.036 7.607a.498.498 0 0 1-.147.354l-1.414 1.414a.5.5 0 0 1-.707-.707l1.06-1.06-1.06-1.061a.5.5 0 0 1 .707-.707l1.414 1.414a.498.498 0 0 1 .147.353zm-4.822 0l1.06 1.061a.5.5 0 0 1-.706.707l-1.414-1.414a.498.498 0 0 1 0-.707l1.414-1.414a.5.5 0 1 1 .707.707l-1.06 1.06zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"/></symbol><symbol viewBox="0 0 16 16" id="doc_image" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zM7.333 9.667l1.313-1.313a.5.5 0 0 1 .708 0L12 11H4l2.188-1.75a.5.5 0 0 1 .624 0l.521.417zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm.5 8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM4 11h8v.7a.3.3 0 0 1-.3.3H4.3a.3.3 0 0 1-.3-.3V11z"/></symbol><symbol viewBox="0 0 16 16" id="doc_text" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm.5 11h5a.5.5 0 1 1 0 1h-5a.5.5 0 1 1 0-1zm0-2h5a.5.5 0 1 1 0 1h-5a.5.5 0 0 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1z"/></symbol><symbol viewBox="0 0 16 16" id="download" xmlns="http://www.w3.org/2000/svg"><path d="M9 12h1a.5.5 0 0 1 .4.8l-2 2.667a.5.5 0 0 1-.8 0l-2-2.667A.5.5 0 0 1 6 12h1V8a1 1 0 1 1 2 0v4zM4 9a1 1 0 1 1 0 2 4 4 0 0 1-1.971-7.481 4 4 0 0 1 6.633-2.505 3.999 3.999 0 0 1 3.82 2.014A4 4 0 0 1 12 11a1 1 0 0 1 0-2 2 2 0 1 0 0-4h-1a2 2 0 0 0-3.112-1.662A2 2 0 1 0 4.268 5H4a2 2 0 1 0 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="duplicate" xmlns="http://www.w3.org/2000/svg"><path d="M14 10h-3a1 1 0 0 1-1-1V6H8.527A.527.527 0 0 0 8 6.527V13a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-3zm-4-7H8.527c-.18 0-.355.013-.527.04V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2v2H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h4a3 3 0 0 1 3 3zM8.527 4h2.323a.5.5 0 0 1 .35.143l4.65 4.551a.5.5 0 0 1 .15.357V13a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V6.527A2.527 2.527 0 0 1 8.527 4z"/></symbol><symbol viewBox="0 0 16 16" id="earth" xmlns="http://www.w3.org/2000/svg"><path d="M8.7 2.04l-.082.177c.283.223.422.413.417.571-.008.237-.311.057-.444.274-.133.218.038.542-.112.637-.15.096-.398-.386-.479-.46-.054-.049-.166-.257-.336-.625l-.216-.225a.844.844 0 0 0-.418-.035c-.177.038-.075.1-.035.132.04.032.32.037.452.2.132.164.03.224-.05.298-.054.05-.157.062-.31.035H5.952l-.402.398.03.325.229.455.324-.463c.008-.206.058-.342.15-.41.14-.1.342-.15.534-.085.191.066-.057.218.011.271.068.053.204-.098.313-.02.11.08.07.155.104.322.036.167.254.114.398.328.144.215.19.29.147.483-.043.195-.168.26-.305.232-.138-.028-.107-.246-.275-.348-.168-.102-.266-.114-.386-.054-.12.06-.016.129.023.235.04.106.274.321.224.43-.05.107-.108.116-.42 0-.21-.077-.414-.007-.615.212l-.76.722c-.153.715-.3 1.13-.44 1.243-.211.17-.177-.483-.483-.656-.306-.174-.494-.047-.8-.07-.307-.023-.42.65-.38.873a.434.434 0 0 0 .221.321c.236-.141.39-.184.465-.128.11.084-.144.267-.074.425.07.158.314.069.386.283.073.213.084.48-.05.706-.135.227-.275.178-.4.053-.127-.126-.033-.375-.255-.704-.223-.329-.381-.337-.63-.787-.158-.287-.35-.743-.575-1.366a6 6 0 0 0 3.21 7.198l.001-.075c0-.577-.004-.944-.012-1.102-.011-.236-.95-.945-1.104-1.2-.154-.256-.34-.595-.355-.746-.016-.151.185-.232.344-.325.16-.093-.11-.367.028-.626.137-.258.395-.438.496-.356.101.081.058.228.267.333.209.104.077-.213.456-.178.38.035.143.201.252.216.11.016.113-.127.299-.143.186-.015.282.445.471.622.19.178.452.008.611.043.159.034.267.09.402.255.136.166-.03.352.073.557.103.205 1.07.22 1.433.255.364.034.371.011.371.324s-.166.314-.453.507c-.286.193-.166.462-.38.762-.212.3-.316.062-.622.14-.306.077-.413.382-.452.568-.039.186-.386.094-.877.232-.29.082-.429.144-.569.204a6.002 6.002 0 0 0 7.682-4.3c-.094-.384-.18-.63-.258-.74-.213-.297-.36.21-.924.49-.564.278-.57-.288-.81-.49-.16-.133-.212-.44-.158-.92-.005-.478.02-.828.077-1.049.057-.221.126-.543.207-.965.351-.373.606-.572.764-.595.237-.034.336.374.658.3a.315.315 0 0 0 .035-.01 5.993 5.993 0 0 0-.475-.824l-.309-.043a.646.646 0 0 0-.332-.117c-.205-.02-.025.128-.089.24-.064.112-.235.724-.437.685-.201-.039-.204-.374-.17-.668.036-.294-.077-.35-.2-.412-.124-.062-.325-.213-.556-.295-.232-.082-.123-.175-.093-.274.03-.1.208-.015.193-.058-.014-.044-.313-.135-.266-.167.03-.02.2-.02.506.003l.216-.012.293-.163a.58.58 0 0 0-.376-.22c-.233-.036-.513-.034-.73-.142-.205-.103-.458-.36-.643-.638A5.965 5.965 0 0 0 8.7 2.04zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/></symbol><symbol viewBox="0 0 16 16" id="eye" xmlns="http://www.w3.org/2000/svg"><path d="M8 14C4.816 14 2.253 12.284.393 8.981a2 2 0 0 1 0-1.962C2.253 3.716 4.816 2 8 2s5.747 1.716 7.607 5.019a2 2 0 0 1 0 1.962C13.747 12.284 11.184 14 8 14zm0-2c2.41 0 4.338-1.29 5.864-4C12.338 5.29 10.411 4 8 4 5.59 4 3.662 5.29 2.136 8 3.662 10.71 5.589 12 8 12zm0-1a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm1-3a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="eye-slash" xmlns="http://www.w3.org/2000/svg"><path d="M13.618 2.62L1.62 14.619a1 1 0 0 1-.985-1.668l1.525-1.526C1.516 10.742.926 9.927.393 8.981a2 2 0 0 1 0-1.962C2.253 3.716 4.816 2 8 2c1.074 0 2.076.195 3.006.58l.944-.944a1 1 0 0 1 1.668.985zM8.068 11a3 3 0 0 0 2.931-2.932l-2.931 2.931zm-3.02-2.462a3 3 0 0 1 3.49-3.49l.884-.884A6.044 6.044 0 0 0 8 4C5.59 4 3.662 5.29 2.136 8c.445.79.924 1.46 1.439 2.011l1.473-1.473zm.421 5.06l1.658-1.658c.283.04.575.06.873.06 2.41 0 4.338-1.29 5.864-4a11.023 11.023 0 0 0-1.133-1.664l1.418-1.418a12.799 12.799 0 0 1 1.458 2.1 2 2 0 0 1 0 1.963C13.747 12.284 11.184 14 8 14a7.883 7.883 0 0 1-2.53-.402z"/></symbol><symbol viewBox="0 0 16 16" id="file-additions" xmlns="http://www.w3.org/2000/svg"><path d="M7 7V5a1 1 0 1 1 2 0v2h2a1 1 0 0 1 0 2H9v2a1 1 0 0 1-2 0V9H5a1 1 0 1 1 0-2h2zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3z"/></symbol><symbol viewBox="0 0 16 16" id="file-deletion" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3zm2 6h6a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="file-modified" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3zm5 4a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"/></symbol><symbol viewBox="0 0 16 16" id="filter" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 6v9l-3.724-1.862A.5.5 0 0 1 6 12.691V6L1.854 1.854A.5.5 0 0 1 2.207 1h11.586a.5.5 0 0 1 .353.854L10 6z"/></symbol><symbol viewBox="0 0 16 16" id="folder" xmlns="http://www.w3.org/2000/svg"><path d="M7.228 5l-.475-1.335A1 1 0 0 0 5.81 3H2v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H7.228zM13 3a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a2 2 0 0 1 2-2h3.81a3 3 0 0 1 2.827 1.995L13 3z"/></symbol><symbol viewBox="0 0 16 16" id="fork" xmlns="http://www.w3.org/2000/svg"><path d="M9 12.268a2 2 0 1 1-2 0V8.874A4.002 4.002 0 0 1 4 5V3.732a2 2 0 1 1 2 0V5a2 2 0 1 0 4 0V3.732a2 2 0 1 1 2 0V5a4.002 4.002 0 0 1-3 3.874v3.394zM11 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zM5 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 12a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="geo-nodes" xmlns="http://www.w3.org/2000/svg"><path d="M9.7 13.1l-.2.2c-.7.8-2 .9-2.8.1-.1 0-.1-.1-.1-.1l-.2-.2c-2 .2-3.4.7-3.4 1.4 0 .8 2.2 1.5 5 1.5s5-.7 5-1.5c0-.7-1.4-1.2-3.3-1.4M7.3 12.7c.4.4 1 .3 1.4-.1C11.6 9.5 13 7 13 5.3 13 2.4 10.8 0 8 0S3 2.4 3 5.3C3 7 4.4 9.5 7.3 12.7M8 2c1.6 0 3 1.4 3 3.3 0 1-1 2.8-3 5.2-2-2.4-3-4.2-3-5.2C5 3.4 6.4 2 8 2"/><circle cx="8" cy="5" r="1"/></symbol><symbol viewBox="0 0 16 16" id="git-merge" xmlns="http://www.w3.org/2000/svg"><path d="M11 12.268V5a1 1 0 0 0-1-1v1a.5.5 0 0 1-.8.4l-2.667-2a.5.5 0 0 1 0-.8L9.2.6a.5.5 0 0 1 .8.4v1a3 3 0 0 1 3 3v7.268a2 2 0 1 1-2 0zm-6 0a2 2 0 1 1-2 0V4.732a2 2 0 1 1 2 0v7.536zM4 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="group" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3.048 11.997C-.377 11.975.013 11.782.013 10.56.013 9.235.653 8 4 8c.444 0 .84.022 1.194.062.164.435.426.82.76 1.132-1.786.389-2.721 1.353-2.906 2.803zm2.94-7.222a2.993 2.993 0 0 0-.976 1.95 2 2 0 1 1 .975-1.95zm6.964 7.222c-.185-1.45-1.12-2.414-2.906-2.803.334-.311.596-.697.76-1.132C11.16 8.022 11.556 8 12 8c3.346 0 3.987 1.235 3.987 2.56 0 1.222.39 1.415-3.035 1.437zm-1.964-5.272a2.993 2.993 0 0 0-.976-1.95 2 2 0 1 1 .976 1.95zM8 9a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 5c-2.177 0-3.987-.115-3.987-1.44S4.653 10 8 10c3.346 0 3.987 1.235 3.987 2.56S10.177 14 8 14z"/></symbol><symbol viewBox="0 0 16 16" id="history" xmlns="http://www.w3.org/2000/svg"><path d="M2.868 3.24a7 7 0 1 1-.043 9.475 1 1 0 0 1 1.478-1.348 5 5 0 1 0 .124-6.865l.796.645a.5.5 0 0 1-.193.873l-3.232.814a.5.5 0 0 1-.622-.504L1.3 3a.5.5 0 0 1 .814-.37l.754.61zM9 8h1a1 1 0 0 1 0 2H8a.997.997 0 0 1-1-1V6a1 1 0 1 1 2 0v2z"/></symbol><symbol viewBox="0 0 16 16" id="home" xmlns="http://www.w3.org/2000/svg"><path d="M8.462 2.177a.505.505 0 0 1-.038.044l.038-.044zm-.787 0l.038.043a.5.5 0 0 1-.038-.043zM3.706 7h8.725L8.069 2.585 3.706 7zM7 13.369V12a1 1 0 0 1 2 0v1.369h3V9H4v4.369h3zM14 9v4.836c0 .833-.657 1.533-1.5 1.533h-9c-.843 0-1.5-.7-1.5-1.533V9h-.448a1.1 1.1 0 0 1-.783-1.873L6.934.887a1.5 1.5 0 0 1 2.269 0l6.165 6.24A1.1 1.1 0 0 1 14.585 9H14z"/></symbol><symbol viewBox="0 0 16 16" id="hook" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1h4zm0 1H6v1a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V4zM7 8a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h2a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3v4a2 2 0 1 0 4 0h-.44a.3.3 0 0 1-.25-.466l1.44-2.16a.3.3 0 0 1 .5 0l1.44 2.16a.3.3 0 0 1-.25.466H15a4 4 0 0 1-7 2.646A4 4 0 0 1 1 12H.56a.3.3 0 0 1-.25-.466l1.44-2.16a.3.3 0 0 1 .5 0l1.44 2.16a.3.3 0 0 1-.25.466H3a2 2 0 1 0 4 0V8z"/></symbol><symbol viewBox="0 0 24 30" id="image-comment-dark" xmlns="http://www.w3.org/2000/svg"><title>cursor_active</title><g fill="none" fill-rule="evenodd"><path d="M24 12.105c0 6.686-5.74 11.58-12 17.895C5.74 23.684 0 18.79 0 12.105 0 5.42 5.373 0 12 0s12 5.42 12 12.105z" fill="#FFF" fill-rule="nonzero"/><path d="M15.28 25.249c1.458-1.475 2.539-2.635 3.474-3.747 2.851-3.394 4.203-6.265 4.203-9.397 0-6.111-4.908-11.062-10.957-11.062-6.05 0-10.957 4.951-10.957 11.062 0 3.132 1.352 6.003 4.203 9.397.935 1.112 2.016 2.272 3.474 3.747.511.517 2.216 2.213 3.28 3.275 1.064-1.062 2.769-2.758 3.28-3.275z" fill="#1F78D1"/><path d="M14.551 8.256A6.874 6.874 0 0 0 12 7.787a6.92 6.92 0 0 0-2.558.469c-.79.308-1.42.725-1.888 1.252-.465.527-.697 1.096-.697 1.708 0 .5.159.977.476 1.433.321.45.772.841 1.352 1.172l.583.334-.181.643c-.107.407-.263.79-.469 1.152a6.604 6.604 0 0 0 1.842-1.145l.288-.254.381.04c.309.035.599.053.871.053.91 0 1.761-.154 2.551-.462.795-.312 1.424-.732 1.889-1.259.468-.526.703-1.096.703-1.707 0-.612-.235-1.181-.703-1.708-.465-.527-1.094-.944-1.889-1.252zm2.645.81c.536.656.804 1.373.804 2.15 0 .776-.268 1.495-.804 2.156-.535.656-1.263 1.176-2.183 1.56-.92.38-1.924.57-3.013.57a9.16 9.16 0 0 1-.971-.054 7.32 7.32 0 0 1-3.08 1.62 5.044 5.044 0 0 1-.764.148h-.033a.26.26 0 0 1-.181-.074.324.324 0 0 1-.107-.18v-.007c-.014-.018-.016-.045-.007-.08.014-.037.018-.059.014-.068a.19.19 0 0 1 .033-.067.645.645 0 0 0 .04-.06 1.73 1.73 0 0 0 .047-.054l.054-.06a53.034 53.034 0 0 1 .435-.489c.049-.049.118-.136.207-.26a2.57 2.57 0 0 0 .221-.342c.054-.103.114-.235.181-.395a4.18 4.18 0 0 0 .174-.51c-.7-.397-1.254-.888-1.66-1.473A3.261 3.261 0 0 1 6 11.216c0-.777.268-1.494.804-2.15.535-.66 1.263-1.18 2.183-1.56.92-.384 1.924-.576 3.013-.576 1.09 0 2.094.192 3.013.576.92.38 1.648.9 2.183 1.56z" fill="#FFF" fill-rule="nonzero"/></g></symbol><symbol viewBox="0 0 16 16" id="import" xmlns="http://www.w3.org/2000/svg"><path d="M9 8h1a.5.5 0 0 1 .4.8l-2 2.667a.5.5 0 0 1-.8 0L5.6 8.8A.5.5 0 0 1 6 8h1V1a1 1 0 1 1 2 0v7zM0 8a1 1 0 1 1 2 0 6 6 0 1 0 12 0 1 1 0 0 1 2 0A8 8 0 1 1 0 8z"/></symbol><symbol viewBox="0 0 16 16" id="issue-block" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.803 8a5.97 5.97 0 0 0-.462 1H4.5a.5.5 0 0 1 0-1h1.303zM4.5 5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1zm7.5.083a6.04 6.04 0 0 0-2 0V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h2.083a5.96 5.96 0 0 0 .72 2H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h6a3 3 0 0 1 3 3v2.083zm1.121 3.796zM11 16a5 5 0 1 1 0-10 5 5 0 0 1 0 10zm-1.293-2.292a3 3 0 0 0 4.001-4.001l-4.001 4zm-1.415-1.415l4.001-4a3 3 0 0 0-4.001 4.001z"/></symbol><symbol viewBox="0 0 16 16" id="issue-child" xmlns="http://www.w3.org/2000/svg"><path d="M11 8H5v1h1a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h2V7a.997.997 0 0 1 1-1h3V4H4.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5H9v2h3a.997.997 0 0 1 1 1v2h2a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h1V8zm-9 3v2h3v-2H2zm9 0v2h3v-2h-3z"/></symbol><symbol viewBox="0 0 16 16" id="issue-close" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 0 1 6.12 7.243l1.415 1.414zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="issue-duplicate" xmlns="http://www.w3.org/2000/svg"><path d="M10.874 2H12a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-2c-.918 0-1.74-.413-2.29-1.063a3.987 3.987 0 0 0 1.988-.984A1 1 0 0 0 10 14h2a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-1V3c0-.345-.044-.68-.126-1zM4 0h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4z"/></symbol><symbol viewBox="0 0 16 16" id="issue-new" xmlns="http://www.w3.org/2000/svg"><path d="M10 2V1a1 1 0 0 1 2 0v1h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V4H9a1 1 0 1 1 0-2h1zm0 6a1 1 0 0 1 2 0v5a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h1a1 1 0 1 1 0 2H5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V8z"/></symbol><symbol viewBox="0 0 16 16" id="issue-open" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm0-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="issue-open-m" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="issue-parent" xmlns="http://www.w3.org/2000/svg"><path d="M11 11H5v1h1.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-6a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5H3v-2a.997.997 0 0 1 1-1h3V7H5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H9v2h3a.997.997 0 0 1 1 1v2h2.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-6a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5H11v-1zM6 3v2h4V3H6z"/></symbol><symbol viewBox="0 0 16 16" id="issues" xmlns="http://www.w3.org/2000/svg"><path d="M10.458 15.012l.311.055a3 3 0 0 0 3.476-2.433l1.389-7.879A3 3 0 0 0 13.2 1.28L11.23.933a3.002 3.002 0 0 0-.824-.031c.364.59.58 1.28.593 2.02l1.854.328a1 1 0 0 1 .811 1.158l-1.389 7.879a1 1 0 0 1-1.158.81l-.118-.02a3.98 3.98 0 0 1-.541 1.935zM3 0h4a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="key" xmlns="http://www.w3.org/2000/svg"><path d="M7.575 6.689a4.002 4.002 0 0 1 6.274-4.86 4 4 0 0 1-4.86 6.274l-2.21 2.21.706.708a1 1 0 1 1-1.414 1.414l-.707-.707-.707.707.707.707a1 1 0 1 1-1.414 1.414l-.707-.707a1 1 0 0 1-1.414-1.414l5.746-5.746zm2.032-.618a2 2 0 1 0 2.828-2.828A2 2 0 0 0 9.607 6.07z"/></symbol><symbol viewBox="0 0 16 16" id="key-2" xmlns="http://www.w3.org/2000/svg"><path d="M5.172 14.157l-.344.344-2.485.133a.462.462 0 0 1-.497-.503l.14-2.24a.599.599 0 0 1 .177-.382l5.155-5.155a4 4 0 1 1 2.828 2.828l-1.439 1.44-1.06-.354-.708.707.354 1.06-.707.708-1.06-.354-.708.707.354 1.06zm6.01-8.839a1 1 0 1 0 1.414-1.414 1 1 0 0 0-1.414 1.414z"/></symbol><symbol viewBox="0 0 16 16" id="label" xmlns="http://www.w3.org/2000/svg"><path d="M11.782 14.718a3 3 0 0 1-4.242 0L1.652 8.829a2 2 0 0 1-.565-1.702l.54-3.703a2 2 0 0 1 1.69-1.69l3.703-.54a2 2 0 0 1 1.703.564l5.888 5.888a3 3 0 0 1 0 4.243l-2.829 2.829zm1.415-5.657L7.309 3.173l-3.703.54-.54 3.702 5.888 5.888a1 1 0 0 0 1.414 0l2.829-2.828a1 1 0 0 0 0-1.414zM5.732 5.525A1 1 0 1 1 7.146 6.94a1 1 0 0 1-1.414-1.414z"/></symbol><symbol viewBox="0 0 16 16" id="labels" xmlns="http://www.w3.org/2000/svg"><path d="M9.424 2.254l2.08-.905a1 1 0 0 1 1.206.326l3.013 4.12a1 1 0 0 1 .16.849l-1.947 7.264a3 3 0 0 1-3.675 2.122l-.5-.135a3.999 3.999 0 0 0 1.082-1.782 1 1 0 0 0 1.16-.722l1.823-6.802-2.258-3.087-.687.299a2 2 0 0 0-.628-.88l-.829-.667zM.377 3.7L4.4.498a1 1 0 0 1 1.25.003L9.627 3.7a1 1 0 0 1 .373.78V13a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V4.482A1 1 0 0 1 .377 3.7zM2 13a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V4.958L5.02 2.561 2 4.964V13zm3-6a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="leave" xmlns="http://www.w3.org/2000/svg"><path d="M11 7V5.883a.5.5 0 0 1 .757-.429l3.528 2.117a.5.5 0 0 1 0 .858l-3.528 2.117a.5.5 0 0 1-.757-.43V9H7a1 1 0 1 1 0-2h4zm-2 6.256a1 1 0 0 1 2 0A2.744 2.744 0 0 1 8.256 16H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h5.19A2.81 2.81 0 0 1 11 2.81a1 1 0 0 1-2 0A.81.81 0 0 0 8.19 2H3a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h5.256c.41 0 .744-.333.744-.744z"/></symbol><symbol viewBox="0 0 16 16" id="level-up" xmlns="http://www.w3.org/2000/svg"><path fill="#2E2E2E" fill-rule="evenodd" d="M7 6h3.489a.5.5 0 0 0 .373-.832L6.374.117a.5.5 0 0 0-.748 0l-4.488 5.05A.5.5 0 0 0 1.51 6H5v7a3 3 0 0 0 3 3h6a1 1 0 0 0 0-2H8a1 1 0 0 1-1-1V6z"/></symbol><symbol viewBox="0 0 16 16" id="license" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12.56 8.9l2.66 4.606a.3.3 0 0 1-.243.45l-1.678.094a.1.1 0 0 0-.078.044l-.953 1.432a.3.3 0 0 1-.51-.016L9.097 10.9a5.994 5.994 0 0 0 3.464-2zm-5.23 2.063L4.707 15.51a.3.3 0 0 1-.51.016l-.953-1.432a.1.1 0 0 0-.078-.044l-1.678-.094a.3.3 0 0 1-.243-.45l2.48-4.297a5.983 5.983 0 0 0 3.607 1.754zM8 10A5 5 0 1 1 8 0a5 5 0 0 1 0 10zm0-2a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-1a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="link" xmlns="http://www.w3.org/2000/svg"><path d="M6.986 3.35l2.12-2.122a4 4 0 0 1 5.657 5.657l-2.828 2.829a4 4 0 0 1-5.657 0 1 1 0 0 1 1.414-1.415 2 2 0 0 0 2.829 0l2.828-2.828a2 2 0 1 0-2.828-2.828l-1.001 1a5.018 5.018 0 0 0-2.534-.294zm2.12 9.192l-2.12 2.121a4 4 0 1 1-5.658-5.656l2.829-2.829a4 4 0 0 1 5.657 0 1 1 0 1 1-1.415 1.414 2 2 0 0 0-2.828 0l-2.828 2.829a2 2 0 1 0 2.828 2.828l1.001-1.001a5.018 5.018 0 0 0 2.534.294z"/></symbol><symbol viewBox="0 0 16 16" id="list-bulleted" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4-7h10a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2zm0 5h10a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2zm-4 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4-2h10a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="list-numbered" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6 2h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm0 5h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm0 5h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2zM1.156 5v-.828h.816V2.204h-.72v-.636c.432-.084.708-.192.996-.372h.756v2.976h.684V5H1.156zm-.18 5v-.588c.9-.828 1.596-1.464 1.596-1.98 0-.342-.192-.504-.468-.504-.252 0-.444.18-.624.36l-.552-.552c.396-.42.756-.612 1.32-.612.768 0 1.308.492 1.308 1.248 0 .612-.576 1.284-1.092 1.812.192-.024.468-.048.636-.048h.636V10H.976zm1.26 5.072c-.618 0-1.068-.204-1.356-.54l.468-.648c.234.216.51.36.78.36.336 0 .552-.12.552-.36 0-.288-.15-.456-.948-.456v-.72c.636 0 .828-.168.828-.432 0-.228-.138-.348-.396-.348-.252 0-.432.108-.672.312l-.516-.624c.372-.312.768-.492 1.236-.492.84 0 1.38.384 1.38 1.074 0 .366-.204.642-.612.822v.024c.432.132.732.432.732.912 0 .72-.684 1.116-1.476 1.116z"/></symbol><symbol viewBox="0 0 16 16" id="location" xmlns="http://www.w3.org/2000/svg"><path d="M8.755 15.144a1 1 0 0 1-1.51 0C3.748 11.114 2 8.065 2 6a6 6 0 1 1 12 0c0 2.065-1.748 5.113-5.245 9.144zM12 6a4 4 0 1 0-8 0c0 1.314 1.312 3.71 4 6.944C10.688 9.71 12 7.314 12 6zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="location-dot" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6.314 13.087C4.382 13.295 3 13.85 3 14.5c0 .828 2.239 1.5 5 1.5s5-.672 5-1.5c0-.65-1.382-1.205-3.314-1.413l-.202.225a2 2 0 0 1-2.968 0l-.202-.225zm2.428-.445a1 1 0 0 1-1.484 0C4.419 9.5 3 7.037 3 5.252 3 2.353 5.239 0 8 0s5 2.352 5 5.253c0 1.784-1.42 4.247-4.258 7.389zM11 5.252C11 3.436 9.634 2 8 2S5 3.435 5 5.253c0 1.027.974 2.824 3 5.203 2.026-2.38 3-4.176 3-5.203zM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="lock" xmlns="http://www.w3.org/2000/svg"><path d="M10 5V4h2v1a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3V4h2v1h4zM4 7a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1H4zm0-3a4 4 0 1 1 8 0h-2a2 2 0 1 0-4 0H4z"/></symbol><symbol viewBox="0 0 16 16" id="lock-open" xmlns="http://www.w3.org/2000/svg"><path d="M4.044 4a4 4 0 0 1 6.99-2.658 1 1 0 1 1-1.495 1.33A2 2 0 0 0 6.044 4a.998.998 0 0 1-.07.367v.701H12a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3v-5a3 3 0 0 1 2.974-3V4h.07zM4 7.07a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H4z"/></symbol><symbol viewBox="0 0 16 16" id="log" xmlns="http://www.w3.org/2000/svg"><path d="M4 0h8a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4zm1 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-5h3a1 1 0 0 1 0 2H8a1 1 0 1 1 0-2zm0 3h3a1 1 0 0 1 0 2H8a1 1 0 1 1 0-2zm-3 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-2h3a1 1 0 0 1 0 2H8a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="mail" xmlns="http://www.w3.org/2000/svg"><path d="M14 5.6L9.338 9.796a2 2 0 0 1-2.676 0L2 5.6V11a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5.6zM3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm.212 2L8 8.31 12.788 4H3.212z"/></symbol><symbol viewBox="0 0 16 16" id="menu" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1.143 2h13.714C15.488 2 16 2.448 16 3s-.512 1-1.143 1H1.143C.512 4 0 3.552 0 3s.512-1 1.143-1zm0 5h13.714C15.488 7 16 7.448 16 8s-.512 1-1.143 1H1.143C.512 9 0 8.552 0 8s.512-1 1.143-1zm0 5h13.714c.631 0 1.143.448 1.143 1s-.512 1-1.143 1H1.143C.512 14 0 13.552 0 13s.512-1 1.143-1z"/></symbol><symbol viewBox="0 0 16 16" id="merge-request-close" xmlns="http://www.w3.org/2000/svg"><path d="M9.414 8l1.414 1.414a1 1 0 1 1-1.414 1.414L8 9.414l-1.414 1.414a1 1 0 1 1-1.414-1.414L6.586 8 5.172 6.586a1 1 0 1 1 1.414-1.414L8 6.586l1.414-1.414a1 1 0 1 1 1.414 1.414L9.414 8zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="messages" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.588 8.942l1.173 5.862A1 1 0 0 1 8.78 16H7.22a1 1 0 0 1-.98-1.196l1.172-5.862a3.014 3.014 0 0 0 1.176 0zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4zM4.464 2.464L5.88 3.88a3 3 0 0 0 0 4.242L4.464 9.536a5 5 0 0 1 0-7.072zm7.072 7.072L10.12 8.12a3 3 0 0 0 0-4.242l1.415-1.415a5 5 0 0 1 0 7.072zM2.343.343l1.414 1.414a6 6 0 0 0 0 8.486l-1.414 1.414a8 8 0 0 1 0-11.314zm11.314 11.314l-1.414-1.414a6 6 0 0 0 0-8.486L13.657.343a8 8 0 0 1 0 11.314z"/></symbol><symbol viewBox="0 0 16 16" id="mobile-issue-close" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.657 10.728L2.12 7.192A1 1 0 1 0 .707 8.607l4.243 4.242a.997.997 0 0 0 1.414 0l8.485-8.485a1 1 0 1 0-1.414-1.414l-7.778 7.778z"/></symbol><symbol viewBox="0 0 16 16" id="monitor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 13v1h3a1 1 0 0 1 0 2H3a1 1 0 0 1 0-2h3v-1H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3h-3zM3 2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3zm5.723 6.416l-2.66-1.773-1.71 1.71a.5.5 0 1 1-.707-.707l2-2a.5.5 0 0 1 .631-.062l2.66 1.773 2.71-2.71a.5.5 0 0 1 .707.707l-3 3a.5.5 0 0 1-.631.062z"/></symbol><symbol viewBox="0 0 16 16" id="more" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 4a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="notifications" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6 14H2.435a2 2 0 0 1-1.761-2.947c.962-1.788 1.521-3.065 1.68-3.832.322-1.566.947-5.501 4.65-6.134a1 1 0 1 1 1.994-.024c3.755.528 4.375 4.27 4.761 6.043.188.86.742 2.188 1.661 3.982A2 2 0 0 1 13.64 14H10a2 2 0 1 1-4 0zm5.805-6.468c-.325-1.492-.37-1.674-.61-2.288C10.6 3.716 9.742 3 8.07 3c-1.608 0-2.49.718-3.103 2.197-.28.676-.356.982-.654 2.428-.208 1.012-.827 2.424-1.877 4.375H13.64c-.993-1.937-1.6-3.396-1.835-4.468z"/></symbol><symbol viewBox="0 0 16 16" id="notifications-off" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.26 5.089c.243.757.382 1.478.5 2.017.187.86.74 2.188 1.66 3.982A2 2 0 0 1 13.64 14H10a2 2 0 1 1-4 0H4.35l2-2h7.29c-.993-1.937-1.6-3.396-1.835-4.468-.07-.326-.129-.59-.178-.81l1.634-1.633zM10.943 1.75l-1.48 1.48C9.07 3.076 8.612 3 8.069 3c-1.608 0-2.49.718-3.103 2.197-.28.676-.356.982-.654 2.428-.065.317-.17.673-.317 1.073L.45 12.242a1.99 1.99 0 0 1 .224-1.19c.962-1.787 1.521-3.064 1.68-3.831.322-1.566.947-5.501 4.65-6.134a1 1 0 1 1 1.994-.024 4.867 4.867 0 0 1 1.944.688zm2.932-.105a1 1 0 0 1 0 1.415L2.561 14.374a1 1 0 1 1-1.415-1.414L12.46 1.646a1 1 0 0 1 1.414 0z"/></symbol><symbol viewBox="0 0 16 16" id="overview" xmlns="http://www.w3.org/2000/svg"><path d="M2 0h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2zm0 2v3h3V2H2zm9-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2h-3a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2zm0 2v3h3V2h-3zM2 9h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2zm0 2v3h3v-3H2zm9-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2h-3a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2zm0 2v3h3v-3h-3z"/></symbol><symbol viewBox="0 0 16 16" id="pencil" xmlns="http://www.w3.org/2000/svg"><path d="M13.02 1.293l1.414 1.414a1 1 0 0 1 0 1.414L4.119 14.436a1 1 0 0 1-.704.293l-2.407.008L1 12.316a1 1 0 0 1 .293-.71L11.605 1.292a1 1 0 0 1 1.414 0zm-1.416 1.415l-.707.707L12.31 4.83l.707-.707-1.414-1.415zM3.411 13.73l1.123-1.122H3.12v-1.415L2 12.312l.005 1.422 1.406-.005z"/></symbol><symbol viewBox="0 0 16 16" id="pipeline" xmlns="http://www.w3.org/2000/svg"><path d="M8.969 7.25a2 2 0 1 1-1.938 0A1.002 1.002 0 0 1 7 7V5.083a.2.2 0 0 1 .06-.142l.877-.87a.1.1 0 0 1 .141 0l.864.87A.2.2 0 0 1 9 5.083V7c0 .086-.01.17-.031.25zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm4.5-4a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-2 6a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-5 9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-2 6a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zM8 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="play" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2.765 15.835c-.545.321-1.258.159-1.593-.363A1.075 1.075 0 0 1 1 14.89V1.11C1 .496 1.518 0 2.158 0c.214 0 .424.057.607.165l11.684 6.89c.544.321.714 1.005.38 1.526a1.135 1.135 0 0 1-.38.364l-11.684 6.89z"/></symbol><symbol viewBox="0 0 16 16" id="plus" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7 7V1a1 1 0 1 1 2 0v6h6a1 1 0 0 1 0 2H9v6a1 1 0 0 1-2 0V9H1a1 1 0 1 1 0-2h6z"/></symbol><symbol viewBox="0 0 16 16" id="plus-square" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9 7V4a1 1 0 1 0-2 0v3H4a1 1 0 1 0 0 2h3v3a1 1 0 0 0 2 0V9h3a1 1 0 0 0 0-2H9zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3z"/></symbol><symbol viewBox="0 0 16 16" id="plus-square-o" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7 7V5a1 1 0 1 1 2 0v2h2a1 1 0 0 1 0 2H9v2a1 1 0 0 1-2 0V9H5a1 1 0 1 1 0-2h2zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="preferences" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5 12h10a1 1 0 0 1 0 2H5a1 1 0 0 1-2 0v-2a1 1 0 0 1 2 0zm-3 0H1a1 1 0 0 0 0 2h1v-2zm11-5h2a1 1 0 0 1 0 2h-2a1 1 0 0 1-2 0V7a1 1 0 0 1 2 0zm-3 0H1a1 1 0 1 0 0 2h9V7zM6 2h9a1 1 0 0 1 0 2H6a1 1 0 1 1-2 0V2a1 1 0 1 1 2 0zM3 2H1a1 1 0 1 0 0 2h2V2z"/></symbol><symbol viewBox="0 0 16 16" id="profile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-4.274-3.404C4.412 9.709 5.694 9 8 9c2.313 0 3.595.7 4.28 1.586A4.997 4.997 0 0 1 8 13a4.997 4.997 0 0 1-4.274-2.404zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="project" xmlns="http://www.w3.org/2000/svg"><path d="M8.462 2.177l-.038.044a.505.505 0 0 0 .038-.044zm-.787 0a.5.5 0 0 0 .038.043l-.038-.043zM3.706 7h8.725L8.069 2.585 3.706 7zM7 13.369V12a1 1 0 0 1 2 0v1.369h3V9H4v4.369h3zM14 9v4.836c0 .833-.657 1.533-1.5 1.533h-9c-.843 0-1.5-.7-1.5-1.533V9h-.448a1.1 1.1 0 0 1-.783-1.873L6.934.887a1.5 1.5 0 0 1 2.269 0l6.165 6.24A1.1 1.1 0 0 1 14.585 9H14z"/></symbol><symbol viewBox="0 0 16 16" id="push-rules" xmlns="http://www.w3.org/2000/svg"><path d="M6.268 9a2 2 0 0 1 3.464 0H11a1 1 0 0 1 0 2H9.732a2 2 0 0 1-3.464 0H5a1 1 0 0 1 0-2h1.268zM7 2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1h-1v3.515a.3.3 0 0 1-.434.268l-1.432-.716a.3.3 0 0 0-.268 0l-1.432.716A.3.3 0 0 1 7 5.515V2zM4 0h8a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm4 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="question" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm-1.46-5.602h2.233a3.97 3.97 0 0 1 .051-.558c.029-.17.073-.326.133-.469.06-.143.14-.28.242-.41.102-.13.228-.263.38-.399.26-.24.504-.467.733-.683a5.03 5.03 0 0 0 .598-.668c.17-.23.302-.477.399-.742a2.66 2.66 0 0 0 .144-.907c0-.505-.083-.95-.25-1.335a2.55 2.55 0 0 0-.723-.97 3.2 3.2 0 0 0-1.152-.589 5.441 5.441 0 0 0-1.531-.2c-.516 0-.998.063-1.445.188a3.19 3.19 0 0 0-1.168.59c-.331.268-.594.61-.79 1.027-.195.417-.295.917-.3 1.5h2.64c.006-.224.04-.416.102-.578.062-.161.142-.293.238-.394a.921.921 0 0 1 .332-.227 1.04 1.04 0 0 1 .39-.074c.34 0 .593.095.763.285.169.19.254.488.254.895 0 .328-.106.63-.317.906-.21.276-.499.565-.863.867-.214.182-.39.374-.531.574-.141.2-.253.42-.336.657a3.656 3.656 0 0 0-.176.777 7.89 7.89 0 0 0-.05.937zm-.321 2.375c0 .188.035.362.105.524.07.161.17.3.301.418.13.117.284.21.46.277.178.068.376.102.595.102.218 0 .416-.034.593-.102.178-.068.331-.16.461-.277a1.2 1.2 0 0 0 .301-.418c.07-.162.106-.336.106-.524a1.3 1.3 0 0 0-.106-.523 1.2 1.2 0 0 0-.3-.418 1.461 1.461 0 0 0-.462-.277 1.651 1.651 0 0 0-.593-.102c-.22 0-.417.034-.594.102a1.46 1.46 0 0 0-.461.277 1.2 1.2 0 0 0-.3.418 1.284 1.284 0 0 0-.106.523z"/></symbol><symbol viewBox="0 0 16 16" id="question-o" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-.778-4.151c0-.301.014-.575.044-.82a3.2 3.2 0 0 1 .154-.68c.073-.208.17-.4.294-.575.123-.176.278-.343.465-.503a4.81 4.81 0 0 0 .755-.758c.185-.242.277-.506.277-.793 0-.356-.074-.617-.222-.783-.148-.166-.37-.25-.667-.25a.92.92 0 0 0-.342.065.806.806 0 0 0-.29.199 1.04 1.04 0 0 0-.209.345 1.5 1.5 0 0 0-.088.506H5.082c.005-.51.092-.948.263-1.313.171-.364.401-.664.69-.899.29-.234.63-.406 1.023-.516a4.66 4.66 0 0 1 1.264-.164c.497 0 .944.058 1.34.174.397.117.733.289 1.008.517.276.227.487.51.633.847.146.337.218.727.218 1.17 0 .295-.042.56-.126.792a2.52 2.52 0 0 1-.349.65 4.4 4.4 0 0 1-.523.584c-.2.19-.414.389-.642.598a2.73 2.73 0 0 0-.332.349c-.089.114-.16.233-.212.359a1.868 1.868 0 0 0-.116.41 3.39 3.39 0 0 0-.044.489H7.222zm-.28 2.078c0-.164.03-.317.092-.458a1.05 1.05 0 0 1 .263-.366c.114-.103.248-.183.403-.243a1.45 1.45 0 0 1 .52-.089c.191 0 .364.03.52.09.154.059.289.14.403.242.114.103.201.224.263.366.061.141.092.294.092.458 0 .164-.03.316-.092.458a1.05 1.05 0 0 1-.263.365 1.278 1.278 0 0 1-.404.243 1.43 1.43 0 0 1-.52.089c-.19 0-.364-.03-.519-.089-.155-.06-.29-.14-.403-.243a1.05 1.05 0 0 1-.263-.365 1.135 1.135 0 0 1-.093-.458z"/></symbol><symbol viewBox="0 0 16 16" id="quote" xmlns="http://www.w3.org/2000/svg"><path d="M15 3v8a3 3 0 0 1-3 3 1 1 0 0 1 0-2 1 1 0 0 0 1-1V9h-2a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h3a1 1 0 0 1 1 1zM7 3v8a3 3 0 0 1-3 3 1 1 0 0 1 0-2 1 1 0 0 0 1-1V9H3a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h3a1 1 0 0 1 1 1z"/></symbol><symbol viewBox="0 0 16 16" id="redo" xmlns="http://www.w3.org/2000/svg"><path d="M4.666 4.423a5 5 0 1 1-.203 6.944 1 1 0 1 0-1.478 1.347 7 7 0 1 0 .12-9.556L1.842 2.137a.5.5 0 0 0-.815.385L1 7.26a.5.5 0 0 0 .607.492l4.629-1.013a.5.5 0 0 0 .207-.877L4.666 4.423z"/></symbol><symbol viewBox="0 0 16 16" id="remove" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2 3a1 1 0 1 1 0-2h12a1 1 0 0 1 0 2v10a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V3zm3-2a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1H5zM4 3v10a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V3H4zm2.5 2a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5zm3 0a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5z"/></symbol><symbol viewBox="0 0 16 16" id="repeat" xmlns="http://www.w3.org/2000/svg"><path d="M11.494 4.423a5 5 0 1 0 .203 6.944 1 1 0 1 1 1.478 1.347 7 7 0 1 1-.12-9.556l1.262-1.021a.5.5 0 0 1 .815.385l.028 4.738a.5.5 0 0 1-.607.492L9.924 6.739a.5.5 0 0 1-.207-.877l1.777-1.439z"/></symbol><symbol viewBox="0 0 16 16" id="retry" xmlns="http://www.w3.org/2000/svg"><path d="M4.009 6.958a4 4 0 0 0 5.283 4.775 1 1 0 0 1 .712 1.87A6 6 0 0 1 2.077 6.44l-.741-.2a.5.5 0 0 1-.12-.915L3.41 4.058a.5.5 0 0 1 .683.183l1.268 2.196a.5.5 0 0 1-.563.733l-.79-.212zm7.777 2.084a4 4 0 0 0-5.284-4.775 1 1 0 0 1-.711-1.87 6 6 0 0 1 7.927 7.162l.74.2a.5.5 0 0 1 .121.915l-2.196 1.268a.5.5 0 0 1-.683-.183l-1.267-2.196a.5.5 0 0 1 .562-.733l.79.212z"/></symbol><symbol viewBox="0 0 16 16" id="scale" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.99 9a.792.792 0 0 0-.078-.231L13 7l-.912 1.769a.791.791 0 0 0-.077.231h1.978zm-10 0a.792.792 0 0 0-.078-.231L3 7l-.912 1.769A.791.791 0 0 0 2.011 9h1.978zM2 0h12a1 1 0 0 1 0 2H2a1 1 0 1 1 0-2zm3 14h6a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2zM8 4a1 1 0 0 1 1 1v9H7V5a1 1 0 0 1 1-1zm-4.53-.714l2.265 4.735c.68 1.42.006 3.091-1.504 3.73A3.161 3.161 0 0 1 3 12c-1.657 0-3-1.263-3-2.821 0-.4.09-.794.264-1.158L2.53 3.286a.53.53 0 0 1 .94 0zm10 0l2.265 4.735c.68 1.42.006 3.091-1.504 3.73A3.161 3.161 0 0 1 13 12c-1.657 0-3-1.263-3-2.821 0-.4.09-.794.264-1.158l2.266-4.735a.53.53 0 0 1 .94 0z"/></symbol><symbol viewBox="0 0 16 16" id="screen-full" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M14 14v-2a1 1 0 0 1 2 0v3a.997.997 0 0 1-1 1h-3a1 1 0 0 1 0-2h2zM2 14v-2a1 1 0 0 0-2 0v3a1 1 0 0 0 1 1h3a1 1 0 0 0 0-2H2zM15.707.293A.997.997 0 0 1 16 1v3a1 1 0 0 1-2 0V2h-2a1 1 0 0 1 0-2h3c.276 0 .526.112.707.293zM2 2v2a1 1 0 1 1-2 0V1a.997.997 0 0 1 1-1h3a1 1 0 1 1 0 2H2zm4 4h4a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="screen-normal" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3 3V1a1 1 0 1 1 2 0v3a.997.997 0 0 1-1 1H1a1 1 0 1 1 0-2h2zm10 0h2a1 1 0 0 1 0 2h-3a.997.997 0 0 1-1-1V1a1 1 0 0 1 2 0v2zM3 13H1a1 1 0 0 1 0-2h3a.997.997 0 0 1 1 1v3a1 1 0 0 1-2 0v-2zm10 0v2a1 1 0 0 1-2 0v-3a.997.997 0 0 1 1-1h3a1 1 0 0 1 0 2h-2zM6.5 7h3a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5z"/></symbol><symbol viewBox="0 0 12 16" id="scroll_down" xmlns="http://www.w3.org/2000/svg"><path class="ehfirst-triangle" d="M1.048 14.155a.508.508 0 0 0-.32.105c-.091.07-.136.154-.136.25v.71c0 .095.045.178.135.249.09.07.197.105.321.105h10.043a.51.51 0 0 0 .321-.105c.09-.07.136-.154.136-.25v-.71c0-.095-.045-.178-.136-.249a.508.508 0 0 0-.32-.105"/><path class="ehsecond-triangle" d="M.687 8.027c-.09-.087-.122-.16-.093-.22.028-.06.104-.09.228-.09h10.5c.123 0 .2.03.228.09.029.06-.002.133-.093.22L6.393 12.91a.458.458 0 0 1-.136.089h-.37a.626.626 0 0 1-.136-.09"/><path class="ehthird-triangle" d="M.687 1.027C.597.94.565.867.594.807c.028-.06.104-.09.228-.09h10.5c.123 0 .2.03.228.09.029.06-.002.133-.093.22L6.393 5.91a.458.458 0 0 1-.136.09h-.37a.626.626 0 0 1-.136-.09"/></symbol><symbol viewBox="0 0 12 16" id="scroll_up" xmlns="http://www.w3.org/2000/svg"><path d="M1.048 1.845a.508.508 0 0 1-.32-.105c-.091-.07-.136-.154-.136-.25V.78c0-.095.045-.178.135-.249a.508.508 0 0 1 .321-.105h10.043a.51.51 0 0 1 .321.105c.09.07.136.154.136.25v.71c0 .095-.045.178-.136.249a.508.508 0 0 1-.32.105M.687 7.973c-.09.087-.122.16-.093.22.028.06.104.09.228.09h10.5c.123 0 .2-.03.228-.09.029-.06-.002-.133-.093-.22L6.393 3.09A.458.458 0 0 0 6.257 3h-.37a.626.626 0 0 0-.136.09M.687 14.973c-.09.087-.122.16-.093.22.028.06.104.09.228.09h10.5c.123 0 .2-.03.228-.09.029-.06-.002-.133-.093-.22L6.393 10.09a.458.458 0 0 0-.136-.09h-.37a.626.626 0 0 0-.136.09"/></symbol><symbol viewBox="0 0 16 16" id="search" xmlns="http://www.w3.org/2000/svg"><path d="M8.853 8.854a3.5 3.5 0 1 0-4.95-4.95 3.5 3.5 0 0 0 4.95 4.95zm.207 2.328a5.5 5.5 0 1 1 2.121-2.121l3.329 3.328a1.5 1.5 0 0 1-2.121 2.121L9.06 11.182z"/></symbol><symbol viewBox="0 0 16 16" id="settings" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2.415 5.803L1.317 4.084A.5.5 0 0 1 1.35 3.5l.805-.994a.5.5 0 0 1 .564-.153l1.878.704a5.975 5.975 0 0 1 1.65-.797L6.885.342A.5.5 0 0 1 7.36 0h1.28a.5.5 0 0 1 .474.342l.639 1.918a5.97 5.97 0 0 1 1.65.797l1.877-.704a.5.5 0 0 1 .565.153l.805.994a.5.5 0 0 1 .032.584l-1.097 1.719c.217.551.354 1.143.399 1.76l1.731 1.058a.5.5 0 0 1 .227.54l-.288 1.246a.5.5 0 0 1-.44.385l-2.008.19a6.026 6.026 0 0 1-1.142 1.431l.265 1.995a.5.5 0 0 1-.277.516l-1.15.56a.5.5 0 0 1-.576-.1l-1.424-1.452a6.047 6.047 0 0 1-1.804 0l-1.425 1.453a.5.5 0 0 1-.576.1l-1.15-.561a.5.5 0 0 1-.276-.516l.265-1.995a6.026 6.026 0 0 1-1.143-1.43l-2.008-.191a.5.5 0 0 1-.44-.385L.058 9.16a.5.5 0 0 1 .226-.539l1.732-1.058a5.968 5.968 0 0 1 .399-1.76zM8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="shield" xmlns="http://www.w3.org/2000/svg"><path d="M4 0h8a3 3 0 0 1 3 3v7.186a3 3 0 0 1-1.426 2.554l-4 2.465a3 3 0 0 1-3.148 0l-4-2.465A3 3 0 0 1 1 10.186V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v7.186a1 1 0 0 0 .475.852l4 2.464a1 1 0 0 0 1.05 0l4-2.464a1 1 0 0 0 .475-.852V3a1 1 0 0 0-1-1H4zm0 1.5a.5.5 0 0 1 .5-.5h4v8.837a.5.5 0 0 1-.753.431l-3.5-2.052A.5.5 0 0 1 4 9.785V3.5z"/></symbol><symbol viewBox="0 0 16 16" id="slight-frown" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-2.163-3.275a2.499 2.499 0 0 1 4.343.03.5.5 0 0 1-.871.49 1.5 1.5 0 0 0-2.607-.018.5.5 0 1 1-.865-.502zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="slight-smile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-5.163 2.254a.5.5 0 1 1 .865-.502 1.499 1.499 0 0 0 2.607-.018.5.5 0 1 1 .871.49 2.499 2.499 0 0 1-4.343.03z"/></symbol><symbol viewBox="0 0 16 16" id="smile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM6.18 6.27a.5.5 0 0 1-.873.487.5.5 0 0 0-.872-.003.5.5 0 1 1-.87-.495 1.5 1.5 0 0 1 2.616.012zm6 0a.5.5 0 1 1-.873.487.5.5 0 0 0-.872-.003.5.5 0 1 1-.87-.495 1.5 1.5 0 0 1 2.616.012zM5 9a3 3 0 0 0 6 0H5z"/></symbol><symbol viewBox="0 0 16 16" id="smiley" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zM5 9h6a3 3 0 0 1-6 0z"/></symbol><symbol viewBox="0 0 16 16" id="snippet" xmlns="http://www.w3.org/2000/svg"><path d="M10.67 9.31a3.001 3.001 0 0 1 2.062 5.546 3 3 0 0 1-3.771-4.559 1.007 1.007 0 0 1-.095-.137l-4.5-7.794a1 1 0 0 1 1.732-1l4.5 7.794c.028.05.052.1.071.15zm-3.283.35l-.289.5c-.028.05-.06.095-.095.137a3.001 3.001 0 0 1-3.77 4.56A3 3 0 0 1 5.294 9.31c.02-.051.043-.102.071-.15l.866-1.5 1.155 2zm2.31-4l-1.156-2 1.325-2.294a1 1 0 0 1 1.732 1L9.696 5.66zm-5.465 7.464a1 1 0 1 0 1-1.732 1 1 0 0 0-1 1.732zm7.5 0a1 1 0 1 0-1-1.732 1 1 0 0 0 1 1.732z"/></symbol><symbol viewBox="0 0 16 16" id="spam" xmlns="http://www.w3.org/2000/svg"><path d="M8.75.433l5.428 3.134a1.5 1.5 0 0 1 .75 1.299v6.268a1.5 1.5 0 0 1-.75 1.299L8.75 15.567a1.5 1.5 0 0 1-1.5 0l-5.428-3.134a1.5 1.5 0 0 1-.75-1.299V4.866a1.5 1.5 0 0 1 .75-1.299L7.25.433a1.5 1.5 0 0 1 1.5 0zM3.072 5.155v5.69L8 13.691l4.928-2.846v-5.69L8 2.309 3.072 5.155zM8 4a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0V5a1 1 0 0 1 1-1zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="star" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.609 14.394l-3.465 1.473a1 1 0 0 1-1.39-.989l.276-4.024a1 1 0 0 0-.219-.694L.303 7.037A1 1 0 0 1 .83 5.443l3.715-.964a1 1 0 0 0 .609-.457L7.14.682a1 1 0 0 1 1.72 0l1.985 3.34a1 1 0 0 0 .609.457l3.715.964a1 1 0 0 1 .528 1.594L13.19 10.16a1 1 0 0 0-.219.694l.275 4.024a1 1 0 0 1-1.389.989l-3.465-1.473a1 1 0 0 0-.782 0z"/></symbol><symbol viewBox="0 0 16 16" id="star-o" xmlns="http://www.w3.org/2000/svg"><path d="M10.975 10.99a3 3 0 0 1 .655-2.083l1.54-1.916-2.219-.576a3 3 0 0 1-1.825-1.37L8 3.15 6.874 5.044a3 3 0 0 1-1.825 1.371l-2.218.576 1.54 1.916a3 3 0 0 1 .654 2.083l-.165 2.4 1.965-.836a3 3 0 0 1 2.348 0l1.965.836-.164-2.399zM7.61 14.394l-3.465 1.473a1 1 0 0 1-1.39-.989l.276-4.024a1 1 0 0 0-.219-.694L.303 7.037A1 1 0 0 1 .83 5.443l3.715-.964a1 1 0 0 0 .609-.457L7.14.682a1 1 0 0 1 1.72 0l1.985 3.34a1 1 0 0 0 .609.457l3.715.964a1 1 0 0 1 .528 1.594L13.19 10.16a1 1 0 0 0-.219.694l.275 4.024a1 1 0 0 1-1.389.989l-3.465-1.473a1 1 0 0 0-.782 0z"/></symbol><symbol viewBox="0 0 14 14" id="status_canceled" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M5.2 3.8l4.9 4.9c.2.2.2.5 0 .7l-.7.7c-.2.2-.5.2-.7 0L3.8 5.2c-.2-.2-.2-.5 0-.7l.7-.7c.2-.2.5-.2.7 0"/></g></symbol><symbol viewBox="0 0 22 22" id="status_canceled_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M8.171 5.971l7.7 7.7a.76.76 0 0 1 0 1.1l-1.1 1.1a.76.76 0 0 1-1.1 0l-7.7-7.7a.76.76 0 0 1 0-1.1l1.1-1.1a.76.76 0 0 1 1.1 0"/></symbol><symbol viewBox="0 0 16 16" id="status_closed" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.83a1 1 0 0 1 1.414 1.416l-3.535 3.535a1 1 0 0 1-1.415.001l-2.12-2.12a1 1 0 1 1 1.413-1.415zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 14 14" id="status_created" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><circle cx="7" cy="7" r="3.25"/></g></symbol><symbol viewBox="0 0 22 22" id="status_created_borderless" xmlns="http://www.w3.org/2000/svg"><circle cx="11" cy="11" r="5.107"/></symbol><symbol viewBox="0 0 14 14" id="status_failed" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M7 5.969L5.599 4.568a.29.29 0 0 0-.413.004l-.614.614a.294.294 0 0 0-.004.413L5.968 7l-1.4 1.401a.29.29 0 0 0 .004.413l.614.614c.113.114.3.117.413.004L7 8.032l1.401 1.4a.29.29 0 0 0 .413-.004l.614-.614a.294.294 0 0 0 .004-.413L8.032 7l1.4-1.401a.29.29 0 0 0-.004-.413l-.614-.614a.294.294 0 0 0-.413-.004L7 5.968z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_failed_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M11 9.38L8.798 7.178a.455.455 0 0 0-.65.006l-.964.965a.462.462 0 0 0-.006.65L9.38 11l-2.202 2.202a.455.455 0 0 0 .006.65l.965.964a.462.462 0 0 0 .65.006L11 12.62l2.202 2.202a.455.455 0 0 0 .65-.006l.964-.965a.462.462 0 0 0 .006-.65L12.62 11l2.202-2.202a.455.455 0 0 0-.006-.65l-.965-.964a.462.462 0 0 0-.65-.006L11 9.38z"/></symbol><symbol viewBox="0 0 14 14" id="status_manual" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M10.5 7.63V6.37l-.787-.13c-.044-.175-.132-.349-.263-.61l.481-.652-.918-.913-.657.478a2.346 2.346 0 0 0-.612-.26L7.656 3.5H6.388l-.132.783c-.219.043-.394.13-.612.26l-.657-.478-.918.913.437.652c-.131.218-.175.392-.262.61l-.744.086v1.261l.787.13c.044.218.132.392.263.61l-.438.651.92.913.655-.434c.175.086.394.173.613.26l.131.783h1.313l.131-.783c.219-.043.394-.13.613-.26l.656.478.918-.913-.48-.652c.13-.218.218-.435.262-.61l.656-.13zM7 8.283a1.285 1.285 0 0 1-1.313-1.305c0-.739.57-1.304 1.313-1.304.744 0 1.313.565 1.313 1.304 0 .74-.57 1.305-1.313 1.305z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_manual_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M16.5 11.99v-1.98l-1.238-.206c-.068-.273-.206-.546-.412-.956l.756-1.025-1.444-1.435-1.03.752a3.686 3.686 0 0 0-.963-.41L12.03 5.5h-1.994l-.206 1.23c-.343.068-.618.205-.962.41l-1.031-.752-1.444 1.435.687 1.025c-.206.341-.275.615-.412.956L5.5 9.941v1.981l1.237.205c.07.342.207.615.413.957l-.688 1.025 1.444 1.434 1.032-.683c.274.137.618.274.962.41l.206 1.23h2.063l.206-1.23c.344-.068.619-.205.963-.41l1.03.752 1.444-1.435-.756-1.025c.207-.341.344-.683.413-.956l1.031-.205zM11 13.017c-1.169 0-2.063-.889-2.063-2.05 0-1.162.894-2.05 2.063-2.05s2.063.888 2.063 2.05c0 1.161-.894 2.05-2.063 2.05z"/></symbol><symbol viewBox="0 0 22 22" id="status_notfound_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M12.822 11.29c.816-.581 1.421-1.348 1.683-2.322.603-2.243-.973-4.553-3.53-4.553-1.15 0-2.085.41-2.775 1.089-.42.413-.672.835-.8 1.167a1.179 1.179 0 0 0 2.2.847c.016-.043.1-.184.252-.334.264-.259.613-.412 1.123-.412.938 0 1.47.78 1.254 1.584-.105.39-.37.726-.773 1.012a3.25 3.25 0 0 1-.945.47 1.179 1.179 0 0 0-.874 1.138v2.234a1.179 1.179 0 1 0 2.358 0v-1.43a5.9 5.9 0 0 0 .827-.492z"/><ellipse cx="10.825" cy="16.711" rx="1.275" ry="1.322"/></symbol><symbol viewBox="0 0 14 14" id="status_open" xmlns="http://www.w3.org/2000/svg"><path d="M0 7c0-3.866 3.142-7 7-7 3.866 0 7 3.142 7 7 0 3.866-3.142 7-7 7-3.866 0-7-3.142-7-7z"/><path d="M1 7c0 3.309 2.69 6 6 6 3.309 0 6-2.69 6-6 0-3.309-2.69-6-6-6-3.309 0-6 2.69-6 6z" fill="#FFF"/><path d="M7 9.219a2.218 2.218 0 1 0 0-4.436A2.218 2.218 0 0 0 7 9.22zm0 1.12a3.338 3.338 0 1 1 0-6.676 3.338 3.338 0 0 1 0 6.676z"/></symbol><symbol viewBox="0 0 14 14" id="status_pending" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M4.7 5.3c0-.2.1-.3.3-.3h.9c.2 0 .3.1.3.3v3.4c0 .2-.1.3-.3.3H5c-.2 0-.3-.1-.3-.3V5.3m3 0c0-.2.1-.3.3-.3h.9c.2 0 .3.1.3.3v3.4c0 .2-.1.3-.3.3H8c-.2 0-.3-.1-.3-.3V5.3"/></g></symbol><symbol viewBox="0 0 22 22" id="status_pending_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M7.386 8.329c0-.315.157-.472.471-.472h1.414c.315 0 .472.157.472.472v5.342c0 .315-.157.472-.472.472H7.857c-.314 0-.471-.157-.471-.472V8.33m4.714 0c0-.315.157-.472.471-.472h1.415c.314 0 .471.157.471.472v5.342c0 .315-.157.472-.471.472H12.57c-.314 0-.471-.157-.471-.472V8.33"/></symbol><symbol viewBox="0 0 14 14" id="status_running" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M7 3c2.2 0 4 1.8 4 4s-1.8 4-4 4c-1.3 0-2.5-.7-3.3-1.7L7 7V3"/></g></symbol><symbol viewBox="0 0 22 22" id="status_running_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M11 4.714c3.457 0 6.286 2.829 6.286 6.286 0 3.457-2.829 6.286-6.286 6.286-2.043 0-3.929-1.1-5.186-2.672L11 11V4.714"/></symbol><symbol viewBox="0 0 14 14" id="status_skipped" xmlns="http://www.w3.org/2000/svg"><path d="M7 14A7 7 0 1 1 7 0a7 7 0 0 1 0 14z"/><path d="M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12z" fill="#FFF"/><path d="M6.415 7.04L4.579 5.203a.295.295 0 0 1 .004-.416l.349-.349a.29.29 0 0 1 .416-.004l2.214 2.214a.289.289 0 0 1 .019.021l.132.133c.11.11.108.291 0 .398L5.341 9.573a.282.282 0 0 1-.398 0l-.331-.331a.285.285 0 0 1 0-.399L6.415 7.04zm2.54 0L7.119 5.203a.295.295 0 0 1 .004-.416l.349-.349a.29.29 0 0 1 .416-.004l2.214 2.214a.289.289 0 0 1 .019.021l.132.133c.11.11.108.291 0 .398L7.881 9.573a.282.282 0 0 1-.398 0l-.331-.331a.285.285 0 0 1 0-.399L8.955 7.04z"/></symbol><symbol viewBox="0 0 22 22" id="status_skipped_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M14.072 11.063l-2.82 2.82a.46.46 0 0 0-.001.652l.495.495a.457.457 0 0 0 .653-.001l3.7-3.7a.46.46 0 0 0 .001-.653l-.196-.196a.453.453 0 0 0-.03-.033l-3.479-3.479a.464.464 0 0 0-.654.007l-.548.548a.463.463 0 0 0-.007.654l2.886 2.886z"/><path d="M10.08 11.063l-2.819 2.82a.46.46 0 0 0-.002.652l.496.495a.457.457 0 0 0 .652-.001l3.7-3.7a.46.46 0 0 0 .002-.653l-.196-.196a.453.453 0 0 0-.03-.033l-3.48-3.479a.464.464 0 0 0-.653.007l-.548.548a.463.463 0 0 0-.007.654l2.886 2.886z"/></symbol><symbol viewBox="0 0 14 14" id="status_success" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M6.278 7.697L5.045 6.464a.296.296 0 0 0-.42-.002l-.613.614a.298.298 0 0 0 .002.42l1.91 1.909a.5.5 0 0 0 .703.005l.265-.265L9.997 6.04a.291.291 0 0 0-.009-.408l-.614-.614a.29.29 0 0 0-.408-.009L6.278 7.697z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_success_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M9.866 12.095l-1.95-1.95a.462.462 0 0 0-.647.01l-.964.964a.46.46 0 0 0-.01.646l3.013 3.014a.787.787 0 0 0 1.106.008l.425-.425 4.854-4.853a.462.462 0 0 0 .002-.659l-.964-.964a.468.468 0 0 0-.658.002l-4.207 4.207z"/></symbol><symbol viewBox="0 0 14 14" id="status_success_solid" xmlns="http://www.w3.org/2000/svg"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7zm6.278.697L5.045 6.464a.296.296 0 0 0-.42-.002l-.613.614a.298.298 0 0 0 .002.42l1.91 1.909a.5.5 0 0 0 .703.005l.265-.265L9.997 6.04a.291.291 0 0 0-.009-.408l-.614-.614a.29.29 0 0 0-.408-.009L6.278 7.697z" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 14 14" id="status_warning" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M6 3.5c0-.3.2-.5.5-.5h1c.3 0 .5.2.5.5v4c0 .3-.2.5-.5.5h-1c-.3 0-.5-.2-.5-.5v-4m0 6c0-.3.2-.5.5-.5h1c.3 0 .5.2.5.5v1c0 .3-.2.5-.5.5h-1c-.3 0-.5-.2-.5-.5v-1"/></g></symbol><symbol viewBox="0 0 22 22" id="status_warning_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M9.429 5.5c0-.471.314-.786.785-.786h1.572c.471 0 .785.315.785.786v6.286c0 .471-.314.785-.785.785h-1.572c-.471 0-.785-.314-.785-.785V5.5m0 9.429c0-.472.314-.786.785-.786h1.572c.471 0 .785.314.785.786V16.5c0 .471-.314.786-.785.786h-1.572c-.471 0-.785-.315-.785-.786v-1.571"/></symbol><symbol viewBox="0 0 16 16" id="stop" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2 0h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2z"/></symbol><symbol viewBox="0 0 16 16" id="talic" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6 0h7a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm2 2h3L8 14H5L8 2zM3 14h7a1 1 0 0 1 0 2H3a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="task-done" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 0 1 6.12 7.243l1.415 1.414zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="template" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3zm.8 2h2.4a.8.8 0 0 1 .8.8v1.4a.8.8 0 0 1-.8.8H3.8a.8.8 0 0 1-.8-.8V4.8a.8.8 0 0 1 .8-.8zm4.7 0h4a.5.5 0 1 1 0 1h-4a.5.5 0 0 1 0-1zm0 2h4a.5.5 0 1 1 0 1h-4a.5.5 0 0 1 0-1zm-5 3h9a.5.5 0 1 1 0 1h-9a.5.5 0 0 1 0-1zm0 2h9a.5.5 0 1 1 0 1h-9a.5.5 0 1 1 0-1z"/></symbol><symbol viewBox="0 0 16 16" id="thump-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.33 11h5.282a2 2 0 0 0 1.963-2.38l-.563-2.905a3 3 0 0 0-.243-.732l-1.103-2.286A3 3 0 0 0 10.964 1H7a3 3 0 0 0-3 3v6.3a2 2 0 0 0 .436 1.247l3.11 3.9a.632.632 0 0 0 .941.053l.137-.137a1 1 0 0 0 .28-.87L8.329 11zM1 10h2V3H1a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1z"/></symbol><symbol viewBox="0 0 16 16" id="thump-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.33 5h5.282a2 2 0 0 1 1.963 2.38l-.563 2.905a3 3 0 0 1-.243.732l-1.103 2.286A3 3 0 0 1 10.964 15H7a3 3 0 0 1-3-3V5.7a2 2 0 0 1 .436-1.247l3.11-3.9A.632.632 0 0 1 8.487.5l.137.137a1 1 0 0 1 .28.87L8.329 5zM1 6h2v7H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="timer" xmlns="http://www.w3.org/2000/svg"><path d="M12.022 3.27l.77-.77a1 1 0 0 1 1.415 1.414l-.728.729a7 7 0 1 1-1.456-1.372zM8 14A5 5 0 1 0 8 4a5 5 0 0 0 0 10zm0-9a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V6a1 1 0 0 1 1-1zM6 0h4a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="todo-add" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 4V2a1 1 0 0 1 2 0v2h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 0V6H8a1 1 0 1 1 0-2h2zm2 7a1 1 0 0 1 2 0v2a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h2a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2z"/></symbol><symbol viewBox="0 0 16 16" id="todo-done" xmlns="http://www.w3.org/2000/svg"><path d="M8.243 7.485l4.95-4.95a1 1 0 1 1 1.414 1.415L8.95 9.607a.997.997 0 0 1-1.414 0L4.707 6.778a1 1 0 0 1 1.414-1.414l2.122 2.121zM12 11a1 1 0 0 1 2 0v2a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h2a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2z"/></symbol><symbol viewBox="0 0 16 16" id="token" xmlns="http://www.w3.org/2000/svg"><path d="M3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H3zm1 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="unapproval" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11.95 8.536l1.06-1.061a1 1 0 0 1 1.415 1.414l-1.061 1.06 1.06 1.061a1 1 0 0 1-1.414 1.415l-1.06-1.061-1.06 1.06a1 1 0 1 1-1.415-1.414l1.06-1.06-1.06-1.06a1 1 0 0 1 1.414-1.415l1.06 1.06zm-3.768-.33c.006.503.201 1.006.586 1.39l.353.354-.353.353a2 2 0 1 0 2.828 2.829l.354-.354.047.048C11.964 14.363 11.527 15 6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8c.834 0 1.557.074 2.182.205zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="unassignee" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11 5h4a1 1 0 0 1 0 2h-4a1 1 0 0 1 0-2zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="unlink" xmlns="http://www.w3.org/2000/svg"><path d="M11.295 8.845l-.659-1.664a1.78 1.78 0 0 0 .04-.04l1.415-1.414c.586-.586.654-1.468.152-1.97s-1.384-.434-1.97.152L8.859 5.323a1.781 1.781 0 0 0-.04.04l-1.664-.658c.141-.208.305-.408.491-.594l1.415-1.414c1.366-1.367 3.424-1.525 4.596-.354 1.171 1.172 1.013 3.23-.354 4.596L11.89 8.354c-.186.186-.386.35-.594.491zm-2.45 2.45a4.075 4.075 0 0 1-.491.594l-1.415 1.414c-1.366 1.367-3.424 1.525-4.596.354-1.171-1.172-1.013-3.23.354-4.596L4.11 7.646c.186-.186.386-.35.594-.491l.659 1.664a1.781 1.781 0 0 0-.04.04l-1.415 1.414c-.586.586-.654 1.468-.152 1.97s1.384.434 1.97-.152l1.414-1.414a1.78 1.78 0 0 0 .04-.04l1.664.658zm3.812-2.088h2a.5.5 0 0 1 .5.5v.05a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5v-.05a.5.5 0 0 1 .5-.5zm-.384 2.116l1.415 1.414a.5.5 0 0 1 0 .708l-.037.036a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 0-.707l.036-.037a.5.5 0 0 1 .707 0zm-2.823 1.09a.5.5 0 0 1 .5-.5h.052a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5H9.95a.5.5 0 0 1-.5-.5v-2zm-2.748-9.16a.5.5 0 0 1-.5.5h-.05a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h.05a.5.5 0 0 1 .5.5v2zm-2.116.383a.5.5 0 0 1 0 .707l-.036.036a.5.5 0 0 1-.707 0L2.428 2.965a.5.5 0 0 1 0-.707l.037-.036a.5.5 0 0 1 .707 0l1.414 1.414zm-1.09 2.823h-2a.5.5 0 0 1-.5-.5v-.051a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5v.05a.5.5 0 0 1-.5.5z"/></symbol><symbol viewBox="0 0 16 16" id="user" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 8c-6.888 0-6.976-.78-6.976-2.52S2.144 8 8 8s6.976 2.692 6.976 4.48c0 1.788-.088 2.52-6.976 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="users" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.521 8.01C15.103 8.19 16 10.755 16 12.48c0 1.533-.056 2.29-3.808 2.475.609-.54.808-1.331.808-2.475 0-1.911-.804-3.503-2.479-4.47zm-1.67-1.228A3.987 3.987 0 0 0 9.976 4a3.987 3.987 0 0 0-1.125-2.782 3 3 0 1 1 0 5.563zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="volume-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 5h1v6H1a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zm2 0l4.445-2.964A1 1 0 0 1 9 2.87v10.26a1 1 0 0 1-1.555.833L3 11V5zm10.283 7.89a.5.5 0 0 1-.66-.752A5.485 5.485 0 0 0 14.5 8c0-1.601-.687-3.09-1.865-4.128a.5.5 0 0 1 .661-.75A6.484 6.484 0 0 1 15.5 8a6.485 6.485 0 0 1-2.217 4.89zm-2.002-2.236a.5.5 0 1 1-.652-.758c.55-.472.871-1.157.871-1.896 0-.732-.315-1.411-.856-1.883a.5.5 0 0 1 .658-.753A3.492 3.492 0 0 1 12.5 8c0 1.033-.45 1.994-1.219 2.654z"/></symbol><symbol viewBox="0 0 16 16" id="warning" xmlns="http://www.w3.org/2000/svg"><path d="M15.34 10.479A3 3 0 0 1 12.756 15h-9.51A3 3 0 0 1 .66 10.479l4.755-8.083a3 3 0 0 1 5.172 0l4.755 8.083zm-6.478-7.07a1 1 0 0 0-1.724 0l-4.755 8.084A1 1 0 0 0 3.245 13h9.51a1 1 0 0 0 .862-1.507L8.862 3.41zM8 5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V6a1 1 0 0 1 1-1zm0 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="work" xmlns="http://www.w3.org/2000/svg"><path d="M12 3h1a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h1V2a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1zM6 2v1h4V2H6zM3 5a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H3zm1.5 1a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5zm7 0a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5z"/></symbol></svg>
\ No newline at end of file +<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol viewBox="0 0 16 16" id="abuse" xmlns="http://www.w3.org/2000/svg"><path d="M11.408.328l4.029 3.222A1.5 1.5 0 0 1 16 4.72v6.555a1.5 1.5 0 0 1-.563 1.171l-4.026 3.224a1.5 1.5 0 0 1-.937.329H5.529a1.5 1.5 0 0 1-.937-.328L.563 12.45A1.5 1.5 0 0 1 0 11.28V4.724a1.5 1.5 0 0 1 .563-1.171L4.589.329A1.5 1.5 0 0 1 5.526 0h4.945c.34 0 .67.116.937.328zM10.296 2H5.702L2 4.964v6.074L5.704 14h4.594L14 11.036V4.962L10.296 2zM8 4a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0V5a1 1 0 0 1 1-1zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="account" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9.195 9.965l-.568-.875a.25.25 0 0 1 .015-.294l.405-.5a.25.25 0 0 1 .283-.075l.938.36c.257-.183.543-.325.851-.42l.322-.988A.25.25 0 0 1 11.679 7h.642a.25.25 0 0 1 .238.173l.322.988c.308.095.594.237.851.42l.938-.36a.25.25 0 0 1 .283.076l.405.5a.25.25 0 0 1 .015.293l-.568.875c.113.297.18.616.193.95l.898.54a.25.25 0 0 1 .115.27l-.144.626a.25.25 0 0 1-.222.193l-1.115.098a3.015 3.015 0 0 1-.512.608l.165 1.18a.25.25 0 0 1-.138.259l-.577.281a.25.25 0 0 1-.29-.05l-.874-.905a3.035 3.035 0 0 1-.608 0l-.875.904a.25.25 0 0 1-.289.051l-.577-.281a.25.25 0 0 1-.138-.26l.165-1.18a3.015 3.015 0 0 1-.512-.607l-1.115-.098a.25.25 0 0 1-.222-.193l-.144-.626a.25.25 0 0 1 .115-.27l.898-.54c.013-.334.08-.653.193-.95zM6.789 8.023A12.845 12.845 0 0 0 6 8c-5.036 0-6 2.74-6 4.48C0 14.22.076 15 6 15c.553 0 1.055-.006 1.51-.02A5.977 5.977 0 0 1 6 11c0-1.083.287-2.1.79-2.977zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM12 12a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="admin" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.162 2.5a3.5 3.5 0 0 1-3.163 5.479L6.08 14.766a1.5 1.5 0 0 1-2.598-1.5L7.4 6.479A3.5 3.5 0 0 1 10.564 1L8.9 3.88l2.599 1.5 1.663-2.88zm-8.63 11.949a.5.5 0 1 0 .5-.866.5.5 0 0 0-.5.866z"/></symbol><symbol viewBox="0 0 16 16" id="angle-double-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.414 7.95l4.243-4.243a1 1 0 0 0-1.414-1.414l-4.95 4.95a.997.997 0 0 0 0 1.414l4.95 4.95a1 1 0 1 0 1.414-1.415L10.414 7.95zm-7 0l4.243-4.243a1 1 0 0 0-1.414-1.414l-4.95 4.95a.997.997 0 0 0 0 1.414l4.95 4.95a1 1 0 0 0 1.414-1.415L3.414 7.95z"/></symbol><symbol viewBox="0 0 16 16" id="angle-double-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.536 7.95L1.293 3.707a1 1 0 0 1 1.414-1.414l4.95 4.95a.997.997 0 0 1 0 1.414l-4.95 4.95a1 1 0 1 1-1.414-1.415L5.536 7.95zm7 0L8.293 3.707a1 1 0 0 1 1.414-1.414l4.95 4.95a.997.997 0 0 1 0 1.414l-4.95 4.95a1 1 0 0 1-1.414-1.415l4.243-4.242z"/></symbol><symbol viewBox="0 0 16 16" id="angle-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 10.243l-4.95-4.95a1 1 0 0 0-1.414 1.414l5.657 5.657a.997.997 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L8 10.243z"/></symbol><symbol viewBox="0 0 16 16" id="angle-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.757 8l4.95-4.95a1 1 0 1 0-1.414-1.414L3.636 7.293a.997.997 0 0 0 0 1.414l5.657 5.657a1 1 0 0 0 1.414-1.414L5.757 8z"/></symbol><symbol viewBox="0 0 16 16" id="angle-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.243 8l-4.95-4.95a1 1 0 0 1 1.414-1.414l5.657 5.657a.997.997 0 0 1 0 1.414l-5.657 5.657a1 1 0 0 1-1.414-1.414L10.243 8z"/></symbol><symbol viewBox="0 0 16 16" id="angle-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 6.757l-4.95 4.95a1 1 0 1 1-1.414-1.414l5.657-5.657a.997.997 0 0 1 1.414 0l5.657 5.657a1 1 0 0 1-1.414 1.414L8 6.757z"/></symbol><symbol viewBox="0 0 16 16" id="appearance" xmlns="http://www.w3.org/2000/svg"><path d="M11.161 12.456l.232.121c.1.053.175.094.249.137.53.318.844.75.857 1.402.012 1.397-1.116 1.756-3.12 1.858a23.85 23.85 0 0 1-1.38.026A8 8 0 0 1 0 8a8 8 0 0 1 8-8c4.417 0 7.998 3.582 7.998 7.977.06 2.621-1.312 3.586-4.48 3.648-.602.008-1.068.043-1.4.104.228.192.598.47 1.043.727zm-3.287-.943c-.019-1.495 1.228-1.856 3.611-1.888C13.67 9.582 14.028 9.33 13.998 8A6 6 0 1 0 8 14c.603 0 .91-.004 1.277-.023a9.7 9.7 0 0 0 .478-.035c-1.172-.738-1.868-1.47-1.88-2.43zM6 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-2-3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zM4 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="applications" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 0h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm6-6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 1v2h2V1H7zm0 5h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm6-6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1zm0 6h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1zm0 1v2h2V7h-2zM1 12h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zm0 1v2h2v-2H1zm6-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1zm6 0h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="approval" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.536 10.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 1 1 9.12 9.243l1.415 1.414zM7.632 8.109A2 2 0 0 0 7 11.364l2.121 2.121a1.996 1.996 0 0 0 2.807.021C11.686 14.554 10.627 15 6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8c.6 0 1.142.038 1.632.109zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="arrow-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9 6H2a2 2 0 1 0 0 4h7v2.586a1 1 0 0 0 1.707.707l4.586-4.586a1 1 0 0 0 0-1.414l-4.586-4.586A1 1 0 0 0 9 3.414V6z"/></symbol><symbol viewBox="0 0 16 16" id="assignee" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12 5V4a1 1 0 0 1 2 0v1h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V7h-1a1 1 0 0 1 0-2h1zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="bold" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4 12.5v-9A1.5 1.5 0 0 1 5.5 2h2.104c2.182 0 3.879.681 3.879 2.982 0 1.067-.517 2.227-1.374 2.595v.073C11.176 7.963 12 8.865 12 10.466 12 12.914 10.19 14 7.911 14H5.5A1.5 1.5 0 0 1 4 12.5zm2.376-5.696H7.49c1.164 0 1.665-.552 1.665-1.417 0-.94-.534-1.289-1.649-1.289h-1.13v2.706zm0 5.098h1.341c1.293 0 1.956-.515 1.956-1.62 0-1.049-.647-1.472-1.956-1.472H6.376v3.092z"/></symbol><symbol viewBox="0 0 16 16" id="book" xmlns="http://www.w3.org/2000/svg"><path d="M7 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2v4.191a.5.5 0 0 1-.724.447l-1.052-.526a.5.5 0 0 0-.448 0l-1.052.526A.5.5 0 0 1 7 6.191V2zM5 0h6a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"/></symbol><symbol viewBox="0 0 16 16" id="branch" xmlns="http://www.w3.org/2000/svg"><path d="M6 11.978v.29a2 2 0 1 1-2 0V3.732a2 2 0 1 1 2 0v3.849c.592-.491 1.31-.854 2.15-1.081 1.308-.353 1.875-.882 1.893-1.743a2 2 0 1 1 2.002-.051C12.053 6.54 10.857 7.84 8.67 8.43 7.056 8.867 6.195 9.98 6 11.978zM5 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm6 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2zM5 15a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="bullhorn" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6.143 10H7V4H3a3 3 0 1 0 0 6h.143l.734 5.141a1 1 0 0 0 .99.859h1.556a.5.5 0 0 0 .495-.57L6.143 10zM8 4c1.034.02 2.039-.274 3.014-.883.727-.455 1.836-1.334 3.328-2.637A1 1 0 0 1 16 1.233v10.764a1 1 0 0 1-1.595.803c-1.658-1.227-2.788-1.992-3.392-2.294-.781-.39-1.785-.559-3.013-.506V4z"/></symbol><symbol viewBox="0 0 16 16" id="calendar" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12 2h2a2 2 0 0 1 2 2H0a2 2 0 0 1 2-2h2V1a1 1 0 1 1 2 0v1h4V1a1 1 0 1 1 2 0v1zM0 4h16v9a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V4zm2 2.5V13a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6.5a.5.5 0 0 0-.5-.5h-11a.5.5 0 0 0-.5.5zM5 8h2a1 1 0 1 1 0 2H5a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="cancel" xmlns="http://www.w3.org/2000/svg"><path d="M3.11 4.523a6 6 0 0 0 8.367 8.367L3.109 4.524zM4.522 3.11l8.368 8.368A6 6 0 0 0 4.524 3.11zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/></symbol><symbol viewBox="0 0 16 16" id="chart" xmlns="http://www.w3.org/2000/svg"><path d="M15 14a1 1 0 0 1 0 2H2a2 2 0 0 1-2-2V1a1 1 0 1 1 2 0v13h13zM3.142 8.735l2.502-2.561a.5.5 0 0 1 .714-.003L8 7.833l3.592-4.553a.5.5 0 0 1 .796.015l2.516 3.454a.5.5 0 0 1 .096.295V12.5a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5V9.085a.5.5 0 0 1 .142-.35z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.078 8.2l3.535-3.536a2 2 0 0 1 2.828 2.828l-4.949 4.95c-.39.39-.902.586-1.414.586a1.994 1.994 0 0 1-1.414-.586l-4.95-4.95a2 2 0 1 1 2.828-2.828l3.536 3.535z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-left" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.977 7.998l3.535-3.535a2 2 0 1 0-2.828-2.828l-4.95 4.949c-.39.39-.586.902-.586 1.414 0 .512.196 1.024.586 1.414l4.95 4.95a2 2 0 1 0 2.828-2.828L7.977 7.998z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-right" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.22 7.998L4.683 4.463a2 2 0 0 1 2.828-2.828l4.95 4.949c.39.39.586.902.586 1.414a1.99 1.99 0 0 1-.586 1.414l-4.95 4.95a2 2 0 0 1-2.828-2.828l3.535-3.536z"/></symbol><symbol viewBox="0 0 16 16" id="chevron-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.778 8.957l3.535 3.535a2 2 0 1 0 2.828-2.828l-4.949-4.95a1.994 1.994 0 0 0-1.414-.586c-.512 0-1.024.196-1.414.586l-4.95 4.95a2 2 0 1 0 2.828 2.828l3.536-3.535z"/></symbol><symbol viewBox="0 0 16 16" id="clock" xmlns="http://www.w3.org/2000/svg"><path d="M9 7h1a1 1 0 0 1 0 2H8a.997.997 0 0 1-1-1V5a1 1 0 1 1 2 0v2zm-1 9A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="close" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9.414 8l4.95-4.95a1 1 0 0 0-1.414-1.414L8 6.586l-4.95-4.95A1 1 0 0 0 1.636 3.05L6.586 8l-4.95 4.95a1 1 0 1 0 1.414 1.414L8 9.414l4.95 4.95a1 1 0 1 0 1.414-1.414L9.414 8z"/></symbol><symbol viewBox="0 0 16 16" id="code" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M15.871 8.243a.997.997 0 0 0-.293-.707L12.75 4.707a1 1 0 0 0-1.414 1.414l2.12 2.122-2.12 2.121a1 1 0 0 0 1.414 1.414l2.828-2.828a.997.997 0 0 0 .293-.707zm-13.243 0L4.75 6.12a1 1 0 1 0-1.414-1.414L.507 7.536a.997.997 0 0 0 0 1.414l2.829 2.828a1 1 0 1 0 1.414-1.414L2.628 8.243zm6.407-4.107a1 1 0 0 1 .707 1.225L8.19 11.157a1 1 0 1 1-1.931-.518L7.81 4.843a1 1 0 0 1 1.224-.707z"/></symbol><symbol viewBox="0 0 9 13" id="collapse"><path d="M.084.25C.01.18-.015.12.008.071.031.024.093 0 .194 0h8.521c.1 0 .162.024.185.072.023.048-.002.107-.075.177l-4.11 3.935a.372.372 0 0 1-.11.072h-.301a.508.508 0 0 1-.11-.072L.084.249zM.377 6.88a.364.364 0 0 1-.26-.105.334.334 0 0 1-.11-.25v-.709c0-.096.036-.179.11-.249a.364.364 0 0 1 .26-.105h8.15c.101 0 .188.035.261.105.074.07.11.153.11.25v.709c0 .096-.036.179-.11.249a.364.364 0 0 1-.26.105H.377zM.084 12.132c-.074.07-.099.129-.076.177.023.048.085.072.186.072h8.521c.1 0 .162-.024.185-.072.023-.048-.002-.107-.075-.177l-4.11-3.935a.372.372 0 0 0-.11-.072h-.301a.508.508 0 0 0-.11.072l-4.11 3.935z"/></symbol><symbol viewBox="0 0 16 16" id="comment" xmlns="http://www.w3.org/2000/svg"><path d="M1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586z"/></symbol><symbol viewBox="0 0 16 16" id="comment-dots" xmlns="http://www.w3.org/2000/svg"><path d="M1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586zM5 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="comment-next" xmlns="http://www.w3.org/2000/svg"><path d="M8 5V4a.5.5 0 0 1 .8-.4l2.667 2a.5.5 0 0 1 0 .8L8.8 8.4A.5.5 0 0 1 8 8V7H6a1 1 0 1 1 0-2h2zM1.707 15.707C1.077 16.337 0 15.891 0 15V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H5.414l-3.707 3.707zM2 12.586l2.293-2.293A1 1 0 0 1 5 10h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v9.586z"/></symbol><symbol viewBox="0 0 16 16" id="comments" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3.75 10L0 13V3a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H3.75zM13 5h1a2 2 0 0 1 2 2v8l-2.667-2H8a2 2 0 0 1-2-2h4a3 3 0 0 0 3-3V5z"/></symbol><symbol viewBox="0 0 16 16" id="commit" xmlns="http://www.w3.org/2000/svg"><path d="M8 10a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm3.876-1.008a4.002 4.002 0 0 1-7.752 0A1.01 1.01 0 0 1 4 9H1a1 1 0 1 1 0-2h3c.042 0 .083.003.124.008a4.002 4.002 0 0 1 7.752 0A1.01 1.01 0 0 1 12 7h3a1 1 0 0 1 0 2h-3a1.01 1.01 0 0 1-.124-.008z"/></symbol><symbol viewBox="0 0 16 16" id="credit-card" xmlns="http://www.w3.org/2000/svg"><path d="M14 5a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1h12zm0 3H2v3a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V8zM3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm6.5 8h3a.5.5 0 1 1 0 1h-3a.5.5 0 1 1 0-1z"/></symbol><symbol viewBox="0 0 16 16" id="cut" xmlns="http://www.w3.org/2000/svg"><rect width="16" height="2" y="7" fill-rule="evenodd" rx="1"/></symbol><symbol viewBox="0 0 16 16" id="dashboard" xmlns="http://www.w3.org/2000/svg"><path d="M7.709 10.021l.696-2.6a.5.5 0 0 1 .966.26l-.657 2.45A2 2 0 0 1 10 12H6a2 2 0 0 1 1.709-1.979zM0 8.9a8 8 0 0 1 15.998 0H16v3.6a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5V8.9zM14 9A6 6 0 1 0 2 9v3.5a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5V9zM3.5 9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm9 0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-7-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm5 0a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1z"/></symbol><symbol viewBox="0 0 16 16" id="disk" xmlns="http://www.w3.org/2000/svg"><path d="M16 11.764V3a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3v8.764A2.989 2.989 0 0 1 2 11V3a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v8c.768 0 1.47.289 2 .764zM2 12h12a2 2 0 1 1 0 4H2a2 2 0 1 1 0-4zm10 1a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="doc_code" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zm1.036 7.607a.498.498 0 0 1-.147.354l-1.414 1.414a.5.5 0 0 1-.707-.707l1.06-1.06-1.06-1.061a.5.5 0 0 1 .707-.707l1.414 1.414a.498.498 0 0 1 .147.353zm-4.822 0l1.06 1.061a.5.5 0 0 1-.706.707l-1.414-1.414a.498.498 0 0 1 0-.707l1.414-1.414a.5.5 0 1 1 .707.707l-1.06 1.06zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4z"/></symbol><symbol viewBox="0 0 16 16" id="doc_image" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zM7.333 9.667l1.313-1.313a.5.5 0 0 1 .708 0L12 11H4l2.188-1.75a.5.5 0 0 1 .624 0l.521.417zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm.5 8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM4 11h8v.7a.3.3 0 0 1-.3.3H4.3a.3.3 0 0 1-.3-.3V11z"/></symbol><symbol viewBox="0 0 16 16" id="doc_text" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H5a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V7h-3a2 2 0 0 1-2-2V2zm2 .414V5h2.586L10 2.414zM5 0h4.586A2 2 0 0 1 11 .586L14.414 4A2 2 0 0 1 15 5.414V12a4 4 0 0 1-4 4H5a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm.5 11h5a.5.5 0 1 1 0 1h-5a.5.5 0 1 1 0-1zm0-2h5a.5.5 0 1 1 0 1h-5a.5.5 0 0 1 0-1zm0-2h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1z"/></symbol><symbol viewBox="0 0 105 26" id="double-headed-arrow" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1.018 11.089L15.138.614c1.23-.911 3.086-.795 4.147.26.461.46.715 1.045.715 1.651v20.95C20 24.869 18.684 26 17.06 26a3.238 3.238 0 0 1-1.921-.614L1.019 14.911C-.212 14-.347 12.405.714 11.35c.094-.094.195-.18.303-.261zm102.964 0c.108.08.21.167.303.26 1.061 1.056.925 2.65-.303 3.562l-14.12 10.475A3.238 3.238 0 0 1 87.94 26C86.316 26 85 24.87 85 23.475V2.525c0-.606.254-1.192.715-1.65 1.061-1.056 2.917-1.172 4.146-.26l14.12 10.474zM35 17a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm18 0a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm18 0a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/></symbol><symbol viewBox="0 0 16 16" id="download" xmlns="http://www.w3.org/2000/svg"><path d="M9 12h1a.5.5 0 0 1 .4.8l-2 2.667a.5.5 0 0 1-.8 0l-2-2.667A.5.5 0 0 1 6 12h1V8a1 1 0 1 1 2 0v4zM4 9a1 1 0 1 1 0 2 4 4 0 0 1-1.971-7.481 4 4 0 0 1 6.633-2.505 3.999 3.999 0 0 1 3.82 2.014A4 4 0 0 1 12 11a1 1 0 0 1 0-2 2 2 0 1 0 0-4h-1a2 2 0 0 0-3.112-1.662A2 2 0 1 0 4.268 5H4a2 2 0 1 0 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="duplicate" xmlns="http://www.w3.org/2000/svg"><path d="M14 10h-3a1 1 0 0 1-1-1V6H8.527A.527.527 0 0 0 8 6.527V13a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-3zm-4-7H8.527c-.18 0-.355.013-.527.04V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2v2H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h4a3 3 0 0 1 3 3zM8.527 4h2.323a.5.5 0 0 1 .35.143l4.65 4.551a.5.5 0 0 1 .15.357V13a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V6.527A2.527 2.527 0 0 1 8.527 4z"/></symbol><symbol viewBox="0 0 16 16" id="earth" xmlns="http://www.w3.org/2000/svg"><path d="M8.7 2.04l-.082.177c.283.223.422.413.417.571-.008.237-.311.057-.444.274-.133.218.038.542-.112.637-.15.096-.398-.386-.479-.46-.054-.049-.166-.257-.336-.625l-.216-.225a.844.844 0 0 0-.418-.035c-.177.038-.075.1-.035.132.04.032.32.037.452.2.132.164.03.224-.05.298-.054.05-.157.062-.31.035H5.952l-.402.398.03.325.229.455.324-.463c.008-.206.058-.342.15-.41.14-.1.342-.15.534-.085.191.066-.057.218.011.271.068.053.204-.098.313-.02.11.08.07.155.104.322.036.167.254.114.398.328.144.215.19.29.147.483-.043.195-.168.26-.305.232-.138-.028-.107-.246-.275-.348-.168-.102-.266-.114-.386-.054-.12.06-.016.129.023.235.04.106.274.321.224.43-.05.107-.108.116-.42 0-.21-.077-.414-.007-.615.212l-.76.722c-.153.715-.3 1.13-.44 1.243-.211.17-.177-.483-.483-.656-.306-.174-.494-.047-.8-.07-.307-.023-.42.65-.38.873a.434.434 0 0 0 .221.321c.236-.141.39-.184.465-.128.11.084-.144.267-.074.425.07.158.314.069.386.283.073.213.084.48-.05.706-.135.227-.275.178-.4.053-.127-.126-.033-.375-.255-.704-.223-.329-.381-.337-.63-.787-.158-.287-.35-.743-.575-1.366a6 6 0 0 0 3.21 7.198l.001-.075c0-.577-.004-.944-.012-1.102-.011-.236-.95-.945-1.104-1.2-.154-.256-.34-.595-.355-.746-.016-.151.185-.232.344-.325.16-.093-.11-.367.028-.626.137-.258.395-.438.496-.356.101.081.058.228.267.333.209.104.077-.213.456-.178.38.035.143.201.252.216.11.016.113-.127.299-.143.186-.015.282.445.471.622.19.178.452.008.611.043.159.034.267.09.402.255.136.166-.03.352.073.557.103.205 1.07.22 1.433.255.364.034.371.011.371.324s-.166.314-.453.507c-.286.193-.166.462-.38.762-.212.3-.316.062-.622.14-.306.077-.413.382-.452.568-.039.186-.386.094-.877.232-.29.082-.429.144-.569.204a6.002 6.002 0 0 0 7.682-4.3c-.094-.384-.18-.63-.258-.74-.213-.297-.36.21-.924.49-.564.278-.57-.288-.81-.49-.16-.133-.212-.44-.158-.92-.005-.478.02-.828.077-1.049.057-.221.126-.543.207-.965.351-.373.606-.572.764-.595.237-.034.336.374.658.3a.315.315 0 0 0 .035-.01 5.993 5.993 0 0 0-.475-.824l-.309-.043a.646.646 0 0 0-.332-.117c-.205-.02-.025.128-.089.24-.064.112-.235.724-.437.685-.201-.039-.204-.374-.17-.668.036-.294-.077-.35-.2-.412-.124-.062-.325-.213-.556-.295-.232-.082-.123-.175-.093-.274.03-.1.208-.015.193-.058-.014-.044-.313-.135-.266-.167.03-.02.2-.02.506.003l.216-.012.293-.163a.58.58 0 0 0-.376-.22c-.233-.036-.513-.034-.73-.142-.205-.103-.458-.36-.643-.638A5.965 5.965 0 0 0 8.7 2.04zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/></symbol><symbol viewBox="0 0 16 16" id="external-link" xmlns="http://www.w3.org/2000/svg"><path d="M13.121 4.177l-4.95 4.95a1 1 0 1 1-1.414-1.414l4.95-4.95-1.386-1.386a.5.5 0 0 1 .299-.85l4.709-.524a.5.5 0 0 1 .552.552l-.523 4.71a.5.5 0 0 1-.851.297l-1.386-1.385zM12 8.884a1 1 0 0 1 2 0v4a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3v-8a3 3 0 0 1 3-3h4a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-4z"/></symbol><symbol viewBox="0 0 16 16" id="eye" xmlns="http://www.w3.org/2000/svg"><path d="M8 14C4.816 14 2.253 12.284.393 8.981a2 2 0 0 1 0-1.962C2.253 3.716 4.816 2 8 2s5.747 1.716 7.607 5.019a2 2 0 0 1 0 1.962C13.747 12.284 11.184 14 8 14zm0-2c2.41 0 4.338-1.29 5.864-4C12.338 5.29 10.411 4 8 4 5.59 4 3.662 5.29 2.136 8 3.662 10.71 5.589 12 8 12zm0-1a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm1-3a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="eye-slash" xmlns="http://www.w3.org/2000/svg"><path d="M13.618 2.62L1.62 14.619a1 1 0 0 1-.985-1.668l1.525-1.526C1.516 10.742.926 9.927.393 8.981a2 2 0 0 1 0-1.962C2.253 3.716 4.816 2 8 2c1.074 0 2.076.195 3.006.58l.944-.944a1 1 0 0 1 1.668.985zM8.068 11a3 3 0 0 0 2.931-2.932l-2.931 2.931zm-3.02-2.462a3 3 0 0 1 3.49-3.49l.884-.884A6.044 6.044 0 0 0 8 4C5.59 4 3.662 5.29 2.136 8c.445.79.924 1.46 1.439 2.011l1.473-1.473zm.421 5.06l1.658-1.658c.283.04.575.06.873.06 2.41 0 4.338-1.29 5.864-4a11.023 11.023 0 0 0-1.133-1.664l1.418-1.418a12.799 12.799 0 0 1 1.458 2.1 2 2 0 0 1 0 1.963C13.747 12.284 11.184 14 8 14a7.883 7.883 0 0 1-2.53-.402z"/></symbol><symbol viewBox="0 0 16 16" id="file-addition" xmlns="http://www.w3.org/2000/svg"><path d="M7 7V5a1 1 0 1 1 2 0v2h2a1 1 0 0 1 0 2H9v2a1 1 0 0 1-2 0V9H5a1 1 0 1 1 0-2h2zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3z"/></symbol><symbol viewBox="0 0 16 16" id="file-deletion" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3zm2 6h6a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="file-modified" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2H3zm5 4a3 3 0 1 1 0 6 3 3 0 0 1 0-6z"/></symbol><symbol viewBox="0 0 16 16" id="filter" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 6v9l-3.724-1.862A.5.5 0 0 1 6 12.691V6L1.854 1.854A.5.5 0 0 1 2.207 1h11.586a.5.5 0 0 1 .353.854L10 6z"/></symbol><symbol viewBox="0 0 16 16" id="folder" xmlns="http://www.w3.org/2000/svg"><path d="M7.228 5l-.475-1.335A1 1 0 0 0 5.81 3H2v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H7.228zM13 3a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a2 2 0 0 1 2-2h3.81a3 3 0 0 1 2.827 1.995L13 3z"/></symbol><symbol viewBox="0 0 16 16" id="fork" xmlns="http://www.w3.org/2000/svg"><path d="M9 12.268a2 2 0 1 1-2 0V8.874A4.002 4.002 0 0 1 4 5V3.732a2 2 0 1 1 2 0V5a2 2 0 1 0 4 0V3.732a2 2 0 1 1 2 0V5a4.002 4.002 0 0 1-3 3.874v3.394zM11 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zM5 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 12a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="geo-nodes" xmlns="http://www.w3.org/2000/svg"><path d="M9.7 13.1l-.2.2c-.7.8-2 .9-2.8.1-.1 0-.1-.1-.1-.1l-.2-.2c-2 .2-3.4.7-3.4 1.4 0 .8 2.2 1.5 5 1.5s5-.7 5-1.5c0-.7-1.4-1.2-3.3-1.4M7.3 12.7c.4.4 1 .3 1.4-.1C11.6 9.5 13 7 13 5.3 13 2.4 10.8 0 8 0S3 2.4 3 5.3C3 7 4.4 9.5 7.3 12.7M8 2c1.6 0 3 1.4 3 3.3 0 1-1 2.8-3 5.2-2-2.4-3-4.2-3-5.2C5 3.4 6.4 2 8 2"/><circle cx="8" cy="5" r="1"/></symbol><symbol viewBox="0 0 16 16" id="git-merge" xmlns="http://www.w3.org/2000/svg"><path d="M11 12.268V5a1 1 0 0 0-1-1v1a.5.5 0 0 1-.8.4l-2.667-2a.5.5 0 0 1 0-.8L9.2.6a.5.5 0 0 1 .8.4v1a3 3 0 0 1 3 3v7.268a2 2 0 1 1-2 0zm-6 0a2 2 0 1 1-2 0V4.732a2 2 0 1 1 2 0v7.536zM4 4a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm0 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="group" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3.048 11.997C-.377 11.975.013 11.782.013 10.56.013 9.235.653 8 4 8c.444 0 .84.022 1.194.062.164.435.426.82.76 1.132-1.786.389-2.721 1.353-2.906 2.803zm2.94-7.222a2.993 2.993 0 0 0-.976 1.95 2 2 0 1 1 .975-1.95zm6.964 7.222c-.185-1.45-1.12-2.414-2.906-2.803.334-.311.596-.697.76-1.132C11.16 8.022 11.556 8 12 8c3.346 0 3.987 1.235 3.987 2.56 0 1.222.39 1.415-3.035 1.437zm-1.964-5.272a2.993 2.993 0 0 0-.976-1.95 2 2 0 1 1 .976 1.95zM8 9a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 5c-2.177 0-3.987-.115-3.987-1.44S4.653 10 8 10c3.346 0 3.987 1.235 3.987 2.56S10.177 14 8 14z"/></symbol><symbol viewBox="0 0 16 16" id="history" xmlns="http://www.w3.org/2000/svg"><path d="M2.868 3.24a7 7 0 1 1-.043 9.475 1 1 0 0 1 1.478-1.348 5 5 0 1 0 .124-6.865l.796.645a.5.5 0 0 1-.193.873l-3.232.814a.5.5 0 0 1-.622-.504L1.3 3a.5.5 0 0 1 .814-.37l.754.61zM9 8h1a1 1 0 0 1 0 2H8a.997.997 0 0 1-1-1V6a1 1 0 1 1 2 0v2z"/></symbol><symbol viewBox="0 0 16 16" id="home" xmlns="http://www.w3.org/2000/svg"><path d="M8.462 2.177a.505.505 0 0 1-.038.044l.038-.044zm-.787 0l.038.043a.5.5 0 0 1-.038-.043zM3.706 7h8.725L8.069 2.585 3.706 7zM7 13.369V12a1 1 0 0 1 2 0v1.369h3V9H4v4.369h3zM14 9v4.836c0 .833-.657 1.533-1.5 1.533h-9c-.843 0-1.5-.7-1.5-1.533V9h-.448a1.1 1.1 0 0 1-.783-1.873L6.934.887a1.5 1.5 0 0 1 2.269 0l6.165 6.24A1.1 1.1 0 0 1 14.585 9H14z"/></symbol><symbol viewBox="0 0 16 16" id="hook" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1h4zm0 1H6v1a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V4zM7 8a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h2a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3v4a2 2 0 1 0 4 0h-.44a.3.3 0 0 1-.25-.466l1.44-2.16a.3.3 0 0 1 .5 0l1.44 2.16a.3.3 0 0 1-.25.466H15a4 4 0 0 1-7 2.646A4 4 0 0 1 1 12H.56a.3.3 0 0 1-.25-.466l1.44-2.16a.3.3 0 0 1 .5 0l1.44 2.16a.3.3 0 0 1-.25.466H3a2 2 0 1 0 4 0V8z"/></symbol><symbol viewBox="0 0 16 16" id="hourglass" xmlns="http://www.w3.org/2000/svg"><path d="M10.331 4.889A2.988 2.988 0 0 0 11 3V2H5v1c0 .362.064.709.182 1.03l5.15.859zM3 14v-1c0-1.78.93-3.342 2.33-4.228.447-.327.67-.582.67-.764 0-.19-.242-.46-.725-.815A4.996 4.996 0 0 1 3 3V2H2a1 1 0 1 1 0-2h12a1 1 0 0 1 0 2h-1v1a4.997 4.997 0 0 1-2.39 4.266c-.407.3-.61.545-.61.734 0 .19.203.434.61.734A4.997 4.997 0 0 1 13 13v1h1a1 1 0 0 1 0 2H2a1 1 0 0 1 0-2h1zm8 0v-1a3 3 0 0 0-6 0v1h6z"/></symbol><symbol viewBox="0 0 24 30" id="image-comment-dark" xmlns="http://www.w3.org/2000/svg"><title>cursor_active</title><g fill="none" fill-rule="evenodd"><path d="M24 12.105c0 6.686-5.74 11.58-12 17.895C5.74 23.684 0 18.79 0 12.105 0 5.42 5.373 0 12 0s12 5.42 12 12.105z" fill="#FFF" fill-rule="nonzero"/><path d="M15.28 25.249c1.458-1.475 2.539-2.635 3.474-3.747 2.851-3.394 4.203-6.265 4.203-9.397 0-6.111-4.908-11.062-10.957-11.062-6.05 0-10.957 4.951-10.957 11.062 0 3.132 1.352 6.003 4.203 9.397.935 1.112 2.016 2.272 3.474 3.747.511.517 2.216 2.213 3.28 3.275 1.064-1.062 2.769-2.758 3.28-3.275z" fill="#1F78D1"/><path d="M14.551 8.256A6.874 6.874 0 0 0 12 7.787a6.92 6.92 0 0 0-2.558.469c-.79.308-1.42.725-1.888 1.252-.465.527-.697 1.096-.697 1.708 0 .5.159.977.476 1.433.321.45.772.841 1.352 1.172l.583.334-.181.643c-.107.407-.263.79-.469 1.152a6.604 6.604 0 0 0 1.842-1.145l.288-.254.381.04c.309.035.599.053.871.053.91 0 1.761-.154 2.551-.462.795-.312 1.424-.732 1.889-1.259.468-.526.703-1.096.703-1.707 0-.612-.235-1.181-.703-1.708-.465-.527-1.094-.944-1.889-1.252zm2.645.81c.536.656.804 1.373.804 2.15 0 .776-.268 1.495-.804 2.156-.535.656-1.263 1.176-2.183 1.56-.92.38-1.924.57-3.013.57a9.16 9.16 0 0 1-.971-.054 7.32 7.32 0 0 1-3.08 1.62 5.044 5.044 0 0 1-.764.148h-.033a.26.26 0 0 1-.181-.074.324.324 0 0 1-.107-.18v-.007c-.014-.018-.016-.045-.007-.08.014-.037.018-.059.014-.068a.19.19 0 0 1 .033-.067.645.645 0 0 0 .04-.06 1.73 1.73 0 0 0 .047-.054l.054-.06a53.034 53.034 0 0 1 .435-.489c.049-.049.118-.136.207-.26a2.57 2.57 0 0 0 .221-.342c.054-.103.114-.235.181-.395a4.18 4.18 0 0 0 .174-.51c-.7-.397-1.254-.888-1.66-1.473A3.261 3.261 0 0 1 6 11.216c0-.777.268-1.494.804-2.15.535-.66 1.263-1.18 2.183-1.56.92-.384 1.924-.576 3.013-.576 1.09 0 2.094.192 3.013.576.92.38 1.648.9 2.183 1.56z" fill="#FFF" fill-rule="nonzero"/></g></symbol><symbol viewBox="0 0 16 16" id="import" xmlns="http://www.w3.org/2000/svg"><path d="M9 8h1a.5.5 0 0 1 .4.8l-2 2.667a.5.5 0 0 1-.8 0L5.6 8.8A.5.5 0 0 1 6 8h1V1a1 1 0 1 1 2 0v7zM0 8a1 1 0 1 1 2 0 6 6 0 1 0 12 0 1 1 0 0 1 2 0A8 8 0 1 1 0 8z"/></symbol><symbol viewBox="0 0 16 16" id="issue-block" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.803 8a5.97 5.97 0 0 0-.462 1H4.5a.5.5 0 0 1 0-1h1.303zM4.5 5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1zm7.5.083a6.04 6.04 0 0 0-2 0V3a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h2.083a5.96 5.96 0 0 0 .72 2H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h6a3 3 0 0 1 3 3v2.083zm1.121 3.796zM11 16a5 5 0 1 1 0-10 5 5 0 0 1 0 10zm-1.293-2.292a3 3 0 0 0 4.001-4.001l-4.001 4zm-1.415-1.415l4.001-4a3 3 0 0 0-4.001 4.001z"/></symbol><symbol viewBox="0 0 16 16" id="issue-child" xmlns="http://www.w3.org/2000/svg"><path d="M11 8H5v1h1a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h2V7a.997.997 0 0 1 1-1h3V4H4.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5H9v2h3a.997.997 0 0 1 1 1v2h2a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h1V8zm-9 3v2h3v-2H2zm9 0v2h3v-2h-3z"/></symbol><symbol viewBox="0 0 16 16" id="issue-close" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 0 1 6.12 7.243l1.415 1.414zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="issue-duplicate" xmlns="http://www.w3.org/2000/svg"><path d="M10.874 2H12a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-2c-.918 0-1.74-.413-2.29-1.063a3.987 3.987 0 0 0 1.988-.984A1 1 0 0 0 10 14h2a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-1V3c0-.345-.044-.68-.126-1zM4 0h3a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4z"/></symbol><symbol viewBox="0 0 16 16" id="issue-new" xmlns="http://www.w3.org/2000/svg"><path d="M10 2V1a1 1 0 0 1 2 0v1h1a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V4H9a1 1 0 1 1 0-2h1zm0 6a1 1 0 0 1 2 0v5a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h1a1 1 0 1 1 0 2H5a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V8z"/></symbol><symbol viewBox="0 0 16 16" id="issue-open" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm0-2a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-2a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="issue-open-m" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="issue-parent" xmlns="http://www.w3.org/2000/svg"><path d="M11 11H5v1h1.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-6a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5H3v-2a.997.997 0 0 1 1-1h3V7H5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H9v2h3a.997.997 0 0 1 1 1v2h2.5a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5h-6a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5H11v-1zM6 3v2h4V3H6z"/></symbol><symbol viewBox="0 0 16 16" id="issues" xmlns="http://www.w3.org/2000/svg"><path d="M10.458 15.012l.311.055a3 3 0 0 0 3.476-2.433l1.389-7.879A3 3 0 0 0 13.2 1.28L11.23.933a3.002 3.002 0 0 0-.824-.031c.364.59.58 1.28.593 2.02l1.854.328a1 1 0 0 1 .811 1.158l-1.389 7.879a1 1 0 0 1-1.158.81l-.118-.02a3.98 3.98 0 0 1-.541 1.935zM3 0h4a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="italic" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.5 12l2-8H6a1 1 0 1 1 0-2h6a1 1 0 0 1 0 2h-1.5l-2 8H10a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2h1.5z"/></symbol><symbol viewBox="0 0 16 16" id="key" xmlns="http://www.w3.org/2000/svg"><path d="M7.575 6.689a4.002 4.002 0 0 1 6.274-4.86 4 4 0 0 1-4.86 6.274l-2.21 2.21.706.708a1 1 0 1 1-1.414 1.414l-.707-.707-.707.707.707.707a1 1 0 1 1-1.414 1.414l-.707-.707a1 1 0 0 1-1.414-1.414l5.746-5.746zm2.032-.618a2 2 0 1 0 2.828-2.828A2 2 0 0 0 9.607 6.07z"/></symbol><symbol viewBox="0 0 16 16" id="key-2" xmlns="http://www.w3.org/2000/svg"><path d="M5.172 14.157l-.344.344-2.485.133a.462.462 0 0 1-.497-.503l.14-2.24a.599.599 0 0 1 .177-.382l5.155-5.155a4 4 0 1 1 2.828 2.828l-1.439 1.44-1.06-.354-.708.707.354 1.06-.707.708-1.06-.354-.708.707.354 1.06zm6.01-8.839a1 1 0 1 0 1.414-1.414 1 1 0 0 0-1.414 1.414z"/></symbol><symbol viewBox="0 0 16 16" id="label" xmlns="http://www.w3.org/2000/svg"><path d="M11.782 14.718a3 3 0 0 1-4.242 0L1.652 8.829a2 2 0 0 1-.565-1.702l.54-3.703a2 2 0 0 1 1.69-1.69l3.703-.54a2 2 0 0 1 1.703.564l5.888 5.888a3 3 0 0 1 0 4.243l-2.829 2.829zm1.415-5.657L7.309 3.173l-3.703.54-.54 3.702 5.888 5.888a1 1 0 0 0 1.414 0l2.829-2.828a1 1 0 0 0 0-1.414zM5.732 5.525A1 1 0 1 1 7.146 6.94a1 1 0 0 1-1.414-1.414z"/></symbol><symbol viewBox="0 0 16 16" id="labels" xmlns="http://www.w3.org/2000/svg"><path d="M9.424 2.254l2.08-.905a1 1 0 0 1 1.206.326l3.013 4.12a1 1 0 0 1 .16.849l-1.947 7.264a3 3 0 0 1-3.675 2.122l-.5-.135a3.999 3.999 0 0 0 1.082-1.782 1 1 0 0 0 1.16-.722l1.823-6.802-2.258-3.087-.687.299a2 2 0 0 0-.628-.88l-.829-.667zM.377 3.7L4.4.498a1 1 0 0 1 1.25.003L9.627 3.7a1 1 0 0 1 .373.78V13a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V4.482A1 1 0 0 1 .377 3.7zM2 13a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V4.958L5.02 2.561 2 4.964V13zm3-6a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="leave" xmlns="http://www.w3.org/2000/svg"><path d="M11 7V5.883a.5.5 0 0 1 .757-.429l3.528 2.117a.5.5 0 0 1 0 .858l-3.528 2.117a.5.5 0 0 1-.757-.43V9H7a1 1 0 1 1 0-2h4zm-2 6.256a1 1 0 0 1 2 0A2.744 2.744 0 0 1 8.256 16H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h5.19A2.81 2.81 0 0 1 11 2.81a1 1 0 0 1-2 0A.81.81 0 0 0 8.19 2H3a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h5.256c.41 0 .744-.333.744-.744z"/></symbol><symbol viewBox="0 0 16 16" id="level-up" xmlns="http://www.w3.org/2000/svg"><path fill="#2E2E2E" fill-rule="evenodd" d="M7 6h3.489a.5.5 0 0 0 .373-.832L6.374.117a.5.5 0 0 0-.748 0l-4.488 5.05A.5.5 0 0 0 1.51 6H5v7a3 3 0 0 0 3 3h6a1 1 0 0 0 0-2H8a1 1 0 0 1-1-1V6z"/></symbol><symbol viewBox="0 0 16 16" id="license" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M12.56 8.9l2.66 4.606a.3.3 0 0 1-.243.45l-1.678.094a.1.1 0 0 0-.078.044l-.953 1.432a.3.3 0 0 1-.51-.016L9.097 10.9a5.994 5.994 0 0 0 3.464-2zm-5.23 2.063L4.707 15.51a.3.3 0 0 1-.51.016l-.953-1.432a.1.1 0 0 0-.078-.044l-1.678-.094a.3.3 0 0 1-.243-.45l2.48-4.297a5.983 5.983 0 0 0 3.607 1.754zM8 10A5 5 0 1 1 8 0a5 5 0 0 1 0 10zm0-2a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-1a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="link" xmlns="http://www.w3.org/2000/svg"><path d="M6.986 3.35l2.12-2.122a4 4 0 0 1 5.657 5.657l-2.828 2.829a4 4 0 0 1-5.657 0 1 1 0 0 1 1.414-1.415 2 2 0 0 0 2.829 0l2.828-2.828a2 2 0 1 0-2.828-2.828l-1.001 1a5.018 5.018 0 0 0-2.534-.294zm2.12 9.192l-2.12 2.121a4 4 0 1 1-5.658-5.656l2.829-2.829a4 4 0 0 1 5.657 0 1 1 0 1 1-1.415 1.414 2 2 0 0 0-2.828 0l-2.828 2.829a2 2 0 1 0 2.828 2.828l1.001-1.001a5.018 5.018 0 0 0 2.534.294z"/></symbol><symbol viewBox="0 0 16 16" id="list-bulleted" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4-7h10a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2zm0 5h10a1 1 0 0 1 0 2H5a1 1 0 1 1 0-2zm-4 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4-2h10a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="list-numbered" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6 2h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm0 5h8a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2zm0 5h8a1 1 0 0 1 0 2H6a1 1 0 0 1 0-2zM1.156 5v-.828h.816V2.204h-.72v-.636c.432-.084.708-.192.996-.372h.756v2.976h.684V5H1.156zm-.18 5v-.588c.9-.828 1.596-1.464 1.596-1.98 0-.342-.192-.504-.468-.504-.252 0-.444.18-.624.36l-.552-.552c.396-.42.756-.612 1.32-.612.768 0 1.308.492 1.308 1.248 0 .612-.576 1.284-1.092 1.812.192-.024.468-.048.636-.048h.636V10H.976zm1.26 5.072c-.618 0-1.068-.204-1.356-.54l.468-.648c.234.216.51.36.78.36.336 0 .552-.12.552-.36 0-.288-.15-.456-.948-.456v-.72c.636 0 .828-.168.828-.432 0-.228-.138-.348-.396-.348-.252 0-.432.108-.672.312l-.516-.624c.372-.312.768-.492 1.236-.492.84 0 1.38.384 1.38 1.074 0 .366-.204.642-.612.822v.024c.432.132.732.432.732.912 0 .72-.684 1.116-1.476 1.116z"/></symbol><symbol viewBox="0 0 16 16" id="location" xmlns="http://www.w3.org/2000/svg"><path d="M8.755 15.144a1 1 0 0 1-1.51 0C3.748 11.114 2 8.065 2 6a6 6 0 1 1 12 0c0 2.065-1.748 5.113-5.245 9.144zM12 6a4 4 0 1 0-8 0c0 1.314 1.312 3.71 4 6.944C10.688 9.71 12 7.314 12 6zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="location-dot" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6.314 13.087C4.382 13.295 3 13.85 3 14.5c0 .828 2.239 1.5 5 1.5s5-.672 5-1.5c0-.65-1.382-1.205-3.314-1.413l-.202.225a2 2 0 0 1-2.968 0l-.202-.225zm2.428-.445a1 1 0 0 1-1.484 0C4.419 9.5 3 7.037 3 5.252 3 2.353 5.239 0 8 0s5 2.352 5 5.253c0 1.784-1.42 4.247-4.258 7.389zM11 5.252C11 3.436 9.634 2 8 2S5 3.435 5 5.253c0 1.027.974 2.824 3 5.203 2.026-2.38 3-4.176 3-5.203zM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="lock" xmlns="http://www.w3.org/2000/svg"><path d="M10 5V4h2v1a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3V4h2v1h4zM4 7a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1H4zm0-3a4 4 0 1 1 8 0h-2a2 2 0 1 0-4 0H4z"/></symbol><symbol viewBox="0 0 16 16" id="lock-open" xmlns="http://www.w3.org/2000/svg"><path d="M4.044 4a4 4 0 0 1 6.99-2.658 1 1 0 1 1-1.495 1.33A2 2 0 0 0 6.044 4a.998.998 0 0 1-.07.367v.701H12a3 3 0 0 1 3 3v5a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3v-5a3 3 0 0 1 2.974-3V4h.07zM4 7.07a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H4z"/></symbol><symbol viewBox="0 0 16 16" id="log" xmlns="http://www.w3.org/2000/svg"><path d="M4 0h8a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4zm1 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-5h3a1 1 0 0 1 0 2H8a1 1 0 1 1 0-2zm0 3h3a1 1 0 0 1 0 2H8a1 1 0 1 1 0-2zm-3 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm3-2h3a1 1 0 0 1 0 2H8a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="mail" xmlns="http://www.w3.org/2000/svg"><path d="M14 5.6L9.338 9.796a2 2 0 0 1-2.676 0L2 5.6V11a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5.6zM3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm.212 2L8 8.31 12.788 4H3.212z"/></symbol><symbol viewBox="0 0 16 16" id="menu" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1.143 2h13.714C15.488 2 16 2.448 16 3s-.512 1-1.143 1H1.143C.512 4 0 3.552 0 3s.512-1 1.143-1zm0 5h13.714C15.488 7 16 7.448 16 8s-.512 1-1.143 1H1.143C.512 9 0 8.552 0 8s.512-1 1.143-1zm0 5h13.714c.631 0 1.143.448 1.143 1s-.512 1-1.143 1H1.143C.512 14 0 13.552 0 13s.512-1 1.143-1z"/></symbol><symbol viewBox="0 0 16 16" id="merge-request-close" xmlns="http://www.w3.org/2000/svg"><path d="M9.414 8l1.414 1.414a1 1 0 1 1-1.414 1.414L8 9.414l-1.414 1.414a1 1 0 1 1-1.414-1.414L6.586 8 5.172 6.586a1 1 0 1 1 1.414-1.414L8 6.586l1.414-1.414a1 1 0 1 1 1.414 1.414L9.414 8zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 16 16" id="messages" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.588 8.942l1.173 5.862A1 1 0 0 1 8.78 16H7.22a1 1 0 0 1-.98-1.196l1.172-5.862a3.014 3.014 0 0 0 1.176 0zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4zM4.464 2.464L5.88 3.88a3 3 0 0 0 0 4.242L4.464 9.536a5 5 0 0 1 0-7.072zm7.072 7.072L10.12 8.12a3 3 0 0 0 0-4.242l1.415-1.415a5 5 0 0 1 0 7.072zM2.343.343l1.414 1.414a6 6 0 0 0 0 8.486l-1.414 1.414a8 8 0 0 1 0-11.314zm11.314 11.314l-1.414-1.414a6 6 0 0 0 0-8.486L13.657.343a8 8 0 0 1 0 11.314z"/></symbol><symbol viewBox="0 0 16 16" id="mobile-issue-close" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5.657 10.728L2.12 7.192A1 1 0 1 0 .707 8.607l4.243 4.242a.997.997 0 0 0 1.414 0l8.485-8.485a1 1 0 1 0-1.414-1.414l-7.778 7.778z"/></symbol><symbol viewBox="0 0 16 16" id="monitor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 13v1h3a1 1 0 0 1 0 2H3a1 1 0 0 1 0-2h3v-1H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3h-3zM3 2a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3zm5.723 6.416l-2.66-1.773-1.71 1.71a.5.5 0 1 1-.707-.707l2-2a.5.5 0 0 1 .631-.062l2.66 1.773 2.71-2.71a.5.5 0 0 1 .707.707l-3 3a.5.5 0 0 1-.631.062z"/></symbol><symbol viewBox="0 0 16 16" id="more" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 4a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4zm0 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="notifications" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M6 14H2.435a2 2 0 0 1-1.761-2.947c.962-1.788 1.521-3.065 1.68-3.832.322-1.566.947-5.501 4.65-6.134a1 1 0 1 1 1.994-.024c3.755.528 4.375 4.27 4.761 6.043.188.86.742 2.188 1.661 3.982A2 2 0 0 1 13.64 14H10a2 2 0 1 1-4 0zm5.805-6.468c-.325-1.492-.37-1.674-.61-2.288C10.6 3.716 9.742 3 8.07 3c-1.608 0-2.49.718-3.103 2.197-.28.676-.356.982-.654 2.428-.208 1.012-.827 2.424-1.877 4.375H13.64c-.993-1.937-1.6-3.396-1.835-4.468z"/></symbol><symbol viewBox="0 0 16 16" id="notifications-off" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.26 5.089c.243.757.382 1.478.5 2.017.187.86.74 2.188 1.66 3.982A2 2 0 0 1 13.64 14H10a2 2 0 1 1-4 0H4.35l2-2h7.29c-.993-1.937-1.6-3.396-1.835-4.468-.07-.326-.129-.59-.178-.81l1.634-1.633zM10.943 1.75l-1.48 1.48C9.07 3.076 8.612 3 8.069 3c-1.608 0-2.49.718-3.103 2.197-.28.676-.356.982-.654 2.428-.065.317-.17.673-.317 1.073L.45 12.242a1.99 1.99 0 0 1 .224-1.19c.962-1.787 1.521-3.064 1.68-3.831.322-1.566.947-5.501 4.65-6.134a1 1 0 1 1 1.994-.024 4.867 4.867 0 0 1 1.944.688zm2.932-.105a1 1 0 0 1 0 1.415L2.561 14.374a1 1 0 1 1-1.415-1.414L12.46 1.646a1 1 0 0 1 1.414 0z"/></symbol><symbol viewBox="0 0 16 16" id="overview" xmlns="http://www.w3.org/2000/svg"><path d="M2 0h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2zm0 2v3h3V2H2zm9-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2h-3a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2zm0 2v3h3V2h-3zM2 9h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2zm0 2v3h3v-3H2zm9-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2h-3a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2zm0 2v3h3v-3h-3z"/></symbol><symbol viewBox="0 0 16 16" id="pencil" xmlns="http://www.w3.org/2000/svg"><path d="M13.02 1.293l1.414 1.414a1 1 0 0 1 0 1.414L4.119 14.436a1 1 0 0 1-.704.293l-2.407.008L1 12.316a1 1 0 0 1 .293-.71L11.605 1.292a1 1 0 0 1 1.414 0zm-1.416 1.415l-.707.707L12.31 4.83l.707-.707-1.414-1.415zM3.411 13.73l1.123-1.122H3.12v-1.415L2 12.312l.005 1.422 1.406-.005z"/></symbol><symbol viewBox="0 0 16 16" id="pipeline" xmlns="http://www.w3.org/2000/svg"><path d="M8.969 7.25a2 2 0 1 1-1.938 0A1.002 1.002 0 0 1 7 7V5.083a.2.2 0 0 1 .06-.142l.877-.87a.1.1 0 0 1 .141 0l.864.87A.2.2 0 0 1 9 5.083V7c0 .086-.01.17-.031.25zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm4.5-4a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-2 6a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-5 9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-9a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm-2 6a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zm0-3a.5.5 0 1 1 0-1 .5.5 0 0 1 0 1zM8 10a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="play" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2.765 15.835c-.545.321-1.258.159-1.593-.363A1.075 1.075 0 0 1 1 14.89V1.11C1 .496 1.518 0 2.158 0c.214 0 .424.057.607.165l11.684 6.89c.544.321.714 1.005.38 1.526a1.135 1.135 0 0 1-.38.364l-11.684 6.89z"/></symbol><symbol viewBox="0 0 16 16" id="plus" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7 7V1a1 1 0 1 1 2 0v6h6a1 1 0 0 1 0 2H9v6a1 1 0 0 1-2 0V9H1a1 1 0 1 1 0-2h6z"/></symbol><symbol viewBox="0 0 16 16" id="plus-square" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M9 7V4a1 1 0 1 0-2 0v3H4a1 1 0 1 0 0 2h3v3a1 1 0 0 0 2 0V9h3a1 1 0 0 0 0-2H9zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3z"/></symbol><symbol viewBox="0 0 16 16" id="plus-square-o" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7 7V5a1 1 0 1 1 2 0v2h2a1 1 0 0 1 0 2H9v2a1 1 0 0 1-2 0V9H5a1 1 0 1 1 0-2h2zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="preferences" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M5 12h10a1 1 0 0 1 0 2H5a1 1 0 0 1-2 0v-2a1 1 0 0 1 2 0zm-3 0H1a1 1 0 0 0 0 2h1v-2zm11-5h2a1 1 0 0 1 0 2h-2a1 1 0 0 1-2 0V7a1 1 0 0 1 2 0zm-3 0H1a1 1 0 1 0 0 2h9V7zM6 2h9a1 1 0 0 1 0 2H6a1 1 0 1 1-2 0V2a1 1 0 1 1 2 0zM3 2H1a1 1 0 1 0 0 2h2V2z"/></symbol><symbol viewBox="0 0 16 16" id="profile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-4.274-3.404C4.412 9.709 5.694 9 8 9c2.313 0 3.595.7 4.28 1.586A4.997 4.997 0 0 1 8 13a4.997 4.997 0 0 1-4.274-2.404zM8 8a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"/></symbol><symbol viewBox="0 0 16 16" id="project" xmlns="http://www.w3.org/2000/svg"><path d="M8.462 2.177l-.038.044a.505.505 0 0 0 .038-.044zm-.787 0a.5.5 0 0 0 .038.043l-.038-.043zM3.706 7h8.725L8.069 2.585 3.706 7zM7 13.369V12a1 1 0 0 1 2 0v1.369h3V9H4v4.369h3zM14 9v4.836c0 .833-.657 1.533-1.5 1.533h-9c-.843 0-1.5-.7-1.5-1.533V9h-.448a1.1 1.1 0 0 1-.783-1.873L6.934.887a1.5 1.5 0 0 1 2.269 0l6.165 6.24A1.1 1.1 0 0 1 14.585 9H14z"/></symbol><symbol viewBox="0 0 16 16" id="push-rules" xmlns="http://www.w3.org/2000/svg"><path d="M6.268 9a2 2 0 0 1 3.464 0H11a1 1 0 0 1 0 2H9.732a2 2 0 0 1-3.464 0H5a1 1 0 0 1 0-2h1.268zM7 2H4a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1h-1v3.515a.3.3 0 0 1-.434.268l-1.432-.716a.3.3 0 0 0-.268 0l-1.432.716A.3.3 0 0 1 7 5.515V2zM4 0h8a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm4 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="question" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm-1.46-5.602h2.233a3.97 3.97 0 0 1 .051-.558c.029-.17.073-.326.133-.469.06-.143.14-.28.242-.41.102-.13.228-.263.38-.399.26-.24.504-.467.733-.683a5.03 5.03 0 0 0 .598-.668c.17-.23.302-.477.399-.742a2.66 2.66 0 0 0 .144-.907c0-.505-.083-.95-.25-1.335a2.55 2.55 0 0 0-.723-.97 3.2 3.2 0 0 0-1.152-.589 5.441 5.441 0 0 0-1.531-.2c-.516 0-.998.063-1.445.188a3.19 3.19 0 0 0-1.168.59c-.331.268-.594.61-.79 1.027-.195.417-.295.917-.3 1.5h2.64c.006-.224.04-.416.102-.578.062-.161.142-.293.238-.394a.921.921 0 0 1 .332-.227 1.04 1.04 0 0 1 .39-.074c.34 0 .593.095.763.285.169.19.254.488.254.895 0 .328-.106.63-.317.906-.21.276-.499.565-.863.867-.214.182-.39.374-.531.574-.141.2-.253.42-.336.657a3.656 3.656 0 0 0-.176.777 7.89 7.89 0 0 0-.05.937zm-.321 2.375c0 .188.035.362.105.524.07.161.17.3.301.418.13.117.284.21.46.277.178.068.376.102.595.102.218 0 .416-.034.593-.102.178-.068.331-.16.461-.277a1.2 1.2 0 0 0 .301-.418c.07-.162.106-.336.106-.524a1.3 1.3 0 0 0-.106-.523 1.2 1.2 0 0 0-.3-.418 1.461 1.461 0 0 0-.462-.277 1.651 1.651 0 0 0-.593-.102c-.22 0-.417.034-.594.102a1.46 1.46 0 0 0-.461.277 1.2 1.2 0 0 0-.3.418 1.284 1.284 0 0 0-.106.523z"/></symbol><symbol viewBox="0 0 16 16" id="question-o" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-.778-4.151c0-.301.014-.575.044-.82a3.2 3.2 0 0 1 .154-.68c.073-.208.17-.4.294-.575.123-.176.278-.343.465-.503a4.81 4.81 0 0 0 .755-.758c.185-.242.277-.506.277-.793 0-.356-.074-.617-.222-.783-.148-.166-.37-.25-.667-.25a.92.92 0 0 0-.342.065.806.806 0 0 0-.29.199 1.04 1.04 0 0 0-.209.345 1.5 1.5 0 0 0-.088.506H5.082c.005-.51.092-.948.263-1.313.171-.364.401-.664.69-.899.29-.234.63-.406 1.023-.516a4.66 4.66 0 0 1 1.264-.164c.497 0 .944.058 1.34.174.397.117.733.289 1.008.517.276.227.487.51.633.847.146.337.218.727.218 1.17 0 .295-.042.56-.126.792a2.52 2.52 0 0 1-.349.65 4.4 4.4 0 0 1-.523.584c-.2.19-.414.389-.642.598a2.73 2.73 0 0 0-.332.349c-.089.114-.16.233-.212.359a1.868 1.868 0 0 0-.116.41 3.39 3.39 0 0 0-.044.489H7.222zm-.28 2.078c0-.164.03-.317.092-.458a1.05 1.05 0 0 1 .263-.366c.114-.103.248-.183.403-.243a1.45 1.45 0 0 1 .52-.089c.191 0 .364.03.52.09.154.059.289.14.403.242.114.103.201.224.263.366.061.141.092.294.092.458 0 .164-.03.316-.092.458a1.05 1.05 0 0 1-.263.365 1.278 1.278 0 0 1-.404.243 1.43 1.43 0 0 1-.52.089c-.19 0-.364-.03-.519-.089-.155-.06-.29-.14-.403-.243a1.05 1.05 0 0 1-.263-.365 1.135 1.135 0 0 1-.093-.458z"/></symbol><symbol viewBox="0 0 16 16" id="quote" xmlns="http://www.w3.org/2000/svg"><path d="M15 3v8a3 3 0 0 1-3 3 1 1 0 0 1 0-2 1 1 0 0 0 1-1V9h-2a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h3a1 1 0 0 1 1 1zM7 3v8a3 3 0 0 1-3 3 1 1 0 0 1 0-2 1 1 0 0 0 1-1V9H3a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h3a1 1 0 0 1 1 1z"/></symbol><symbol viewBox="0 0 16 16" id="redo" xmlns="http://www.w3.org/2000/svg"><path d="M4.666 4.423a5 5 0 1 1-.203 6.944 1 1 0 1 0-1.478 1.347 7 7 0 1 0 .12-9.556L1.842 2.137a.5.5 0 0 0-.815.385L1 7.26a.5.5 0 0 0 .607.492l4.629-1.013a.5.5 0 0 0 .207-.877L4.666 4.423z"/></symbol><symbol viewBox="0 0 16 16" id="remove" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2 3a1 1 0 1 1 0-2h12a1 1 0 0 1 0 2v10a3 3 0 0 1-3 3H5a3 3 0 0 1-3-3V3zm3-2a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1H5zM4 3v10a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V3H4zm2.5 2a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5zm3 0a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5z"/></symbol><symbol viewBox="0 0 16 16" id="repeat" xmlns="http://www.w3.org/2000/svg"><path d="M11.494 4.423a5 5 0 1 0 .203 6.944 1 1 0 1 1 1.478 1.347 7 7 0 1 1-.12-9.556l1.262-1.021a.5.5 0 0 1 .815.385l.028 4.738a.5.5 0 0 1-.607.492L9.924 6.739a.5.5 0 0 1-.207-.877l1.777-1.439z"/></symbol><symbol viewBox="0 0 16 16" id="retry" xmlns="http://www.w3.org/2000/svg"><path d="M4.114 6.958a4 4 0 0 0 5.283 4.775 1 1 0 1 1 .712 1.87A6 6 0 0 1 2.182 6.44l-.741-.2a.5.5 0 0 1-.12-.915l2.195-1.268a.5.5 0 0 1 .683.183l1.268 2.196a.5.5 0 0 1-.563.733l-.79-.212zm7.777 2.084a4 4 0 0 0-5.284-4.775 1 1 0 0 1-.712-1.87 6 6 0 0 1 7.927 7.162l.742.2a.5.5 0 0 1 .12.915l-2.196 1.268a.5.5 0 0 1-.683-.183l-1.267-2.196a.5.5 0 0 1 .562-.733l.79.212z"/></symbol><symbol viewBox="0 0 16 16" id="scale" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M13.99 9a.792.792 0 0 0-.078-.231L13 7l-.912 1.769a.791.791 0 0 0-.077.231h1.978zm-10 0a.792.792 0 0 0-.078-.231L3 7l-.912 1.769A.791.791 0 0 0 2.011 9h1.978zM2 0h12a1 1 0 0 1 0 2H2a1 1 0 1 1 0-2zm3 14h6a1 1 0 0 1 0 2H5a1 1 0 0 1 0-2zM8 4a1 1 0 0 1 1 1v9H7V5a1 1 0 0 1 1-1zm-4.53-.714l2.265 4.735c.68 1.42.006 3.091-1.504 3.73A3.161 3.161 0 0 1 3 12c-1.657 0-3-1.263-3-2.821 0-.4.09-.794.264-1.158L2.53 3.286a.53.53 0 0 1 .94 0zm10 0l2.265 4.735c.68 1.42.006 3.091-1.504 3.73A3.161 3.161 0 0 1 13 12c-1.657 0-3-1.263-3-2.821 0-.4.09-.794.264-1.158l2.266-4.735a.53.53 0 0 1 .94 0z"/></symbol><symbol viewBox="0 0 16 16" id="screen-full" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M14 14v-2a1 1 0 0 1 2 0v3a.997.997 0 0 1-1 1h-3a1 1 0 0 1 0-2h2zM2 14v-2a1 1 0 0 0-2 0v3a1 1 0 0 0 1 1h3a1 1 0 0 0 0-2H2zM15.707.293A.997.997 0 0 1 16 1v3a1 1 0 0 1-2 0V2h-2a1 1 0 0 1 0-2h3c.276 0 .526.112.707.293zM2 2v2a1 1 0 1 1-2 0V1a.997.997 0 0 1 1-1h3a1 1 0 1 1 0 2H2zm4 4h4a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="screen-normal" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3 3V1a1 1 0 1 1 2 0v3a.997.997 0 0 1-1 1H1a1 1 0 1 1 0-2h2zm10 0h2a1 1 0 0 1 0 2h-3a.997.997 0 0 1-1-1V1a1 1 0 0 1 2 0v2zM3 13H1a1 1 0 0 1 0-2h3a.997.997 0 0 1 1 1v3a1 1 0 0 1-2 0v-2zm10 0v2a1 1 0 0 1-2 0v-3a.997.997 0 0 1 1-1h3a1 1 0 0 1 0 2h-2zM6.5 7h3a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5z"/></symbol><symbol viewBox="0 0 12 16" id="scroll_down" xmlns="http://www.w3.org/2000/svg"><path class="eofirst-triangle" d="M1.048 14.155a.508.508 0 0 0-.32.105c-.091.07-.136.154-.136.25v.71c0 .095.045.178.135.249.09.07.197.105.321.105h10.043a.51.51 0 0 0 .321-.105c.09-.07.136-.154.136-.25v-.71c0-.095-.045-.178-.136-.249a.508.508 0 0 0-.32-.105"/><path class="eosecond-triangle" d="M.687 8.027c-.09-.087-.122-.16-.093-.22.028-.06.104-.09.228-.09h10.5c.123 0 .2.03.228.09.029.06-.002.133-.093.22L6.393 12.91a.458.458 0 0 1-.136.089h-.37a.626.626 0 0 1-.136-.09"/><path class="eothird-triangle" d="M.687 1.027C.597.94.565.867.594.807c.028-.06.104-.09.228-.09h10.5c.123 0 .2.03.228.09.029.06-.002.133-.093.22L6.393 5.91a.458.458 0 0 1-.136.09h-.37a.626.626 0 0 1-.136-.09"/></symbol><symbol viewBox="0 0 12 16" id="scroll_up" xmlns="http://www.w3.org/2000/svg"><path d="M1.048 1.845a.508.508 0 0 1-.32-.105c-.091-.07-.136-.154-.136-.25V.78c0-.095.045-.178.135-.249a.508.508 0 0 1 .321-.105h10.043a.51.51 0 0 1 .321.105c.09.07.136.154.136.25v.71c0 .095-.045.178-.136.249a.508.508 0 0 1-.32.105M.687 7.973c-.09.087-.122.16-.093.22.028.06.104.09.228.09h10.5c.123 0 .2-.03.228-.09.029-.06-.002-.133-.093-.22L6.393 3.09A.458.458 0 0 0 6.257 3h-.37a.626.626 0 0 0-.136.09M.687 14.973c-.09.087-.122.16-.093.22.028.06.104.09.228.09h10.5c.123 0 .2-.03.228-.09.029-.06-.002-.133-.093-.22L6.393 10.09a.458.458 0 0 0-.136-.09h-.37a.626.626 0 0 0-.136.09"/></symbol><symbol viewBox="0 0 16 16" id="search" xmlns="http://www.w3.org/2000/svg"><path d="M8.853 8.854a3.5 3.5 0 1 0-4.95-4.95 3.5 3.5 0 0 0 4.95 4.95zm.207 2.328a5.5 5.5 0 1 1 2.121-2.121l3.329 3.328a1.5 1.5 0 0 1-2.121 2.121L9.06 11.182z"/></symbol><symbol viewBox="0 0 16 16" id="settings" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2.415 5.803L1.317 4.084A.5.5 0 0 1 1.35 3.5l.805-.994a.5.5 0 0 1 .564-.153l1.878.704a5.975 5.975 0 0 1 1.65-.797L6.885.342A.5.5 0 0 1 7.36 0h1.28a.5.5 0 0 1 .474.342l.639 1.918a5.97 5.97 0 0 1 1.65.797l1.877-.704a.5.5 0 0 1 .565.153l.805.994a.5.5 0 0 1 .032.584l-1.097 1.719c.217.551.354 1.143.399 1.76l1.731 1.058a.5.5 0 0 1 .227.54l-.288 1.246a.5.5 0 0 1-.44.385l-2.008.19a6.026 6.026 0 0 1-1.142 1.431l.265 1.995a.5.5 0 0 1-.277.516l-1.15.56a.5.5 0 0 1-.576-.1l-1.424-1.452a6.047 6.047 0 0 1-1.804 0l-1.425 1.453a.5.5 0 0 1-.576.1l-1.15-.561a.5.5 0 0 1-.276-.516l.265-1.995a6.026 6.026 0 0 1-1.143-1.43l-2.008-.191a.5.5 0 0 1-.44-.385L.058 9.16a.5.5 0 0 1 .226-.539l1.732-1.058a5.968 5.968 0 0 1 .399-1.76zM8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="shield" xmlns="http://www.w3.org/2000/svg"><path d="M4 0h8a3 3 0 0 1 3 3v7.186a3 3 0 0 1-1.426 2.554l-4 2.465a3 3 0 0 1-3.148 0l-4-2.465A3 3 0 0 1 1 10.186V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v7.186a1 1 0 0 0 .475.852l4 2.464a1 1 0 0 0 1.05 0l4-2.464a1 1 0 0 0 .475-.852V3a1 1 0 0 0-1-1H4zm0 1.5a.5.5 0 0 1 .5-.5h4v8.837a.5.5 0 0 1-.753.431l-3.5-2.052A.5.5 0 0 1 4 9.785V3.5z"/></symbol><symbol viewBox="0 0 16 16" id="slight-frown" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zm-2.163-3.275a2.499 2.499 0 0 1 4.343.03.5.5 0 0 1-.871.49 1.5 1.5 0 0 0-2.607-.018.5.5 0 1 1-.865-.502zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="slight-smile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-5.163 2.254a.5.5 0 1 1 .865-.502 1.499 1.499 0 0 0 2.607-.018.5.5 0 1 1 .871.49 2.499 2.499 0 0 1-4.343.03z"/></symbol><symbol viewBox="0 0 16 16" id="smile" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM6.18 6.27a.5.5 0 0 1-.873.487.5.5 0 0 0-.872-.003.5.5 0 1 1-.87-.495 1.5 1.5 0 0 1 2.616.012zm6 0a.5.5 0 1 1-.873.487.5.5 0 0 0-.872-.003.5.5 0 1 1-.87-.495 1.5 1.5 0 0 1 2.616.012zM5 9a3 3 0 0 0 6 0H5z"/></symbol><symbol viewBox="0 0 16 16" id="smiley" xmlns="http://www.w3.org/2000/svg"><path d="M8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12zM5 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm6 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zM5 9h6a3 3 0 0 1-6 0z"/></symbol><symbol viewBox="0 0 16 16" id="snippet" xmlns="http://www.w3.org/2000/svg"><path d="M10.67 9.31a3.001 3.001 0 0 1 2.062 5.546 3 3 0 0 1-3.771-4.559 1.007 1.007 0 0 1-.095-.137l-4.5-7.794a1 1 0 0 1 1.732-1l4.5 7.794c.028.05.052.1.071.15zm-3.283.35l-.289.5c-.028.05-.06.095-.095.137a3.001 3.001 0 0 1-3.77 4.56A3 3 0 0 1 5.294 9.31c.02-.051.043-.102.071-.15l.866-1.5 1.155 2zm2.31-4l-1.156-2 1.325-2.294a1 1 0 0 1 1.732 1L9.696 5.66zm-5.465 7.464a1 1 0 1 0 1-1.732 1 1 0 0 0-1 1.732zm7.5 0a1 1 0 1 0-1-1.732 1 1 0 0 0 1 1.732z"/></symbol><symbol viewBox="0 0 16 16" id="spam" xmlns="http://www.w3.org/2000/svg"><path d="M8.75.433l5.428 3.134a1.5 1.5 0 0 1 .75 1.299v6.268a1.5 1.5 0 0 1-.75 1.299L8.75 15.567a1.5 1.5 0 0 1-1.5 0l-5.428-3.134a1.5 1.5 0 0 1-.75-1.299V4.866a1.5 1.5 0 0 1 .75-1.299L7.25.433a1.5 1.5 0 0 1 1.5 0zM3.072 5.155v5.69L8 13.691l4.928-2.846v-5.69L8 2.309 3.072 5.155zM8 4a1 1 0 0 1 1 1v3a1 1 0 1 1-2 0V5a1 1 0 0 1 1-1zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 14 14" id="spinner" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><circle cx="7" cy="7" r="6" stroke="#000" stroke-opacity=".1" stroke-width="2"/><path fill="#000" fill-opacity=".1" fill-rule="nonzero" d="M7 0a7 7 0 0 1 7 7h-2a5 5 0 0 0-5-5V0z"/></g></symbol><symbol viewBox="0 0 16 16" id="star" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.609 14.394l-3.465 1.473a1 1 0 0 1-1.39-.989l.276-4.024a1 1 0 0 0-.219-.694L.303 7.037A1 1 0 0 1 .83 5.443l3.715-.964a1 1 0 0 0 .609-.457L7.14.682a1 1 0 0 1 1.72 0l1.985 3.34a1 1 0 0 0 .609.457l3.715.964a1 1 0 0 1 .528 1.594L13.19 10.16a1 1 0 0 0-.219.694l.275 4.024a1 1 0 0 1-1.389.989l-3.465-1.473a1 1 0 0 0-.782 0z"/></symbol><symbol viewBox="0 0 16 16" id="star-o" xmlns="http://www.w3.org/2000/svg"><path d="M10.975 10.99a3 3 0 0 1 .655-2.083l1.54-1.916-2.219-.576a3 3 0 0 1-1.825-1.37L8 3.15 6.874 5.044a3 3 0 0 1-1.825 1.371l-2.218.576 1.54 1.916a3 3 0 0 1 .654 2.083l-.165 2.4 1.965-.836a3 3 0 0 1 2.348 0l1.965.836-.164-2.399zM7.61 14.394l-3.465 1.473a1 1 0 0 1-1.39-.989l.276-4.024a1 1 0 0 0-.219-.694L.303 7.037A1 1 0 0 1 .83 5.443l3.715-.964a1 1 0 0 0 .609-.457L7.14.682a1 1 0 0 1 1.72 0l1.985 3.34a1 1 0 0 0 .609.457l3.715.964a1 1 0 0 1 .528 1.594L13.19 10.16a1 1 0 0 0-.219.694l.275 4.024a1 1 0 0 1-1.389.989l-3.465-1.473a1 1 0 0 0-.782 0z"/></symbol><symbol viewBox="0 0 14 14" id="status_canceled" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M5.2 3.8l4.9 4.9c.2.2.2.5 0 .7l-.7.7c-.2.2-.5.2-.7 0L3.8 5.2c-.2-.2-.2-.5 0-.7l.7-.7c.2-.2.5-.2.7 0"/></g></symbol><symbol viewBox="0 0 22 22" id="status_canceled_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M8.171 5.971l7.7 7.7a.76.76 0 0 1 0 1.1l-1.1 1.1a.76.76 0 0 1-1.1 0l-7.7-7.7a.76.76 0 0 1 0-1.1l1.1-1.1a.76.76 0 0 1 1.1 0"/></symbol><symbol viewBox="0 0 16 16" id="status_closed" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.83a1 1 0 0 1 1.414 1.416l-3.535 3.535a1 1 0 0 1-1.415.001l-2.12-2.12a1 1 0 1 1 1.413-1.415zM8 16A8 8 0 1 1 8 0a8 8 0 0 1 0 16zm0-2A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/></symbol><symbol viewBox="0 0 14 14" id="status_created" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><circle cx="7" cy="7" r="3.25"/></g></symbol><symbol viewBox="0 0 22 22" id="status_created_borderless" xmlns="http://www.w3.org/2000/svg"><circle cx="11" cy="11" r="5.107"/></symbol><symbol viewBox="0 0 14 14" id="status_failed" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M7 5.969L5.599 4.568a.29.29 0 0 0-.413.004l-.614.614a.294.294 0 0 0-.004.413L5.968 7l-1.4 1.401a.29.29 0 0 0 .004.413l.614.614c.113.114.3.117.413.004L7 8.032l1.401 1.4a.29.29 0 0 0 .413-.004l.614-.614a.294.294 0 0 0 .004-.413L8.032 7l1.4-1.401a.29.29 0 0 0-.004-.413l-.614-.614a.294.294 0 0 0-.413-.004L7 5.968z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_failed_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M11 9.38L8.798 7.178a.455.455 0 0 0-.65.006l-.964.965a.462.462 0 0 0-.006.65L9.38 11l-2.202 2.202a.455.455 0 0 0 .006.65l.965.964a.462.462 0 0 0 .65.006L11 12.62l2.202 2.202a.455.455 0 0 0 .65-.006l.964-.965a.462.462 0 0 0 .006-.65L12.62 11l2.202-2.202a.455.455 0 0 0-.006-.65l-.965-.964a.462.462 0 0 0-.65-.006L11 9.38z"/></symbol><symbol viewBox="0 0 14 14" id="status_manual" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M10.5 7.63V6.37l-.787-.13c-.044-.175-.132-.349-.263-.61l.481-.652-.918-.913-.657.478a2.346 2.346 0 0 0-.612-.26L7.656 3.5H6.388l-.132.783c-.219.043-.394.13-.612.26l-.657-.478-.918.913.437.652c-.131.218-.175.392-.262.61l-.744.086v1.261l.787.13c.044.218.132.392.263.61l-.438.651.92.913.655-.434c.175.086.394.173.613.26l.131.783h1.313l.131-.783c.219-.043.394-.13.613-.26l.656.478.918-.913-.48-.652c.13-.218.218-.435.262-.61l.656-.13zM7 8.283a1.285 1.285 0 0 1-1.313-1.305c0-.739.57-1.304 1.313-1.304.744 0 1.313.565 1.313 1.304 0 .74-.57 1.305-1.313 1.305z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_manual_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M16.5 11.99v-1.98l-1.238-.206c-.068-.273-.206-.546-.412-.956l.756-1.025-1.444-1.435-1.03.752a3.686 3.686 0 0 0-.963-.41L12.03 5.5h-1.994l-.206 1.23c-.343.068-.618.205-.962.41l-1.031-.752-1.444 1.435.687 1.025c-.206.341-.275.615-.412.956L5.5 9.941v1.981l1.237.205c.07.342.207.615.413.957l-.688 1.025 1.444 1.434 1.032-.683c.274.137.618.274.962.41l.206 1.23h2.063l.206-1.23c.344-.068.619-.205.963-.41l1.03.752 1.444-1.435-.756-1.025c.207-.341.344-.683.413-.956l1.031-.205zM11 13.017c-1.169 0-2.063-.889-2.063-2.05 0-1.162.894-2.05 2.063-2.05s2.063.888 2.063 2.05c0 1.161-.894 2.05-2.063 2.05z"/></symbol><symbol viewBox="0 0 22 22" id="status_notfound_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M12.822 11.29c.816-.581 1.421-1.348 1.683-2.322.603-2.243-.973-4.553-3.53-4.553-1.15 0-2.085.41-2.775 1.089-.42.413-.672.835-.8 1.167a1.179 1.179 0 0 0 2.2.847c.016-.043.1-.184.252-.334.264-.259.613-.412 1.123-.412.938 0 1.47.78 1.254 1.584-.105.39-.37.726-.773 1.012a3.25 3.25 0 0 1-.945.47 1.179 1.179 0 0 0-.874 1.138v2.234a1.179 1.179 0 1 0 2.358 0v-1.43a5.9 5.9 0 0 0 .827-.492z"/><ellipse cx="10.825" cy="16.711" rx="1.275" ry="1.322"/></symbol><symbol viewBox="0 0 14 14" id="status_open" xmlns="http://www.w3.org/2000/svg"><path d="M0 7c0-3.866 3.142-7 7-7 3.866 0 7 3.142 7 7 0 3.866-3.142 7-7 7-3.866 0-7-3.142-7-7z"/><path d="M1 7c0 3.309 2.69 6 6 6 3.309 0 6-2.69 6-6 0-3.309-2.69-6-6-6-3.309 0-6 2.69-6 6z" fill="#FFF"/><path d="M7 9.219a2.218 2.218 0 1 0 0-4.436A2.218 2.218 0 0 0 7 9.22zm0 1.12a3.338 3.338 0 1 1 0-6.676 3.338 3.338 0 0 1 0 6.676z"/></symbol><symbol viewBox="0 0 14 14" id="status_pending" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M4.7 5.3c0-.2.1-.3.3-.3h.9c.2 0 .3.1.3.3v3.4c0 .2-.1.3-.3.3H5c-.2 0-.3-.1-.3-.3V5.3m3 0c0-.2.1-.3.3-.3h.9c.2 0 .3.1.3.3v3.4c0 .2-.1.3-.3.3H8c-.2 0-.3-.1-.3-.3V5.3"/></g></symbol><symbol viewBox="0 0 22 22" id="status_pending_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M7.386 8.329c0-.315.157-.472.471-.472h1.414c.315 0 .472.157.472.472v5.342c0 .315-.157.472-.472.472H7.857c-.314 0-.471-.157-.471-.472V8.33m4.714 0c0-.315.157-.472.471-.472h1.415c.314 0 .471.157.471.472v5.342c0 .315-.157.472-.471.472H12.57c-.314 0-.471-.157-.471-.472V8.33"/></symbol><symbol viewBox="0 0 14 14" id="status_running" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M7 3c2.2 0 4 1.8 4 4s-1.8 4-4 4c-1.3 0-2.5-.7-3.3-1.7L7 7V3"/></g></symbol><symbol viewBox="0 0 22 22" id="status_running_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M11 4.714c3.457 0 6.286 2.829 6.286 6.286 0 3.457-2.829 6.286-6.286 6.286-2.043 0-3.929-1.1-5.186-2.672L11 11V4.714"/></symbol><symbol viewBox="0 0 14 14" id="status_skipped" xmlns="http://www.w3.org/2000/svg"><path d="M7 14A7 7 0 1 1 7 0a7 7 0 0 1 0 14z"/><path d="M7 13A6 6 0 1 0 7 1a6 6 0 0 0 0 12z" fill="#FFF"/><path d="M6.415 7.04L4.579 5.203a.295.295 0 0 1 .004-.416l.349-.349a.29.29 0 0 1 .416-.004l2.214 2.214a.289.289 0 0 1 .019.021l.132.133c.11.11.108.291 0 .398L5.341 9.573a.282.282 0 0 1-.398 0l-.331-.331a.285.285 0 0 1 0-.399L6.415 7.04zm2.54 0L7.119 5.203a.295.295 0 0 1 .004-.416l.349-.349a.29.29 0 0 1 .416-.004l2.214 2.214a.289.289 0 0 1 .019.021l.132.133c.11.11.108.291 0 .398L7.881 9.573a.282.282 0 0 1-.398 0l-.331-.331a.285.285 0 0 1 0-.399L8.955 7.04z"/></symbol><symbol viewBox="0 0 22 22" id="status_skipped_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M14.072 11.063l-2.82 2.82a.46.46 0 0 0-.001.652l.495.495a.457.457 0 0 0 .653-.001l3.7-3.7a.46.46 0 0 0 .001-.653l-.196-.196a.453.453 0 0 0-.03-.033l-3.479-3.479a.464.464 0 0 0-.654.007l-.548.548a.463.463 0 0 0-.007.654l2.886 2.886z"/><path d="M10.08 11.063l-2.819 2.82a.46.46 0 0 0-.002.652l.496.495a.457.457 0 0 0 .652-.001l3.7-3.7a.46.46 0 0 0 .002-.653l-.196-.196a.453.453 0 0 0-.03-.033l-3.48-3.479a.464.464 0 0 0-.653.007l-.548.548a.463.463 0 0 0-.007.654l2.886 2.886z"/></symbol><symbol viewBox="0 0 14 14" id="status_success" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M6.278 7.697L5.045 6.464a.296.296 0 0 0-.42-.002l-.613.614a.298.298 0 0 0 .002.42l1.91 1.909a.5.5 0 0 0 .703.005l.265-.265L9.997 6.04a.291.291 0 0 0-.009-.408l-.614-.614a.29.29 0 0 0-.408-.009L6.278 7.697z"/></g></symbol><symbol viewBox="0 0 22 22" id="status_success_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M9.866 12.095l-1.95-1.95a.462.462 0 0 0-.647.01l-.964.964a.46.46 0 0 0-.01.646l3.013 3.014a.787.787 0 0 0 1.106.008l.425-.425 4.854-4.853a.462.462 0 0 0 .002-.659l-.964-.964a.468.468 0 0 0-.658.002l-4.207 4.207z"/></symbol><symbol viewBox="0 0 14 14" id="status_success_solid" xmlns="http://www.w3.org/2000/svg"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7zm6.278.697L5.045 6.464a.296.296 0 0 0-.42-.002l-.613.614a.298.298 0 0 0 .002.42l1.91 1.909a.5.5 0 0 0 .703.005l.265-.265L9.997 6.04a.291.291 0 0 0-.009-.408l-.614-.614a.29.29 0 0 0-.408-.009L6.278 7.697z" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 14 14" id="status_warning" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="M0 7a7 7 0 1 1 14 0A7 7 0 0 1 0 7z"/><path d="M13 7A6 6 0 1 0 1 7a6 6 0 0 0 12 0z" fill="#FFF"/><path d="M6 3.5c0-.3.2-.5.5-.5h1c.3 0 .5.2.5.5v4c0 .3-.2.5-.5.5h-1c-.3 0-.5-.2-.5-.5v-4m0 6c0-.3.2-.5.5-.5h1c.3 0 .5.2.5.5v1c0 .3-.2.5-.5.5h-1c-.3 0-.5-.2-.5-.5v-1"/></g></symbol><symbol viewBox="0 0 22 22" id="status_warning_borderless" xmlns="http://www.w3.org/2000/svg"><path d="M9.429 5.5c0-.471.314-.786.785-.786h1.572c.471 0 .785.315.785.786v6.286c0 .471-.314.785-.785.785h-1.572c-.471 0-.785-.314-.785-.785V5.5m0 9.429c0-.472.314-.786.785-.786h1.572c.471 0 .785.314.785.786V16.5c0 .471-.314.786-.785.786h-1.572c-.471 0-.785-.315-.785-.786v-1.571"/></symbol><symbol viewBox="0 0 16 16" id="stop" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M2 0h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2z"/></symbol><symbol viewBox="0 0 16 16" id="task-done" xmlns="http://www.w3.org/2000/svg"><path d="M7.536 8.657l2.828-2.829a1 1 0 0 1 1.414 1.415l-3.535 3.535a.997.997 0 0 1-1.415 0l-2.12-2.121A1 1 0 0 1 6.12 7.243l1.415 1.414zM3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3z"/></symbol><symbol viewBox="0 0 16 16" id="template" xmlns="http://www.w3.org/2000/svg"><path d="M3 0h10a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V3a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3zm.8 2h2.4a.8.8 0 0 1 .8.8v1.4a.8.8 0 0 1-.8.8H3.8a.8.8 0 0 1-.8-.8V4.8a.8.8 0 0 1 .8-.8zm4.7 0h4a.5.5 0 1 1 0 1h-4a.5.5 0 0 1 0-1zm0 2h4a.5.5 0 1 1 0 1h-4a.5.5 0 0 1 0-1zm-5 3h9a.5.5 0 1 1 0 1h-9a.5.5 0 0 1 0-1zm0 2h9a.5.5 0 1 1 0 1h-9a.5.5 0 1 1 0-1z"/></symbol><symbol viewBox="0 0 16 16" id="terminal" xmlns="http://www.w3.org/2000/svg"><path d="M7 8a.997.997 0 0 1-.293.707l-1.414 1.414a1 1 0 1 1-1.414-1.414L4.586 8l-.707-.707a1 1 0 1 1 1.414-1.414l1.414 1.414A.997.997 0 0 1 7 8zM4 0h8a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H4a4 4 0 0 1-4-4V4a4 4 0 0 1 4-4zm0 2a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H4zm5 7h2a1 1 0 0 1 0 2H9a1 1 0 0 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="thumb-down" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.33 11h5.282a2 2 0 0 0 1.963-2.38l-.563-2.905a3 3 0 0 0-.243-.732l-1.103-2.286A3 3 0 0 0 10.964 1H7a3 3 0 0 0-3 3v6.3a2 2 0 0 0 .436 1.247l3.11 3.9a.632.632 0 0 0 .941.053l.137-.137a1 1 0 0 0 .28-.87L8.329 11zM1 10h2V3H1a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1z"/></symbol><symbol viewBox="0 0 16 16" id="thumb-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.33 5h5.282a2 2 0 0 1 1.963 2.38l-.563 2.905a3 3 0 0 1-.243.732l-1.103 2.286A3 3 0 0 1 10.964 15H7a3 3 0 0 1-3-3V5.7a2 2 0 0 1 .436-1.247l3.11-3.9A.632.632 0 0 1 8.487.5l.137.137a1 1 0 0 1 .28.87L8.329 5zM1 6h2v7H1a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1z"/></symbol><symbol viewBox="0 0 16 16" id="thumbtack" xmlns="http://www.w3.org/2000/svg"><path d="M7.125 9h-2.19a.5.5 0 0 1-.417-.777L6 6V2L5.362.724A.5.5 0 0 1 5.809 0h4.382a.5.5 0 0 1 .447.724L10 2v4l1.482 2.223a.5.5 0 0 1-.416.777H8.875L8 16l-.875-7z" fill-rule="evenodd"/></symbol><symbol viewBox="0 0 16 16" id="timer" xmlns="http://www.w3.org/2000/svg"><path d="M12.022 3.27l.77-.77a1 1 0 0 1 1.415 1.414l-.728.729a7 7 0 1 1-1.456-1.372zM8 14A5 5 0 1 0 8 4a5 5 0 0 0 0 10zm0-9a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V6a1 1 0 0 1 1-1zM6 0h4a1 1 0 0 1 0 2H6a1 1 0 1 1 0-2z"/></symbol><symbol viewBox="0 0 16 16" id="todo-add" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 4V2a1 1 0 0 1 2 0v2h2a1 1 0 0 1 0 2h-2v2a1 1 0 0 1-2 0V6H8a1 1 0 1 1 0-2h2zm2 7a1 1 0 0 1 2 0v2a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h2a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2z"/></symbol><symbol viewBox="0 0 16 16" id="todo-done" xmlns="http://www.w3.org/2000/svg"><path d="M8.243 7.485l4.95-4.95a1 1 0 1 1 1.414 1.415L8.95 9.607a.997.997 0 0 1-1.414 0L4.707 6.778a1 1 0 0 1 1.414-1.414l2.122 2.121zM12 11a1 1 0 0 1 2 0v2a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3h2a1 1 0 1 1 0 2H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-2z"/></symbol><symbol viewBox="0 0 16 16" id="token" xmlns="http://www.w3.org/2000/svg"><path d="M3 2h10a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V5a3 3 0 0 1 3-3zm0 2a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H3zm1 5a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4 0a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="unapproval" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11.95 8.536l1.06-1.061a1 1 0 0 1 1.415 1.414l-1.061 1.06 1.06 1.061a1 1 0 0 1-1.414 1.415l-1.06-1.061-1.06 1.06a1 1 0 1 1-1.415-1.414l1.06-1.06-1.06-1.06a1 1 0 0 1 1.414-1.415l1.06 1.06zm-3.768-.33c.006.503.201 1.006.586 1.39l.353.354-.353.353a2 2 0 1 0 2.828 2.829l.354-.354.047.048C11.964 14.363 11.527 15 6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8c.834 0 1.557.074 2.182.205zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/></symbol><symbol viewBox="0 0 16 16" id="unassignee" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M11 5h4a1 1 0 0 1 0 2h-4a1 1 0 0 1 0-2zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="unlink" xmlns="http://www.w3.org/2000/svg"><path d="M11.295 8.845l-.659-1.664a1.78 1.78 0 0 0 .04-.04l1.415-1.414c.586-.586.654-1.468.152-1.97s-1.384-.434-1.97.152L8.859 5.323a1.781 1.781 0 0 0-.04.04l-1.664-.658c.141-.208.305-.408.491-.594l1.415-1.414c1.366-1.367 3.424-1.525 4.596-.354 1.171 1.172 1.013 3.23-.354 4.596L11.89 8.354c-.186.186-.386.35-.594.491zm-2.45 2.45a4.075 4.075 0 0 1-.491.594l-1.415 1.414c-1.366 1.367-3.424 1.525-4.596.354-1.171-1.172-1.013-3.23.354-4.596L4.11 7.646c.186-.186.386-.35.594-.491l.659 1.664a1.781 1.781 0 0 0-.04.04l-1.415 1.414c-.586.586-.654 1.468-.152 1.97s1.384.434 1.97-.152l1.414-1.414a1.78 1.78 0 0 0 .04-.04l1.664.658zm3.812-2.088h2a.5.5 0 0 1 .5.5v.05a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1-.5-.5v-.05a.5.5 0 0 1 .5-.5zm-.384 2.116l1.415 1.414a.5.5 0 0 1 0 .708l-.037.036a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 0-.707l.036-.037a.5.5 0 0 1 .707 0zm-2.823 1.09a.5.5 0 0 1 .5-.5h.052a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.5.5H9.95a.5.5 0 0 1-.5-.5v-2zm-2.748-9.16a.5.5 0 0 1-.5.5h-.05a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 .5-.5h.05a.5.5 0 0 1 .5.5v2zm-2.116.383a.5.5 0 0 1 0 .707l-.036.036a.5.5 0 0 1-.707 0L2.428 2.965a.5.5 0 0 1 0-.707l.037-.036a.5.5 0 0 1 .707 0l1.414 1.414zm-1.09 2.823h-2a.5.5 0 0 1-.5-.5v-.051a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5v.05a.5.5 0 0 1-.5.5z"/></symbol><symbol viewBox="0 0 16 16" id="user" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 8c-6.888 0-6.976-.78-6.976-2.52S2.144 8 8 8s6.976 2.692 6.976 4.48c0 1.788-.088 2.52-6.976 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="users" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10.521 8.01C15.103 8.19 16 10.755 16 12.48c0 1.533-.056 2.29-3.808 2.475.609-.54.808-1.331.808-2.475 0-1.911-.804-3.503-2.479-4.47zm-1.67-1.228A3.987 3.987 0 0 0 9.976 4a3.987 3.987 0 0 0-1.125-2.782 3 3 0 1 1 0 5.563zM5.976 7a3 3 0 1 1 0-6 3 3 0 0 1 0 6zM6 15c-5.924 0-6-.78-6-2.52S.964 8 6 8s6 2.692 6 4.48c0 1.788-.076 2.52-6 2.52z"/></symbol><symbol viewBox="0 0 16 16" id="volume-up" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1 5h1v6H1a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zm2 0l4.445-2.964A1 1 0 0 1 9 2.87v10.26a1 1 0 0 1-1.555.833L3 11V5zm10.283 7.89a.5.5 0 0 1-.66-.752A5.485 5.485 0 0 0 14.5 8c0-1.601-.687-3.09-1.865-4.128a.5.5 0 0 1 .661-.75A6.484 6.484 0 0 1 15.5 8a6.485 6.485 0 0 1-2.217 4.89zm-2.002-2.236a.5.5 0 1 1-.652-.758c.55-.472.871-1.157.871-1.896 0-.732-.315-1.411-.856-1.883a.5.5 0 0 1 .658-.753A3.492 3.492 0 0 1 12.5 8c0 1.033-.45 1.994-1.219 2.654z"/></symbol><symbol viewBox="0 0 16 16" id="warning" xmlns="http://www.w3.org/2000/svg"><path d="M15.34 10.479A3 3 0 0 1 12.756 15h-9.51A3 3 0 0 1 .66 10.479l4.755-8.083a3 3 0 0 1 5.172 0l4.755 8.083zm-6.478-7.07a1 1 0 0 0-1.724 0l-4.755 8.084A1 1 0 0 0 3.245 13h9.51a1 1 0 0 0 .862-1.507L8.862 3.41zM8 5a1 1 0 0 1 1 1v2a1 1 0 1 1-2 0V6a1 1 0 0 1 1-1zm0 7a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/></symbol><symbol viewBox="0 0 16 16" id="work" xmlns="http://www.w3.org/2000/svg"><path d="M12 3h1a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3H3a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3h1V2a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v1zM6 2v1h4V2H6zM3 5a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H3zm1.5 1a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5zm7 0a.5.5 0 0 1 .5.5v6a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .5-.5z"/></symbol></svg>
\ No newline at end of file diff --git a/app/assets/images/illustrations/epics.svg b/app/assets/images/illustrations/epics.svg new file mode 100644 index 00000000000..1a37e6bba5f --- /dev/null +++ b/app/assets/images/illustrations/epics.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="430" height="300" viewBox="0 0 430 300"><g fill="none" fill-rule="evenodd"><g transform="translate(75 53)"><rect width="284" height="208" y="5" fill="#F9F9F9" rx="10"/><rect width="284" height="208" fill="#FFF" rx="10"/><path fill="#EEE" fill-rule="nonzero" d="M10 4a6 6 0 0 0-6 6v188a6 6 0 0 0 6 6h264a6 6 0 0 0 6-6V10a6 6 0 0 0-6-6H10zm0-4h264c5.523 0 10 4.477 10 10v188c0 5.523-4.477 10-10 10H10c-5.523 0-10-4.477-10-10V10C0 4.477 4.477 0 10 0z"/><path fill="#EEE" fill-rule="nonzero" d="M25.168 153.995c3.837-.215 7.173.028 10.119.691a3 3 0 1 0 1.318-5.853c-3.509-.79-7.4-1.074-11.773-.828a3 3 0 1 0 .336 5.99zm19.043 4.66c2.401 1.704 4.388 3.61 7.569 7.083a3 3 0 0 0 4.424-4.054c-3.448-3.763-5.686-5.911-8.522-7.923a3 3 0 1 0-3.471 4.894zm15.575 15.173c3.181 2.675 6.52 4.665 10.397 6.039a3 3 0 0 0 2.004-5.655c-3.162-1.121-5.884-2.743-8.54-4.976a3 3 0 1 0-3.861 4.592zm22.133 8.148c1.02.037 2.067.045 3.143.023a72.664 72.664 0 0 0 8.346-.638 3 3 0 1 0-.812-5.945c-2.442.334-4.996.53-7.658.585a48.55 48.55 0 0 1-2.796-.021 3 3 0 0 0-.223 5.996zm22.778-3.286c3.9-1.37 7.427-3.15 10.54-5.305a3 3 0 0 0-3.415-4.933c-2.665 1.845-5.712 3.382-9.114 4.578a3 3 0 0 0 1.989 5.66zm19.156-13.62a33.752 33.752 0 0 0 5.276-10.817 3 3 0 1 0-5.773-1.633 27.753 27.753 0 0 1-4.341 8.9 3 3 0 1 0 4.838 3.55zm6.577-22.657c-.187-3.817-.926-7.71-2.204-11.596a3 3 0 0 0-5.7 1.874c1.113 3.384 1.75 6.745 1.91 10.016a3 3 0 1 0 5.994-.294zm-7.097-22.26c-1.897-3.2-4.152-6.325-6.748-9.344a3 3 0 0 0-4.55 3.913c2.372 2.756 4.421 5.597 6.136 8.49a3 3 0 0 0 5.162-3.06zm-11.546-17.793c-.938-3.025-1.402-6.42-1.365-9.976a3 3 0 0 0-6-.063c-.043 4.163.506 8.177 1.634 11.816a3 3 0 1 0 5.731-1.777zm.053-20.107c.905-3.341 2.22-6.538 3.904-9.448a3 3 0 0 0-5.194-3.004c-1.948 3.368-3.463 7.048-4.501 10.884a3 3 0 1 0 5.791 1.568zm10.134-17.305c2.475-2.28 5.265-4.09 8.335-5.374a3 3 0 1 0-2.314-5.536c-3.725 1.558-7.105 3.75-10.086 6.497a3 3 0 1 0 4.065 4.413zm18.177-7.586c3.202-.18 6.599.092 10.18.843a3 3 0 0 0 1.23-5.872c-4.086-.857-8.009-1.172-11.747-.962a3 3 0 1 0 .337 5.99zm20.047 3.95c3.068 1.268 6.232 2.842 9.487 4.728a3 3 0 0 0 3.009-5.191c-3.48-2.017-6.883-3.71-10.204-5.083a3 3 0 1 0-2.292 5.545zm19.578 9.955c3.711 1.586 7.376 2.77 10.997 3.565a3 3 0 0 0 1.286-5.86c-3.248-.713-6.555-1.782-9.925-3.222a3 3 0 1 0-2.358 5.517zm22.591 4.789c3.94-.04 7.808-.553 11.61-1.513a3 3 0 1 0-1.468-5.817 43.358 43.358 0 0 1-10.203 1.33 3 3 0 0 0 .061 6zm22.52-5.558c3.335-1.637 6.607-3.613 9.845-5.916a3 3 0 1 0-3.477-4.89c-2.984 2.122-5.98 3.931-9.011 5.42a3 3 0 1 0 2.643 5.386zm18.678-13.054a3 3 0 0 1-4.02-4.454 130.547 130.547 0 0 0 5.31-5.088 3 3 0 1 1 4.265 4.22 136.507 136.507 0 0 1-5.555 5.322zm-48.722 25.641a3 3 0 1 1 4.314-4.17c3.056 3.16 5.075 6.744 6.172 10.754a3 3 0 0 1-5.787 1.584c-.834-3.047-2.35-5.739-4.699-8.168zm5.347 18.049a3 3 0 1 1 5.978.52c-.282 3.232-.805 6.273-1.832 11.206a3 3 0 0 1-5.874-1.222c.981-4.717 1.473-7.572 1.728-10.504zm-3.777 21.555a3 3 0 0 1 5.953.747c-.5 3.988-.397 7.09.399 9.67a3 3 0 1 1-5.733 1.769c-1.087-3.52-1.217-7.426-.62-12.186zm7.393 22.444a3 3 0 0 1 4.461-4.013c2.703 3.005 5.224 5.296 7.594 6.947a3 3 0 0 1-3.429 4.924c-2.775-1.932-5.632-4.53-8.626-7.858zm20.352 12.28a3 3 0 1 1 .334-5.99c2.77.154 5.453-.554 9.224-2.254a3 3 0 0 1 2.466 5.47c-4.57 2.06-8.103 2.993-12.024 2.775zm21.784-7.058a3 3 0 0 1-1.815-5.719c4.227-1.342 8.24-1.61 12.496-.572a3 3 0 0 1-1.421 5.83c-3.116-.76-6.025-.566-9.26.46zM106.53 56.038a3 3 0 1 1-3.45 4.909c-1.074-.755-6.723-6.044-8.083-7.204a68.019 68.019 0 0 0-.332-.281 3 3 0 1 1 3.865-4.59l.362.306c1.643 1.402 6.971 6.391 7.638 6.86zM88.536 42.422a3 3 0 0 1-2.285 5.548c-3.14-1.293-5.78-1.34-8.105-.05a3 3 0 0 1-2.91-5.247c4.087-2.266 8.597-2.187 13.3-.25zM66.698 48.73a3 3 0 0 1 2.029 5.647c-4.432 1.592-8.786.835-13.166-1.88a3 3 0 1 1 3.16-5.1c2.93 1.816 5.425 2.25 7.977 1.333zm-15.636-8.038a3 3 0 0 1-4.352 4.13c-.911-.96-1.85-1.98-3.061-3.32-.295-.325-2.437-2.703-3.07-3.4-.47-.518-.9-.988-1.313-1.436a3 3 0 0 1 4.41-4.068c.425.46.866.942 1.346 1.47.642.709 2.79 3.092 3.076 3.41a180.865 180.865 0 0 0 2.964 3.214z"/><path fill="#E1DBF1" d="M254.66 72.196l2-3.464a2 2 0 1 0-3.464-2l-2 3.464-3.464-2a2 2 0 0 0-2 3.464l3.464 2-2 3.464a2 2 0 0 0 3.464 2l2-3.464 3.464 2a2 2 0 1 0 2-3.464l-3.464-2zm-151.904 78.732l2.829-2.828a2 2 0 0 0-2.829-2.829l-2.828 2.829-2.828-2.829a2 2 0 0 0-2.829 2.829l2.829 2.828-2.829 2.829a2 2 0 1 0 2.829 2.828l2.828-2.828 2.828 2.828a2 2 0 1 0 2.829-2.828l-2.829-2.829z"/><path fill="#6B4FBB" d="M210.66 173.66l3.464-2a2 2 0 1 0-2-3.464l-3.464 2-2-3.464a2 2 0 0 0-3.464 2l2 3.464-3.464 2a2 2 0 1 0 2 3.464l3.464-2 2 3.464a2 2 0 1 0 3.464-2l-2-3.464z"/><path fill="#FDC4A8" fill-rule="nonzero" d="M27 181a8 8 0 1 1 0-16 8 8 0 0 1 0 16zm0-4a4 4 0 1 0 0-8 4 4 0 0 0 0 8z"/><path fill="#C3B8E3" fill-rule="nonzero" d="M138 85a7 7 0 1 1 0-14 7 7 0 0 1 0 14zm0-4a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/><path fill="#6B4FBB" fill-rule="nonzero" d="M200 57a7 7 0 1 1 0-14 7 7 0 0 1 0 14zm0-4a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/><path fill="#FC6D26" fill-rule="nonzero" d="M222.647 121.647v5h5v-5h-5zm0-4h5a4 4 0 0 1 4 4v5a4 4 0 0 1-4 4h-5a4 4 0 0 1-4-4v-5a4 4 0 0 1 4-4z"/><path fill="#FEE1D3" fill-rule="nonzero" d="M103.647 28.647v5h5v-5h-5zm0-4h5a4 4 0 0 1 4 4v5a4 4 0 0 1-4 4h-5a4 4 0 0 1-4-4v-5a4 4 0 0 1 4-4z"/><path fill="#FC6D26" fill-rule="nonzero" d="M85 103.488L81.841 108h6.318L85 103.488zm6.436 2.218A4 4 0 0 1 88.159 112H81.84a4 4 0 0 1-3.277-6.294l3.16-4.512a4 4 0 0 1 6.553 0l3.159 4.512z"/></g><path fill="#F9F9F9" d="M334.376 99.43A48.805 48.805 0 0 0 366 111c27.062 0 49-21.938 49-49s-21.938-49-49-49-49 21.938-49 49c0 9.454 2.677 18.283 7.315 25.77l-3.05 11.306a2.5 2.5 0 0 0 3.064 3.065l10.047-2.71z"/><path fill="#FFF" d="M339.376 94.43A48.805 48.805 0 0 0 371 106c27.062 0 49-21.938 49-49S398.062 8 371 8s-49 21.938-49 49c0 9.454 2.677 18.283 7.315 25.77l-3.05 11.306a2.5 2.5 0 0 0 3.064 3.065l10.047-2.71z"/><path fill="#EEE" fill-rule="nonzero" d="M329.85 99.072a4.5 4.5 0 0 1-5.516-5.517l2.827-10.48C322.501 75.258 320 66.31 320 57c0-28.167 22.833-51 51-51s51 22.833 51 51-22.833 51-51 51c-11.859 0-23.096-4.064-32.102-11.37l-9.048 2.442zm10.817-6.169C349.091 100.027 359.737 104 371 104c25.957 0 47-21.043 47-47s-21.043-47-47-47-47 21.043-47 47c0 8.859 2.453 17.351 7.016 24.716l.456.737-3.277 12.144c.072.527.347.685.613.613l11.059-2.984.8.677z"/><g transform="translate(354 34)"><path fill="#E1DBF1" fill-rule="nonzero" d="M13 4a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1h-8zm0-4h8a5 5 0 0 1 5 5v1a5 5 0 0 1-5 5h-8a5 5 0 0 1-5-5V5a5 5 0 0 1 5-5z"/><path fill="#6B4FBB" fill-rule="nonzero" d="M5 11a1 1 0 0 0 0 2h24a1 1 0 0 0 0-2H5zm0-4h24a5 5 0 0 1 0 10H5A5 5 0 0 1 5 7z"/><rect width="12" height="4" x="11" y="31" fill="#C3B8E3" rx="2"/><rect width="12" height="4" x="11" y="19" fill="#C3B8E3" rx="2"/><rect width="12" height="4" x="11" y="37" fill="#E1DBF1" rx="2"/><rect width="12" height="4" x="11" y="43" fill="#C3B8E3" rx="2"/><rect width="12" height="4" x="11" y="25" fill="#E1DBF1" rx="2"/></g><path fill="#F9F9F9" d="M344.238 225.072A38.83 38.83 0 0 1 368 217c21.54 0 39 17.46 39 39s-17.46 39-39 39-39-17.46-39-39a38.84 38.84 0 0 1 4.001-17.227l-3.737-13.85a2.5 2.5 0 0 1 3.065-3.064l11.91 3.213z"/><path fill="#FFF" d="M348.238 221.072A38.83 38.83 0 0 1 372 213c21.54 0 39 17.46 39 39s-17.46 39-39 39-39-17.46-39-39a38.84 38.84 0 0 1 4.001-17.227l-3.737-13.85a2.5 2.5 0 0 1 3.065-3.064l11.91 3.213z"/><path fill="#EEE" fill-rule="nonzero" d="M336.85 215.928a4.5 4.5 0 0 0-5.516 5.517l3.543 13.13A40.848 40.848 0 0 0 331 252c0 22.644 18.356 41 41 41s41-18.356 41-41-18.356-41-41-41a40.82 40.82 0 0 0-24.182 7.887l-10.968-2.96zm12.608 6.73A36.824 36.824 0 0 1 372 215c20.435 0 37 16.565 37 37s-16.565 37-37 37-37-16.565-37-37c0-5.747 1.31-11.304 3.795-16.343l.334-.677-3.934-14.577a.5.5 0 0 1 .613-.613l12.865 3.471.785-.604z"/><path fill="#FEE1D3" fill-rule="nonzero" d="M356.097 255.962a7 7 0 0 0 8.81 10.88l1.093-.885v1.454a7 7 0 1 0 14 0v-1.454l1.092.885a7 7 0 1 0 8.81-10.88l-1.185-.96 1.455-.337a7 7 0 1 0-3.15-13.64l-1.4.323.623-1.278a7 7 0 0 0-12.583-6.137l-.662 1.356-.662-1.356a7 7 0 0 0-12.583 6.137l.623 1.278-1.4-.324a7 7 0 1 0-3.15 13.641l1.455.336-1.186.96zm5.464-.913a11.914 11.914 0 0 1-.444-1.95l-.19-1.362-4.2-.97a3 3 0 0 1 1.35-5.845l4.178.964.768-1.145c.373-.557.793-1.082 1.254-1.57l.95-1.006-1.877-3.849a3 3 0 0 1 5.393-2.63l1.892 3.879 1.363-.113a12.188 12.188 0 0 1 2.004 0l1.363.113 1.892-3.879a3 3 0 0 1 5.393 2.63l-1.877 3.849.95 1.006c.461.488.88 1.013 1.254 1.57l.768 1.145 4.178-.964a3 3 0 1 1 1.35 5.846l-4.2.97-.19 1.36a11.914 11.914 0 0 1-.444 1.95l-.413 1.302 3.36 2.72a3 3 0 1 1-3.776 4.663l-3.32-2.688-1.196.706a11.94 11.94 0 0 1-1.808.873l-1.286.492v4.295a3 3 0 1 1-6 0v-4.295l-1.286-.492a11.94 11.94 0 0 1-1.808-.873l-1.196-.706-3.32 2.688a3 3 0 1 1-3.776-4.663l3.36-2.72-.413-1.301z"/><path fill="#FC6D26" fill-rule="nonzero" d="M373 245.411a6 6 0 1 0 0 12 6 6 0 0 0 0-12zm0 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4z"/><g><path fill="#F9F9F9" d="M94.624 162.43A48.805 48.805 0 0 1 63 174c-27.062 0-49-21.938-49-49s21.938-49 49-49 49 21.938 49 49c0 9.454-2.677 18.283-7.315 25.77l3.05 11.306a2.5 2.5 0 0 1-3.064 3.065l-10.047-2.71z"/><path fill="#FFF" stroke="#EEE" stroke-width="4" d="M89.624 157.43A48.805 48.805 0 0 1 58 169c-27.062 0-49-21.938-49-49s21.938-49 49-49 49 21.938 49 49c0 9.454-2.677 18.283-7.315 25.77l3.05 11.306a2.5 2.5 0 0 1-3.064 3.065l-10.047-2.71z"/><path fill="#EEE" fill-rule="nonzero" d="M99.15 162.072a4.5 4.5 0 0 0 5.516-5.517l-2.827-10.48C106.499 138.258 109 129.31 109 120c0-28.167-22.833-51-51-51S7 91.833 7 120s22.833 51 51 51c11.859 0 23.096-4.064 32.102-11.37l9.048 2.442zm-10.817-6.169C79.909 163.027 69.263 167 58 167c-25.957 0-47-21.043-47-47s21.043-47 47-47 47 21.043 47 47c0 8.859-2.453 17.351-7.016 24.716l-.456.737 3.277 12.144c-.072.527-.347.685-.613.613l-11.059-2.984-.8.677z"/><g fill-rule="nonzero"><path fill="#FEE1D3" d="M55.47 94.47l-16.148 6.688a4 4 0 0 0-2.164 2.164l-6.689 16.147a4 4 0 0 0 0 3.062l6.689 16.147a4 4 0 0 0 2.164 2.164l16.147 6.689a4 4 0 0 0 3.062 0l16.147-6.689a4 4 0 0 0 2.164-2.164l6.689-16.147a4 4 0 0 0 0-3.062l-6.689-16.147a4 4 0 0 0-2.164-2.164L58.53 94.469a4 4 0 0 0-3.062 0zM57 98.164l16.147 6.688L79.835 121l-6.688 16.147L57 143.835l-16.147-6.688L34.165 121l6.688-16.147L57 98.165zM57 107a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm12 4a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm4 12a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm-4 11a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm-12 6a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm-12-6a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm-4-11a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm4-11a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm12 20c6.075 0 11-4.925 11-11s-4.925-11-11-11-11 4.925-11 11 4.925 11 11 11zm0-4a7 7 0 1 1 0-14 7 7 0 0 1 0 14z"/><path fill="#FC6D26" d="M57 126.5a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zm0-3a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z"/></g></g></g></svg>
\ No newline at end of file diff --git a/app/assets/images/illustrations/gitlab_logo.svg b/app/assets/images/illustrations/gitlab_logo.svg new file mode 100644 index 00000000000..8dbd75a340e --- /dev/null +++ b/app/assets/images/illustrations/gitlab_logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="492.509" height="453.68" viewBox="0 0 492.50943 453.67966"><g fill="none" fill-rule="evenodd"><path d="M491.589 259.398l-27.559-84.814L409.413 6.486c-2.81-8.648-15.045-8.648-17.856 0l-54.619 168.098H155.572L100.952 6.486c-2.81-8.648-15.046-8.648-17.856 0L28.478 174.584.921 259.398a18.775 18.775 0 0 0 6.82 20.992l238.513 173.29L484.77 280.39a18.777 18.777 0 0 0 6.82-20.992" fill="#fc6d26"/><path d="M246.255 453.68l90.684-279.096H155.57z" fill="#e24329"/><path d="M246.255 453.68L155.57 174.583H28.479z" fill="#fc6d26"/><path d="M28.479 174.584L.92 259.4a18.773 18.773 0 0 0 6.821 20.99l238.514 173.29z" fill="#fca326"/><path d="M28.479 174.584H155.57L100.952 6.487c-2.81-8.65-15.047-8.65-17.856 0z" fill="#e24329"/><path d="M246.255 453.68l90.684-279.096H464.03z" fill="#fc6d26"/><path d="M464.03 174.584l27.56 84.815a18.773 18.773 0 0 1-6.822 20.99L246.255 453.68z" fill="#fca326"/><path d="M464.03 174.584H336.94L391.557 6.487c2.811-8.65 15.047-8.65 17.856 0z" fill="#e24329"/></g></svg>
\ No newline at end of file diff --git a/app/assets/images/illustrations/pipelines_pending.svg b/app/assets/images/illustrations/pipelines_pending.svg new file mode 100644 index 00000000000..25038366e92 --- /dev/null +++ b/app/assets/images/illustrations/pipelines_pending.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="430" height="220" viewBox="0 0 430 220"><g fill="none" fill-rule="evenodd"><path fill="#EEE" fill-rule="nonzero" d="M189.8 182l2.4-12H114c-5.523 0-10-4.477-10-10V34c0-5.523 4.477-10 10-10h200c5.523 0 10 4.477 10 10v126c0 5.523-4.477 10-10 10h-78.2l2.4 12h22.52a9.651 9.651 0 0 1 9.28 7 5.491 5.491 0 0 1-5.28 7H164.159a5.787 5.787 0 0 1-5.659-7 8.855 8.855 0 0 1 8.659-7H189.8zM114 28a6 6 0 0 0-6 6v126a6 6 0 0 0 6 6h200a6 6 0 0 0 6-6V34a6 6 0 0 0-6-6H114zm5 6h190a5 5 0 0 1 5 5v116a5 5 0 0 1-5 5H119a5 5 0 0 1-5-5V39a5 5 0 0 1 5-5zm0 4a1 1 0 0 0-1 1v116a1 1 0 0 0 1 1h190a1 1 0 0 0 1-1V39a1 1 0 0 0-1-1H119zm112.72 132h-35.44l-2.4 12h40.24l-2.4-12zm-64.561 16c-2.29 0-4.268 1.6-4.748 3.838A1.787 1.787 0 0 0 164.16 192h100.56a1.491 1.491 0 0 0 1.435-1.901A5.651 5.651 0 0 0 260.72 186h-93.561z"/><path fill="#FEF0E8" d="M177.965 99H194a2 2 0 1 1 0 4h-16.322c-1.374 6.29-6.976 11-13.678 11-6.702 0-12.304-4.71-13.678-11h-3.365l-7.395 9.249a2 2 0 0 1-3.049.089L128.11 103h-5.844a2 2 0 1 1 0-4H129a2 2 0 0 1 1.487.662l7.423 8.248 6.523-8.159a2 2 0 0 1 1.562-.751h4.04c.513-7.265 6.57-13 13.965-13 7.396 0 13.452 5.735 13.965 13zM164 110c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10z"/><path fill="#EFEDF8" d="M273.847 103c-.962 6.23-6.347 11-12.847 11-6.5 0-11.885-4.77-12.847-11H232a2 2 0 0 1 0-4h16.153c.962-6.23 6.347-11 12.847-11 6.5 0 11.885 4.77 12.847 11h3.998l8.404-9.338a2 2 0 0 1 3.048.09L296.692 99H305a2 2 0 0 1 0 4h-9.27a2 2 0 0 1-1.562-.751l-6.523-8.16-7.423 8.249a2 2 0 0 1-1.487.662h-4.888zM261 110a9 9 0 1 0 0-18 9 9 0 0 0 0 18z"/><path fill="#FEE1D3" fill-rule="nonzero" d="M213 119c-10.493 0-19-8.507-19-19s8.507-19 19-19 19 8.507 19 19-8.507 19-19 19zm0-4c8.284 0 15-6.716 15-15 0-8.284-6.716-15-15-15-8.284 0-15 6.716-15 15 0 8.284 6.716 15 15 15z"/><path fill="#FC6D26" d="M211.586 101.828L208.757 99a2 2 0 1 0-2.828 2.828l4.243 4.243c.39.39.902.586 1.414.586.512 0 1.023-.195 1.414-.586L220.071 99a2 2 0 1 0-2.828-2.828l-5.657 5.656z"/><path fill="#FDC4A8" d="M162.95 101.07l-1.768-1.767a1.5 1.5 0 0 0-2.121 2.121l2.828 2.829c.293.293.677.439 1.06.439.385 0 .769-.146 1.062-.44l4.242-4.242a1.5 1.5 0 1 0-2.121-2.121l-3.182 3.182z"/><path fill="#6B4FBB" d="M256.39 104.841A6 6 0 1 0 261 95v6l-4.61 3.841z"/><path fill="#FEF0E8" fill-rule="nonzero" d="M99 99h-5a2 2 0 1 0 0 4h5a2 2 0 1 0 0-4zm-16 0h-5a2 2 0 1 0 0 4h5a2 2 0 1 0 0-4zm-14.384-.078l-3.643-3.425a2 2 0 1 0-2.74 2.914l3.643 3.425a2 2 0 1 0 2.74-2.914zm-11.657-10.96l-3.642-3.425a2 2 0 1 0-2.74 2.914l3.642 3.425a2 2 0 0 0 2.74-2.914zm-11.656-10.96l-3.643-3.425a2 2 0 0 0-2.74 2.914l3.643 3.425a2 2 0 1 0 2.74-2.914zm-14.367-3.885l-3.593 3.477a2 2 0 0 0 2.782 2.875l3.593-3.477a2 2 0 0 0-2.782-2.875zM19.44 84.244l-3.593 3.477a2 2 0 1 0 2.781 2.874l3.593-3.477a2 2 0 0 0-2.781-2.874zM7.94 95.371l-3.593 3.477a2 2 0 1 0 2.782 2.874l3.593-3.477a2 2 0 1 0-2.782-2.874z"/><path fill="#E1DBF1" fill-rule="nonzero" d="M423.611 99.56l-3.598 3.472a2 2 0 0 0 2.777 2.879l3.599-3.472a2 2 0 0 0-2.778-2.878zm-11.514 11.11l-3.598 3.472a2 2 0 0 0 2.777 2.878l3.598-3.471a2 2 0 0 0-2.777-2.879zm-11.514 11.11l-3.599 3.471a2 2 0 1 0 2.778 2.879l3.598-3.472a2 2 0 1 0-2.777-2.879zm-8.799 4.48l-3.642-3.426a2 2 0 0 0-2.74 2.915l3.642 3.425a2 2 0 0 0 2.74-2.915zm-11.656-10.96l-3.643-3.426a2 2 0 1 0-2.74 2.914l3.643 3.426a2 2 0 1 0 2.74-2.915zm-11.657-10.96l-3.643-3.426a2 2 0 1 0-2.74 2.914l3.643 3.425a2 2 0 1 0 2.74-2.914zM353.001 99h-5a2 2 0 1 0 0 4h5a2 2 0 0 0 0-4zm-16 0h-5a2 2 0 1 0 0 4h5a2 2 0 0 0 0-4z"/></g></svg>
\ No newline at end of file diff --git a/app/assets/images/illustrations/slack_logo.svg b/app/assets/images/illustrations/slack_logo.svg new file mode 100644 index 00000000000..b8d7906c2e1 --- /dev/null +++ b/app/assets/images/illustrations/slack_logo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" viewBox="0 0 121.94154 121.84154" width="121.942" height="121.842"><style id="style200">.st0{fill:#ecb32d}.st1{fill:#63c1a0}.st2{fill:#e01a59}.st3{fill:#331433}.st4{fill:#d62027}.st5{fill:#89d3df}.st6{fill:#258b74}.st7{fill:#819c3c}</style><path class="st0" d="M79.03 7.511c-1.9-5.7-8-8.8-13.7-7-5.7 1.9-8.8 8-7 13.7l28.1 86.4c1.9 5.3 7.7 8.3 13.2 6.7 5.8-1.7 9.3-7.8 7.4-13.4 0-.2-28-86.4-28-86.4z" id="path202" fill="#ecb32d"/><path class="st1" d="M35.53 21.611c-1.9-5.7-8-8.8-13.7-7-5.7 1.9-8.8 8-7 13.7l28.1 86.4c1.9 5.3 7.7 8.3 13.2 6.7 5.8-1.7 9.3-7.8 7.4-13.4 0-.2-28-86.4-28-86.4z" id="path204" fill="#63c1a0"/><path class="st2" d="M114.43 79.011c5.7-1.9 8.8-8 7-13.7-1.9-5.7-8-8.8-13.7-7l-86.5 28.2c-5.3 1.9-8.3 7.7-6.7 13.2 1.7 5.8 7.8 9.3 13.4 7.4.2 0 86.5-28.1 86.5-28.1z" id="path206" fill="#e01a59"/><path class="st3" d="M39.23 103.511c5.6-1.8 12.9-4.2 20.7-6.7-1.8-5.6-4.2-12.9-6.7-20.7l-20.7 6.7z" id="path208" fill="#331433"/><path class="st4" d="M82.83 89.311c7.8-2.5 15.1-4.9 20.7-6.7-1.8-5.6-4.2-12.9-6.7-20.7l-20.7 6.7z" id="path210" fill="#d62027"/><path class="st5" d="M100.23 35.511c5.7-1.9 8.8-8 7-13.7-1.9-5.7-8-8.8-13.7-7l-86.4 28.1c-5.3 1.9-8.3 7.7-6.7 13.2 1.7 5.8 7.8 9.3 13.4 7.4.2 0 86.4-28 86.4-28z" id="path212" fill="#89d3df"/><path class="st6" d="M25.13 59.911c5.6-1.8 12.9-4.2 20.7-6.7-2.5-7.8-4.9-15.1-6.7-20.7l-20.7 6.7z" id="path214" fill="#258b74"/><path class="st7" d="M68.63 45.811c7.8-2.5 15.1-4.9 20.7-6.7-2.5-7.8-4.9-15.1-6.7-20.7l-20.7 6.7z" id="path216" fill="#819c3c"/></svg>
\ No newline at end of file diff --git a/app/assets/images/illustrations/wiki-fro-logged-out-users.svg b/app/assets/images/illustrations/wiki-fro-logged-out-users.svg new file mode 100644 index 00000000000..c71841f72e5 --- /dev/null +++ b/app/assets/images/illustrations/wiki-fro-logged-out-users.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="412" height="260" viewBox="0 0 412 260" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="a" d="M6.447.894L12 12H0L5.553.894a.5.5 0 0 1 .894 0z"/></defs><g fill="none" fill-rule="evenodd"><path fill="#FEF0E8" fill-rule="nonzero" d="M338 50.287C322.695 41.45 303.124 46.694 294.287 62c-8.836 15.305-3.592 34.876 11.713 43.712 15.306 8.837 34.877 3.593 43.713-11.712 8.837-15.306 3.593-34.877-11.713-43.713zm2-3.464C357.22 56.763 363.118 78.78 353.177 96c-9.941 17.218-31.958 23.118-49.177 13.176-17.218-9.94-23.118-31.958-13.177-49.176C300.764 42.78 322.782 36.88 340 46.823z"/><g transform="rotate(-150 171.003 8.53)"><path fill="#FC6D26" fill-rule="nonzero" d="M4 16v25a2 2 0 1 0 4 0V16H4zm8-4v29a6 6 0 1 1-12 0V12h12z"/><use fill="#D8D8D8" xlink:href="#a"/><path stroke="#FDC4A8" stroke-width="4" d="M6 4.472L3.236 10h5.528L6 4.472z"/><path fill="#FC6D26" d="M9 6L6.447.894a.5.5 0 0 0-.894 0L3 6c.836.628 1.874 1 3 1a4.978 4.978 0 0 0 3-1z"/></g><path fill="#F9F9F9" d="M263.116 237.116A10.002 10.002 0 0 1 254 243h-86c-11.046 0-20-8.954-20-20V121c0-4.056 2.414-7.547 5.884-9.116A9.964 9.964 0 0 0 153 116v106c0 8.837 7.163 16 16 16h90c1.467 0 2.86-.316 4.116-.884z"/><path fill="#EEE" fill-rule="nonzero" d="M214.5 106H163c-5.523 0-10 4.477-10 10v106c0 8.837 7.163 16 16 16h90c5.523 0 10-4.477 10-10v-17.999a10.036 10.036 0 0 1-4 3.167V228a6 6 0 0 1-6 6h-90c-6.627 0-12-5.373-12-12V116a6 6 0 0 1 6-6h7v-4h44.5z"/><path fill="#EEE" fill-rule="nonzero" d="M260 218.268V214h-90a6 6 0 0 0 0 12h86a4 4 0 0 0 4-4v-.268a1.99 1.99 0 0 1-1 .268h-50a2 2 0 0 1 0-4h50c.364 0 .706.097 1 .268zM170 210h90.5a3.5 3.5 0 0 1 3.5 3.5v8.5a8 8 0 0 1-8 8h-86c-5.523 0-10-4.477-10-10s4.477-10 10-10z"/><path fill="#EEE" fill-rule="nonzero" d="M174 110v100h87a6 6 0 0 0 6-6v-88a6 6 0 0 0-6-6h-87zm-4-4h91c5.523 0 10 4.477 10 10v88c0 5.523-4.477 10-10 10h-91V106z"/><path fill="#EFEDF8" d="M230 99h18a6 6 0 0 1 6 6v31.35a3 3 0 0 1-4.68 2.484l-9.277-6.274a1.5 1.5 0 0 0-1.664-.01l-9.731 6.395a3 3 0 0 1-4.648-2.507V105a6 6 0 0 1 6-6z"/><path fill="#C3B8E3" fill-rule="nonzero" d="M236.182 129.207a5.5 5.5 0 0 1 6.102.04l7.716 5.219V105a2 2 0 0 0-2-2h-18a2 2 0 0 0-2 2v29.584l8.182-5.377zM230 99h18a6 6 0 0 1 6 6v31.35a3 3 0 0 1-4.68 2.484l-9.277-6.274a1.5 1.5 0 0 0-1.664-.01l-9.731 6.395a3 3 0 0 1-4.648-2.507V105a6 6 0 0 1 6-6z"/><g fill-rule="nonzero"><path fill="#EFEDF8" d="M156 74c14.912 0 27-12.088 27-27s-12.088-27-27-27-27 12.088-27 27 12.088 27 27 27zm0 4c-17.12 0-31-13.88-31-31s13.88-31 31-31 31 13.88 31 31-13.88 31-31 31z"/><path fill="#6B4FBB" d="M147.535 44.916l-.116 1.086a8.446 8.446 0 0 0 .093 2.44l.2 1.08-2.262 1.202a.495.495 0 0 0-.213.678l.941 1.77c.128.239.434.332.68.201l2.25-1.196.785.775a8.544 8.544 0 0 0 1.967 1.45l.975.522-.486 2.5a.495.495 0 0 0 .392.59l1.968.383a.504.504 0 0 0 .585-.401l.489-2.515 1.086-.13a8.584 8.584 0 0 0 2.363-.633l1.005-.43 1.68 1.933a.495.495 0 0 0 .708.055l1.513-1.315a.504.504 0 0 0 .044-.708l-1.67-1.922.583-.94c.431-.696.761-1.45.978-2.239l.292-1.063 2.547-.089a.495.495 0 0 0 .488-.515l-.07-2.003a.504.504 0 0 0-.523-.48l-2.56.09-.367-1.037a8.446 8.446 0 0 0-1.139-2.159l-.644-.882 1.509-2.076a.495.495 0 0 0-.106-.702l-1.621-1.178a.504.504 0 0 0-.7.116l-1.494 2.057-1.05-.362a8.459 8.459 0 0 0-2.398-.455l-1.1-.047-.66-2.466a.495.495 0 0 0-.613-.36l-1.936.519a.504.504 0 0 0-.35.617l.661 2.466-.93.59a8.459 8.459 0 0 0-1.848 1.594l-.728.838-2.322-1.034a.495.495 0 0 0-.665.25l-.815 1.83a.504.504 0 0 0 .26.661l2.344 1.044zm-3.565 1.697a3.504 3.504 0 0 1-1.78-4.622l.815-1.83a3.495 3.495 0 0 1 4.626-1.77l.346.154c.259-.245.529-.477.81-.697l-.106-.394a3.504 3.504 0 0 1 2.471-4.292l1.936-.519a3.495 3.495 0 0 1 4.286 2.481l.106.395c.353.05.703.116 1.05.198l.222-.306a3.504 3.504 0 0 1 4.89-.78l1.622 1.178a3.495 3.495 0 0 1 .769 4.892l-.258.355c.184.312.354.633.508.962l.42-.014a3.504 3.504 0 0 1 3.625 3.373l.07 2.003a3.495 3.495 0 0 1-3.382 3.618l-.4.014c-.127.332-.27.659-.426.978l.256.294a3.504 3.504 0 0 1-.34 4.941l-1.512 1.315a3.495 3.495 0 0 1-4.94-.351l-.283-.325a11.669 11.669 0 0 1-1.05.28l-.082.424a3.504 3.504 0 0 1-4.103 2.774l-1.967-.382a3.495 3.495 0 0 1-2.765-4.11l.075-.383a11.547 11.547 0 0 1-.858-.633l-.354.188a3.504 3.504 0 0 1-4.738-1.442l-.94-1.77a3.495 3.495 0 0 1 1.453-4.734l.37-.197a11.436 11.436 0 0 1-.041-1.088l-.4-.178zm13.326 5.608a5.5 5.5 0 1 1-2.847-10.625 5.5 5.5 0 0 1 2.847 10.625zm-.776-2.898a2.5 2.5 0 1 0-1.294-4.83 2.5 2.5 0 0 0 1.294 4.83z"/></g><g fill-rule="nonzero"><path fill="#EFEDF8" d="M326.979 222.047c14.403 3.86 29.209-4.688 33.068-19.092 3.86-14.403-4.688-29.209-19.092-33.068-14.403-3.86-29.209 4.688-33.068 19.092-3.86 14.404 4.688 29.209 19.092 33.068zm-1.035 3.864c-16.538-4.431-26.352-21.43-21.92-37.967 4.43-16.538 21.429-26.352 37.966-21.92 16.538 4.43 26.352 21.429 21.92 37.966-4.43 16.538-21.429 26.352-37.966 21.92z"/><path fill="#6B4FBB" d="M329.376 201.598c-4.668-2.621-7.155-8.157-5.706-13.566 1.715-6.402 8.295-10.201 14.697-8.486 6.402 1.716 10.2 8.296 8.485 14.697-1.45 5.41-6.371 8.96-11.725 8.897a3.03 3.03 0 0 1-.074.365l-1.812 6.761a3 3 0 0 1-5.795-1.552l1.812-6.762a3.03 3.03 0 0 1 .118-.354zm3.815-2.733a8 8 0 1 0 4.14-15.455 8 8 0 0 0-4.14 15.455z"/></g><path fill="#FEF0E8" fill-rule="nonzero" d="M91.373 193c17.071-4.574 27.202-22.12 22.628-39.191-4.575-17.071-22.121-27.202-39.192-22.628-17.071 4.574-27.202 22.121-22.628 39.192 4.574 17.071 22.121 27.202 39.192 22.627zm1.035 3.864c-19.204 5.146-38.945-6.25-44.09-25.456-5.146-19.204 6.25-38.945 25.455-44.09 19.205-5.146 38.945 6.25 44.091 25.455 5.146 19.205-6.25 38.945-25.456 44.091z"/><path fill="#FDC4A8" fill-rule="nonzero" d="M70.067 152.122l6.73 25.114 19.318-5.176-6.73-25.114-19.318 5.176zm-1.035-3.864l19.318-5.176a4 4 0 0 1 4.9 2.828l6.729 25.114a4 4 0 0 1-2.829 4.9L77.832 181.1a4 4 0 0 1-4.9-2.829l-6.729-25.114a4 4 0 0 1 2.829-4.899z"/><path fill="#FC6D26" d="M76.898 154.433l7.727-2.07a2 2 0 0 1 1.036 3.863l-7.728 2.07a2 2 0 1 1-1.035-3.863zm1.812 6.761l5.795-1.553a2 2 0 0 1 1.035 3.864l-5.795 1.553a2 2 0 1 1-1.035-3.864zm1.811 6.762l7.728-2.07a2 2 0 0 1 1.035 3.863l-7.727 2.07a2 2 0 1 1-1.036-3.863z"/></g></svg>
\ No newline at end of file diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js index f15452ec683..9dec5d7645a 100644 --- a/app/assets/javascripts/search_autocomplete.js +++ b/app/assets/javascripts/search_autocomplete.js @@ -162,13 +162,19 @@ import { isInGroupsPage, isInProjectPage, getGroupSlug, getProjectSlug } from '. items = [ { header: "" + name - }, { + } + ]; + const issueItems = [ + { text: 'Issues assigned to me', url: issuesPath + "/?assignee_username=" + userName }, { text: "Issues I've created", url: issuesPath + "/?author_username=" + userName - }, 'separator', { + } + ]; + const mergeRequestItems = [ + { text: 'Merge requests assigned to me', url: mrPath + "/?assignee_username=" + userName }, { @@ -176,6 +182,11 @@ import { isInGroupsPage, isInProjectPage, getGroupSlug, getProjectSlug } from '. url: mrPath + "/?author_username=" + userName } ]; + if (options.issuesDisabled) { + items = items.concat(mergeRequestItems); + } else { + items = items.concat(...issueItems, 'separator', ...mergeRequestItems); + } if (!name) { items.splice(0, 1); } @@ -408,6 +419,7 @@ import { isInGroupsPage, isInProjectPage, getGroupSlug, getProjectSlug } from '. gl.projectOptions[projectPath] = { name: $projectOptionsDataEl.data('name'), issuesPath: $projectOptionsDataEl.data('issues-path'), + issuesDisabled: $projectOptionsDataEl.data('issues-disabled'), mrPath: $projectOptionsDataEl.data('mr-path') }; } diff --git a/app/assets/javascripts/vue_shared/components/markdown/field.vue b/app/assets/javascripts/vue_shared/components/markdown/field.vue index 8c0d9b9cda8..a873e00d0f3 100644 --- a/app/assets/javascripts/vue_shared/components/markdown/field.vue +++ b/app/assets/javascripts/vue_shared/components/markdown/field.vue @@ -3,6 +3,7 @@ import GLForm from '../../../gl_form'; import markdownHeader from './header.vue'; import markdownToolbar from './toolbar.vue'; + import icon from '../icon.vue'; export default { props: { @@ -37,6 +38,7 @@ components: { markdownHeader, markdownToolbar, + icon, }, computed: { shouldShowReferencedUsers() { @@ -45,8 +47,10 @@ }, }, methods: { - toggleMarkdownPreview() { - this.previewMarkdown = !this.previewMarkdown; + showPreviewTab() { + if (this.previewMarkdown) return; + + this.previewMarkdown = true; /* Can't use `$refs` as the component is technically in the parent component @@ -54,20 +58,22 @@ */ const text = this.$slots.textarea[0].elm.value; - if (!this.previewMarkdown) { - this.markdownPreview = ''; - } else if (text) { + if (text) { this.markdownPreviewLoading = true; this.$http.post(this.markdownPreviewPath, { text }) .then(resp => resp.json()) - .then((data) => { - this.renderMarkdown(data); - }) + .then(data => this.renderMarkdown(data)) .catch(() => new Flash('Error loading markdown preview')); } else { this.renderMarkdown(); } }, + + showWriteTab() { + this.markdownPreview = ''; + this.previewMarkdown = false; + }, + renderMarkdown(data = {}) { this.markdownPreviewLoading = false; this.markdownPreview = data.body || 'Nothing to preview.'; @@ -104,7 +110,8 @@ ref="gl-form"> <markdown-header :preview-markdown="previewMarkdown" - @toggle-markdown="toggleMarkdownPreview" /> + @preview-markdown="showPreviewTab" + @write-markdown="showWriteTab" /> <div class="md-write-holder" v-show="!previewMarkdown"> @@ -114,10 +121,10 @@ class="zen-control zen-control-leave js-zen-leave" href="#" aria-label="Enter zen mode"> - <i - class="fa fa-compress" - aria-hidden="true"> - </i> + <icon + name="screen-normal" + :size="32"> + </icon> </a> <markdown-toolbar :markdown-docs-path="markdownDocsPath" diff --git a/app/assets/javascripts/vue_shared/components/markdown/header.vue b/app/assets/javascripts/vue_shared/components/markdown/header.vue index 5bf2a90cc3b..70f5fc1d664 100644 --- a/app/assets/javascripts/vue_shared/components/markdown/header.vue +++ b/app/assets/javascripts/vue_shared/components/markdown/header.vue @@ -1,6 +1,7 @@ <script> import tooltip from '../../directives/tooltip'; import toolbarButton from './toolbar_button.vue'; + import icon from '../icon.vue'; export default { props: { @@ -14,25 +15,34 @@ }, components: { toolbarButton, + icon, }, methods: { - toggleMarkdownPreview(e, form) { - if (form && !form.find('.js-vue-markdown-field').length) { - return; - } else if (e.target.blur) { - e.target.blur(); - } + isMarkdownForm(form) { + return form && !form.find('.js-vue-markdown-field').length; + }, + + previewMarkdownTab(event, form) { + if (event.target.blur) event.target.blur(); + if (this.isMarkdownForm(form)) return; + + this.$emit('preview-markdown'); + }, + + writeMarkdownTab(event, form) { + if (event.target.blur) event.target.blur(); + if (this.isMarkdownForm(form)) return; - this.$emit('toggle-markdown'); + this.$emit('write-markdown'); }, }, mounted() { - $(document).on('markdown-preview:show.vue', this.toggleMarkdownPreview); - $(document).on('markdown-preview:hide.vue', this.toggleMarkdownPreview); + $(document).on('markdown-preview:show.vue', this.previewMarkdownTab); + $(document).on('markdown-preview:hide.vue', this.writeMarkdownTab); }, beforeDestroy() { - $(document).on('markdown-preview:show.vue', this.toggleMarkdownPreview); - $(document).off('markdown-preview:hide.vue', this.toggleMarkdownPreview); + $(document).off('markdown-preview:show.vue', this.previewMarkdownTab); + $(document).off('markdown-preview:hide.vue', this.writeMarkdownTab); }, }; </script> @@ -42,17 +52,19 @@ <ul class="nav-links clearfix"> <li :class="{ active: !previewMarkdown }"> <a + class="js-write-link" href="#md-write-holder" tabindex="-1" - @click.prevent="toggleMarkdownPreview($event)"> + @click.prevent="writeMarkdownTab($event)"> Write </a> </li> <li :class="{ active: previewMarkdown }"> <a + class="js-preview-link" href="#md-preview-holder" tabindex="-1" - @click.prevent="toggleMarkdownPreview($event)"> + @click.prevent="previewMarkdownTab($event)"> Preview </a> </li> @@ -70,7 +82,7 @@ tag="> " :prepend="true" button-title="Insert a quote" - icon="quote-right" /> + icon="quote" /> <toolbar-button tag="`" tag-block="```" @@ -80,17 +92,17 @@ tag="* " :prepend="true" button-title="Add a bullet list" - icon="list-ul" /> + icon="list-bulleted" /> <toolbar-button tag="1. " :prepend="true" button-title="Add a numbered list" - icon="list-ol" /> + icon="list-numbered" /> <toolbar-button tag="* [ ] " :prepend="true" button-title="Add a task list" - icon="check-square-o" /> + icon="task-done" /> </div> <div class="toolbar-group"> <button @@ -101,10 +113,9 @@ tabindex="-1" title="Go full screen" type="button"> - <i - aria-hidden="true" - class="fa fa-arrows-alt fa-fw"> - </i> + <icon + name="screen-full"> + </icon> </button> </div> </li> diff --git a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue index f7da7ebfcfe..b930fb116a3 100644 --- a/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue +++ b/app/assets/javascripts/vue_shared/components/markdown/toolbar_button.vue @@ -1,5 +1,6 @@ <script> import tooltip from '../../directives/tooltip'; + import icon from '../icon.vue'; export default { props: { @@ -26,14 +27,12 @@ default: false, }, }, + components: { + icon, + }, directives: { tooltip, }, - computed: { - iconClass() { - return `fa-${this.icon}`; - }, - }, }; </script> @@ -49,10 +48,8 @@ :data-md-prepend="prepend" :title="buttonTitle" :aria-label="buttonTitle"> - <i - aria-hidden="true" - class="fa fa-fw" - :class="iconClass"> - </i> + <icon + :name="icon"> + </icon> </button> </template> diff --git a/app/assets/stylesheets/framework/avatar.scss b/app/assets/stylesheets/framework/avatar.scss index f1aedc227f3..26db2386879 100644 --- a/app/assets/stylesheets/framework/avatar.scss +++ b/app/assets/stylesheets/framework/avatar.scss @@ -42,8 +42,7 @@ &.avatar-inline { float: none; display: inline-block; - margin-left: 4px; - margin-bottom: 2px; + margin-left: 2px; flex-shrink: 0; -webkit-flex-shrink: 0; @@ -59,7 +58,7 @@ &.avatar-tile { border-radius: 0; - border: none; + border: 0; } &:not([href]):hover { @@ -96,7 +95,7 @@ .avatar { border-radius: 0; - border: none; + border: 0; height: auto; width: 100%; margin: 0; diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss index def986180fc..9c1439dfad5 100644 --- a/app/assets/stylesheets/framework/blocks.scss +++ b/app/assets/stylesheets/framework/blocks.scss @@ -39,7 +39,7 @@ } &.top-block { - border-top: none; + border-top: 0; .container-fluid { background-color: inherit; @@ -63,7 +63,7 @@ &.footer-block { margin-top: 0; - border-bottom: none; + border-bottom: 0; margin-bottom: -$gl-padding; } @@ -100,7 +100,7 @@ &.build-content { background-color: $white-light; - border-top: none; + border-top: 0; } } @@ -287,12 +287,12 @@ cursor: pointer; color: $blue-300; z-index: 1; - border: none; + border: 0; background-color: transparent; &:hover, &:focus { - border: none; + border: 0; color: $blue-400; } } diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss index 16373b14ff7..b2f26cf7159 100644 --- a/app/assets/stylesheets/framework/buttons.scss +++ b/app/assets/stylesheets/framework/buttons.scss @@ -305,7 +305,7 @@ } .btn-clipboard { - border: none; + border: 0; padding: 0 5px; } diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss index ea3007f5e08..393a0052114 100644 --- a/app/assets/stylesheets/framework/common.scss +++ b/app/assets/stylesheets/framework/common.scss @@ -28,7 +28,7 @@ pre { &.clean { background: none; - border: none; + border: 0; margin: 0; padding: 0; } @@ -142,7 +142,7 @@ li.note { img { max-width: 100%; } .note-title { li { - border-bottom: none !important; + border-bottom: 0 !important; } } } @@ -187,7 +187,7 @@ li.note { pre { background: $white-light; - border: none; + border: 0; font-size: 12px; } } @@ -386,7 +386,7 @@ img.emoji { } .hide-bottom-border { - border-bottom: none !important; + border-bottom: 0 !important; } .gl-accessibility { diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 6382551fcc9..1247e5e4876 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -142,7 +142,7 @@ */ &.blame { table { - border: none; + border: 0; margin: 0; } @@ -150,20 +150,20 @@ border-bottom: 1px solid $blame-border; &:last-child { - border-bottom: none; + border-bottom: 0; } } td { - border-top: none; - border-bottom: none; + border-top: 0; + border-bottom: 0; &:first-child { - border-left: none; + border-left: 0; } &:last-child { - border-right: none; + border-right: 0; } &.blame-commit { diff --git a/app/assets/stylesheets/framework/filters.scss b/app/assets/stylesheets/framework/filters.scss index a7333925f80..74b6b31b07e 100644 --- a/app/assets/stylesheets/framework/filters.scss +++ b/app/assets/stylesheets/framework/filters.scss @@ -255,7 +255,7 @@ .clear-search { width: 35px; background-color: $white-light; - border: none; + border: 0; outline: none; z-index: 1; @@ -418,7 +418,7 @@ .droplab-dropdown .dropdown-menu .filter-dropdown-item { .btn { - border: none; + border: 0; width: 100%; text-align: left; padding: 8px 16px; diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index 5d777f0d468..1cdfa904374 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -10,7 +10,7 @@ z-index: 1000; margin-bottom: 0; min-height: $header-height; - border: none; + border: 0; border-bottom: 1px solid $border-color; position: fixed; top: 0; @@ -169,7 +169,7 @@ .navbar-collapse { flex: 0 0 auto; - border-top: none; + border-top: 0; padding: 0; @media (max-width: $screen-xs-max) { @@ -352,77 +352,7 @@ .header-user .dropdown-menu-nav, .header-new .dropdown-menu-nav { - margin-top: 4px; -} - -.search { - margin: 4px 8px 0; - - form { - height: 32px; - border: 0; - border-radius: $border-radius-default; - transition: border-color ease-in-out 0.15s, background-color ease-in-out 0.15s; - - &:hover { - box-shadow: none; - } - } - - .search-input { - color: $white-light; - background: none; - transition: color ease-in-out 0.15s; - } - - .search-input::placeholder { - transition: color ease-in-out 0.15s; - } - - .location-badge { - font-size: 12px; - margin: -4px 4px -4px -4px; - line-height: 25px; - padding: 4px 8px; - border-radius: 2px 0 0 2px; - height: 32px; - transition: border-color ease-in-out 0.15s; - } - - &.search-active { - form { - background-color: rgba($indigo-200, .3); - box-shadow: none; - - .search-input { - color: $gl-text-color; - transition: color ease-in-out 0.15s; - } - - .search-input::placeholder { - color: $gl-text-color-tertiary; - } - - .search-input-wrap { - .search-icon, - .clear-icon { - color: $gl-text-color-tertiary; - transition: color ease-in-out 0.15s; - } - } - } - - .location-badge { - background-color: $nav-badge-bg; - border-color: $border-color; - } - - .search-input-wrap { - .clear-icon { - color: $white-light; - } - } - } + margin-top: $dropdown-vertical-offset; } .breadcrumbs { diff --git a/app/assets/stylesheets/framework/highlight.scss b/app/assets/stylesheets/framework/highlight.scss index c63114f85b4..813a1711ea2 100644 --- a/app/assets/stylesheets/framework/highlight.scss +++ b/app/assets/stylesheets/framework/highlight.scss @@ -1,5 +1,5 @@ .file-content.code { - border: none; + border: 0; box-shadow: none; margin: 0; padding: 0; @@ -7,7 +7,7 @@ pre { padding: 10px 0; - border: none; + border: 0; border-radius: 0; font-family: $monospace_font; font-size: $code_font_size; diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index 511608c618c..ad3bb0e35d1 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -42,7 +42,7 @@ } &:last-child { - border-bottom: none; + border-bottom: 0; &.bottom { background: $gray-light; @@ -92,7 +92,7 @@ ul.unstyled-list { } ul.unstyled-list > li { - border-bottom: none; + border-bottom: 0; } // Generic content list @@ -178,7 +178,7 @@ ul.content-list { // When dragging a list item &.ui-sortable-helper { - border-bottom: none; + border-bottom: 0; } &.list-placeholder { @@ -295,7 +295,7 @@ ul.indent-list { } > .group-list-tree > .group-row.has-children:first-child { - border-top: none; + border-top: 0; } } @@ -413,7 +413,7 @@ ul.indent-list { padding: 0; &.has-children { - border-top: none; + border-top: 0; } &:first-child { diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss index 0a5a16c09b0..cd6f94fb354 100644 --- a/app/assets/stylesheets/framework/markdown_area.scss +++ b/app/assets/stylesheets/framework/markdown_area.scss @@ -138,15 +138,23 @@ .toolbar-btn { float: left; - padding: 0 5px; - color: $gl-text-color-secondary; + padding: 0 7px; background: transparent; border: 0; outline: 0; + svg { + width: 14px; + height: 14px; + margin-top: 3px; + fill: $gl-text-color-secondary; + } + &:hover, &:focus { - color: $gl-link-color; + svg { + fill: $gl-link-color; + } } } diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss index 2fee2164190..16d5edde61e 100644 --- a/app/assets/stylesheets/framework/mixins.scss +++ b/app/assets/stylesheets/framework/mixins.scss @@ -36,7 +36,7 @@ margin: 0; &:last-child { - border-bottom: none; + border-bottom: 0; } &.active { diff --git a/app/assets/stylesheets/framework/responsive_tables.scss b/app/assets/stylesheets/framework/responsive_tables.scss index 8b7afdbe1a5..7829d722560 100644 --- a/app/assets/stylesheets/framework/responsive_tables.scss +++ b/app/assets/stylesheets/framework/responsive_tables.scss @@ -24,7 +24,7 @@ @media (min-width: $screen-md-min) { margin: 0; padding: $gl-padding 0; - border: none; + border: 0; &:not(:last-child) { border-bottom: 1px solid $white-normal; diff --git a/app/assets/stylesheets/framework/secondary-navigation-elements.scss b/app/assets/stylesheets/framework/secondary-navigation-elements.scss index 9e1f77e5726..8498b37abe4 100644 --- a/app/assets/stylesheets/framework/secondary-navigation-elements.scss +++ b/app/assets/stylesheets/framework/secondary-navigation-elements.scss @@ -63,7 +63,7 @@ .nav-links { margin-bottom: 0; - border-bottom: none; + border-bottom: 0; float: left; &.wide { @@ -335,69 +335,16 @@ border-bottom: 1px solid $border-color; .nav-links { - border-bottom: none; + border-bottom: 0; } } } -.page-with-layout-nav { - .right-sidebar { - top: ($header-height + 1) * 2; - } - - &.page-with-sub-nav { - .right-sidebar { - top: ($header-height + 1) * 3; - - &.affix { - top: $header-height; - } - } - } -} - -.with-performance-bar .page-with-layout-nav { - .right-sidebar { - top: ($header-height + 1) * 2 + $performance-bar-height; - } - - &.page-with-sub-nav { - .right-sidebar { - top: ($header-height + 1) * 3 + $performance-bar-height; - - &.affix { - top: $header-height + $performance-bar-height; - } - } - } -} - -@media (max-width: $screen-xs-max) { - .top-area { - flex-flow: row wrap; - - .nav-controls { - $controls-margin: $btn-xs-side-margin - 2px; - flex: 0 0 100%; - - &.controls-flex { - display: flex; - flex-flow: row wrap; - align-items: center; - justify-content: center; - padding: 0 0 $gl-padding-top; - } - - .controls-item, - .controls-item-full, - .controls-item:last-child { - flex: 1 1 35%; - display: block; - width: 100%; - margin: $controls-margin; - } - } - } +.project-item-select-holder.btn-group { + display: flex; + max-width: 350px; + overflow: hidden; + float: right; .new-project-item-link { white-space: nowrap; diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss index aa35cd9bea4..bb70b270299 100644 --- a/app/assets/stylesheets/framework/selects.scss +++ b/app/assets/stylesheets/framework/selects.scss @@ -17,7 +17,7 @@ .select2-arrow { background-image: none; background-color: transparent; - border: none; + border: 0; padding-top: 12px; padding-right: 20px; font-size: 10px; @@ -60,12 +60,17 @@ border-radius: $border-radius-base; border: 1px solid $dropdown-border-color; min-width: 175px; - color: $gl-grayish-blue; + color: $gl-text-color; + z-index: 999; } -.select2-results .select2-result-label, -.select2-more-results { - padding: 10px 15px; +.select2-drop-mask { + z-index: 998; +} + +.select2-drop.select2-drop-above.select2-drop-active { + border-top: 1px solid $dropdown-border-color; + margin-top: -6px; } .select2-container-active { @@ -158,18 +163,35 @@ } } -.select2-results .select2-no-results, -.select2-results .select2-searching, -.select2-results .select2-ajax-error, -.select2-results .select2-selection-limit { - background: $gray-light; - display: list-item; - padding: 10px 15px; -} - .select2-results { margin: 0; - padding: 10px 0; + padding: #{$gl-padding / 2} 0; + + .select2-no-results, + .select2-searching, + .select2-ajax-error, + .select2-selection-limit { + background: transparent; + padding: #{$gl-padding / 2} $gl-padding; + } + + .select2-result-label, + .select2-more-results { + padding: #{$gl-padding / 2} $gl-padding; + } + + .select2-highlighted { + background: transparent; + color: $gl-text-color; + + .select2-result-label { + background: $dropdown-item-hover-bg; + } + } + + .select2-result { + padding: 0 1px; + } li.select2-result-with-children > .select2-result-label { font-weight: $gl-font-weight-bold; @@ -190,8 +212,6 @@ } .select2-highlighted { - background: $gl-link-color !important; - .group-result { .group-path { color: $white-light; diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index ef58382ba41..1a19b7320a0 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -9,7 +9,7 @@ &.container-blank { background: none; padding: 0; - border: none; + border: 0; } } } @@ -111,7 +111,7 @@ } .block:last-of-type { - border: none; + border: 0; } } diff --git a/app/assets/stylesheets/framework/tables.scss b/app/assets/stylesheets/framework/tables.scss index 4dd31bf28cd..5bde96caf42 100644 --- a/app/assets/stylesheets/framework/tables.scss +++ b/app/assets/stylesheets/framework/tables.scss @@ -33,7 +33,7 @@ table { th { background-color: $gray-light; font-weight: $gl-font-weight-normal; - border-bottom: none; + border-bottom: 0; &.wide { width: 55%; diff --git a/app/assets/stylesheets/framework/timeline.scss b/app/assets/stylesheets/framework/timeline.scss index f718ec4bcad..373f35e71d8 100644 --- a/app/assets/stylesheets/framework/timeline.scss +++ b/app/assets/stylesheets/framework/timeline.scss @@ -21,7 +21,7 @@ } &.text-file .diff-file { - border-bottom: none; + border-bottom: 0; } } @@ -66,5 +66,5 @@ .discussion .timeline-entry { margin: 0; - border-right: none; + border-right: 0; } diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss index 3c0b4c82d19..0817cce114c 100644 --- a/app/assets/stylesheets/framework/typography.scss +++ b/app/assets/stylesheets/framework/typography.scss @@ -167,7 +167,7 @@ &.plain-readme { background: none; - border: none; + border: 0; padding: 0; margin: 0; font-size: 14px; diff --git a/app/assets/stylesheets/framework/zen.scss b/app/assets/stylesheets/framework/zen.scss index 0c226ff7598..5a4d3ba0ee9 100644 --- a/app/assets/stylesheets/framework/zen.scss +++ b/app/assets/stylesheets/framework/zen.scss @@ -9,7 +9,7 @@ z-index: 1031; textarea { - border: none; + border: 0; box-shadow: none; border-radius: 0; color: $black; @@ -57,7 +57,15 @@ padding: 5px; font-size: 36px; + svg { + fill: $gl-text-color; + } + &:hover { color: $black; + + svg { + fill: $black; + } } } diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss index 46978be8ba0..27b10b536a2 100644 --- a/app/assets/stylesheets/pages/builds.scss +++ b/app/assets/stylesheets/pages/builds.scss @@ -48,7 +48,7 @@ overflow-x: auto; font-size: 12px; border-radius: 0; - border: none; + border: 0; .bash { display: block; diff --git a/app/assets/stylesheets/pages/ci_projects.scss b/app/assets/stylesheets/pages/ci_projects.scss index bf6a48889bf..fbe1f3081a0 100644 --- a/app/assets/stylesheets/pages/ci_projects.scss +++ b/app/assets/stylesheets/pages/ci_projects.scss @@ -36,7 +36,7 @@ pre.commit-message { background: none; padding: 0; - border: none; + border: 0; margin: 20px 0; border-radius: 0; } diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss index ee3ca246374..b1850be8a5f 100644 --- a/app/assets/stylesheets/pages/commits.scss +++ b/app/assets/stylesheets/pages/commits.scss @@ -1,6 +1,6 @@ .commit-description { background: none; - border: none; + border: 0; padding: 0; margin-top: 10px; word-break: normal; @@ -247,7 +247,7 @@ word-break: normal; pre { - border: none; + border: 0; background: inherit; padding: 0; margin: 0; diff --git a/app/assets/stylesheets/pages/cycle_analytics.scss b/app/assets/stylesheets/pages/cycle_analytics.scss index 82d9be29201..292e0ad394b 100644 --- a/app/assets/stylesheets/pages/cycle_analytics.scss +++ b/app/assets/stylesheets/pages/cycle_analytics.scss @@ -80,7 +80,7 @@ .panel { .content-block { padding: 24px 0; - border-bottom: none; + border-bottom: 0; position: relative; @media (max-width: $screen-xs-max) { @@ -222,11 +222,11 @@ } &:first-child { - border-top: none; + border-top: 0; } &:last-child { - border-bottom: none; + border-bottom: 0; } .stage-nav-item-cell { @@ -290,7 +290,7 @@ border-bottom: 1px solid $gray-darker; &:last-child { - border-bottom: none; + border-bottom: 0; margin-bottom: 0; } diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss index 3d9eff35583..538e50ee306 100644 --- a/app/assets/stylesheets/pages/detail_page.scss +++ b/app/assets/stylesheets/pages/detail_page.scss @@ -3,6 +3,7 @@ border-bottom: 1px solid $border-color; color: $gl-text-color; line-height: 34px; + display: flex; a { color: $gl-text-color; diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index faa3d1fb4d5..bce94e09367 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -47,7 +47,7 @@ table { width: 100%; font-family: $monospace_font; - border: none; + border: 0; border-collapse: separate; margin: 0; padding: 0; @@ -105,7 +105,7 @@ .new_line { @include user-select(none); margin: 0; - border: none; + border: 0; padding: 0 5px; border-right: 1px solid; text-align: right; @@ -133,7 +133,7 @@ display: block; margin: 0; padding: 0 1.5em; - border: none; + border: 0; position: relative; &.parallel { @@ -359,7 +359,7 @@ cursor: pointer; &:first-child { - border-left: none; + border-left: 0; } &:hover { @@ -388,7 +388,7 @@ .file-content .diff-file { margin: 0; - border: none; + border: 0; } .diff-wrap-lines .line_content { @@ -400,7 +400,7 @@ } .files-changed { - border-bottom: none; + border-bottom: 0; } .diff-stats-summary-toggler { diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index edfafa79c44..c586dab4cf2 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -3,13 +3,13 @@ border-top: 1px solid $border-color; border-right: 1px solid $border-color; border-left: 1px solid $border-color; - border-bottom: none; + border-bottom: 0; border-radius: $border-radius-small $border-radius-small 0 0; background: $gray-normal; } #editor { - border: none; + border: 0; border-radius: 0; height: 500px; margin: 0; @@ -171,7 +171,7 @@ width: 100%; margin: 5px 0; padding: 0; - border-left: none; + border-left: 0; } } diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss index b5b0f3d9dfa..26c5f093c6b 100644 --- a/app/assets/stylesheets/pages/environments.scss +++ b/app/assets/stylesheets/pages/environments.scss @@ -117,7 +117,7 @@ } .no-btn { - border: none; + border: 0; background: none; outline: none; width: 100%; @@ -133,11 +133,11 @@ } .folder-row { - border-left: none; - border-right: none; + border-left: 0; + border-right: 0; @media (min-width: $screen-sm-max) { - border-top: none; + border-top: 0; } } @@ -256,12 +256,6 @@ padding: 0; padding-bottom: 100%; - .label-axis-text { - fill: $black; - font-weight: $gl-font-weight-normal; - font-size: 10px; - } - .text-metric-usage, .legend-metric-title { fill: $black; @@ -276,19 +270,33 @@ left: 0; top: 0; - .label-axis-text, - .text-metric-usage { + text { + fill: $gl-text-color; + stroke-width: 0; + } + + .text-metric-bold { + font-weight: $gl-font-weight-bold; + } + + .label-axis-text { fill: $black; font-weight: $gl-font-weight-normal; - font-size: 12px; + font-size: 10px; } .legend-axis-text { fill: $black; } - .tick > text { - font-size: 12px; + .tick { + > line { + stroke: $gray-darker; + } + + > text { + font-size: 12px; + } } .text-metric-title { diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index 1723d716805..eea8b7dd193 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -85,7 +85,7 @@ } pre { - border: none; + border: 0; background: $gray-light; border-radius: 0; color: $events-pre-color; @@ -128,14 +128,14 @@ } } - &:last-child { border: none; } + &:last-child { border: 0; } .event_commits { li { &.commit { background: transparent; padding: 0; - border: none; + border: 0; .commit-row-title { font-size: $gl-font-size; diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 7059a4cfe85..760c7c80aff 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -79,7 +79,7 @@ .title { padding: 0; margin-bottom: 16px; - border-bottom: none; + border-bottom: 0; } .btn-edit { @@ -131,12 +131,12 @@ top: $header-height; bottom: 0; right: 0; - transition: width .3s; + transition: width $right-sidebar-transition-duration; background: $gray-light; z-index: 200; overflow: hidden; - a, + a:not(.btn-retry), .btn-link { color: inherit; } @@ -164,7 +164,7 @@ } &:last-child { - border: none; + border: 0; } span { @@ -338,7 +338,7 @@ .block { width: $gutter_collapsed_width - 2px; padding: 15px 0 0; - border-bottom: none; + border-bottom: 0; overflow: hidden; } @@ -399,7 +399,7 @@ } .btn-clipboard { - border: none; + border: 0; color: $issuable-sidebar-color; &:hover { @@ -613,6 +613,8 @@ float: none; display: inline-block; margin-top: 0; + height: auto; + align-self: center; @media (max-width: $screen-xs-max) { position: absolute; @@ -626,6 +628,8 @@ padding-left: 45px; padding-right: 45px; line-height: 35px; + display: flex; + flex-grow: 1; @media (min-width: $screen-sm-min) { float: left; @@ -637,11 +641,12 @@ .issuable-actions { @include new-style-dropdown; - padding-top: 10px; + align-self: center; + flex-shrink: 0; + flex: 0 0 auto; @media (min-width: $screen-sm-min) { float: right; - padding-top: 0; } } @@ -655,8 +660,9 @@ .issuable-meta { display: inline-block; - line-height: 18px; font-size: 14px; + line-height: 24px; + align-self: center; } .js-issuable-selector-wrap { diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index e8ca5cedaee..8bb68ad2425 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -134,11 +134,24 @@ ul.related-merge-requests > li { } @media (max-width: $screen-xs-max) { - .issue-btn-group { - width: 100%; + .detail-page-header, + .issuable-header { + display: block; + + .issuable-meta { + line-height: 18px; + } + } - .btn { + .issuable-actions { + margin-top: 10px; + + .issue-btn-group { width: 100%; + + .btn { + width: 100%; + } } } } diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss index 92d49bd864a..b7985c4dea5 100644 --- a/app/assets/stylesheets/pages/login.scss +++ b/app/assets/stylesheets/pages/login.scss @@ -139,7 +139,7 @@ border-left: 1px solid $border-color; &:first-of-type { - border-left: none; + border-left: 0; border-top-left-radius: $border-radius-default; } @@ -165,7 +165,7 @@ border-bottom: 1px solid $border-color; a { - border: none; + border: 0; border-bottom: 2px solid $link-underline-blue; margin-right: 0; color: $black; diff --git a/app/assets/stylesheets/pages/merge_conflicts.scss b/app/assets/stylesheets/pages/merge_conflicts.scss index dbf3e2b763c..04bde64c752 100644 --- a/app/assets/stylesheets/pages/merge_conflicts.scss +++ b/app/assets/stylesheets/pages/merge_conflicts.scss @@ -262,7 +262,7 @@ $colors: ( .editor { pre { height: 350px; - border: none; + border: 0; border-radius: 0; margin-bottom: 0; } diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 6e485ebad1b..5832cf4637f 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -150,18 +150,6 @@ display: block; } - .mr-widget-body { - @include clearfix; - - &.media > *:first-child { - margin-right: 10px; - } - - .approve-btn { - margin-right: 5px; - } - } - .mr-widget-pipeline-graph { padding: 0 4px; @@ -169,9 +157,8 @@ z-index: 300; } - .ci-action-icon-wrapper svg { - width: 16px; - height: 16px; + .ci-action-icon-wrapper { + line-height: 16px; } } @@ -195,10 +182,6 @@ overflow: hidden; word-break: break-all; - &.media > *:first-child { - margin-right: 10px; - } - &.label-truncated { position: relative; display: inline-block; @@ -216,6 +199,18 @@ background-color: $gray-light; } } + } + + .mr-widget-body { + @include clearfix; + + &.media > *:first-child { + margin-right: 10px; + } + + .approve-btn { + margin-right: 5px; + } h4 { float: left; @@ -239,10 +234,6 @@ margin-right: 7px; } - .approve-btn { - margin-right: 5px; - } - label { font-weight: $gl-font-weight-normal; } @@ -342,17 +333,6 @@ } } - .mini-pipeline-graph-dropdown-menu .mini-pipeline-graph-dropdown-item { - display: flex; - align-items: center; - - .ci-status-text, - .ci-status-icon { - top: 0; - margin-right: 10px; - } - } - .mr-widget-help { padding: 10px 16px 10px 48px; font-style: italic; diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 5127307c5e7..237c71b71f0 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -16,7 +16,7 @@ .discussion { .new-note { margin: 0; - border: none; + border: 0; } } @@ -106,15 +106,35 @@ background-color: $orange-100; border-radius: $border-radius-default $border-radius-default 0 0; border: 1px solid $border-gray-normal; - border-bottom: none; + border-bottom: 0; padding: 3px 12px; margin: auto; align-items: center; + .icon { + margin-right: $issuable-warning-icon-margin; + } + + .md-area { border-top-left-radius: 0; border-top-right-radius: 0; } + + .disabled-comment { + border: none; + border-radius: $label-border-radius; + padding-top: $gl-vert-padding; + padding-bottom: $gl-vert-padding; + + .icon svg { + position: relative; + top: 2px; + margin-right: $btn-xs-side-margin; + width: $gl-font-size; + height: $gl-font-size; + fill: $orange-600; + } + } } .sidebar-item-value { diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index ca363c6eac4..9537eeeee97 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -331,7 +331,7 @@ ul.notes { td { border: 1px solid $white-normal; - border-left: none; + border-left: 0; &.notes_line { vertical-align: middle; @@ -476,6 +476,10 @@ ul.notes { float: none; margin-left: 0; } + + .btn-group > .discussion-next-btn { + margin-left: -1px; + } } .note-actions { @@ -666,7 +670,7 @@ ul.notes { .timeline-entry-inner { padding-left: $gl-padding; padding-right: $gl-padding; - border-bottom: none; + border-bottom: 0; } } } @@ -679,7 +683,7 @@ ul.notes { padding: 90px 0; &.discussion-locked { - border: none; + border: 0; background-color: $white-light; } @@ -759,7 +763,7 @@ ul.notes { top: 0; padding: 0; background-color: transparent; - border: none; + border: 0; outline: 0; color: $gray-darkest; transition: color $general-hover-transition-duration $general-hover-transition-curve; diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss index 2a8cbc61af7..cb24274c612 100644 --- a/app/assets/stylesheets/pages/pipelines.scss +++ b/app/assets/stylesheets/pages/pipelines.scss @@ -179,7 +179,7 @@ * Play button with icon in dropdowns */ .no-btn { - border: none; + border: 0; background: none; outline: none; width: 100%; @@ -288,7 +288,7 @@ .pipeline-actions { @include new-style-dropdown; - border-bottom: none; + border-bottom: 0; } .tab-pane { @@ -318,7 +318,7 @@ } .build-log { - border: none; + border: 0; line-height: initial; } } @@ -386,13 +386,13 @@ // Remove right connecting horizontal line from first build in last stage &:first-child { &::after { - border: none; + border: 0; } } // Remove right curved connectors from all builds in last stage &:not(:first-child) { &::after { - border: none; + border: 0; } } // Remove opposite curve @@ -409,7 +409,7 @@ // Remove left curved connectors from all builds in first stage &:not(:first-child) { &::before { - border: none; + border: 0; } } // Remove opposite curve @@ -518,7 +518,7 @@ .dropdown-menu-toggle { background-color: transparent; - border: none; + border: 0; padding: 0; &:focus { @@ -823,6 +823,11 @@ button.mini-pipeline-graph-dropdown-toggle { margin-left: 2px; display: inline-block; + &::after { + content: ''; + display: block; + } + @media (max-width: $screen-xs-max) { max-width: 60%; } @@ -951,7 +956,7 @@ button.mini-pipeline-graph-dropdown-toggle { .terminal-container { .content-block { - border-bottom: none; + border-bottom: 0; } #terminal { diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss index eab39f698c3..28dc71dc641 100644 --- a/app/assets/stylesheets/pages/profile.scss +++ b/app/assets/stylesheets/pages/profile.scss @@ -113,7 +113,7 @@ li { padding: 3px 0; - border: none; + border: 0; } } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index b0c3474e3d5..aaad6dbba8e 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -80,7 +80,7 @@ .project-feature-settings { background: $gray-lighter; - border-top: none; + border-top: 0; margin-bottom: 16px; } @@ -128,7 +128,7 @@ .project-feature-toggle { position: relative; - border: none; + border: 0; outline: 0; display: block; width: 100px; @@ -483,7 +483,7 @@ a.deploy-project-label { flex: 1; padding: 0; background: transparent; - border: none; + border: 0; line-height: 34px; margin: 0; @@ -1012,7 +1012,7 @@ pre.light-well { margin: 0; border-radius: 0 0 1px 1px; padding: 20px 0; - border: none; + border: 0; } .table-bordered { @@ -1165,7 +1165,7 @@ pre.light-well { table-layout: fixed; &.table-responsive { - border: none; + border: 0; } .variable-key { diff --git a/app/assets/stylesheets/pages/repo.scss b/app/assets/stylesheets/pages/repo.scss index 1bb4e3cc345..fee4638e20f 100644 --- a/app/assets/stylesheets/pages/repo.scss +++ b/app/assets/stylesheets/pages/repo.scss @@ -64,7 +64,7 @@ .monaco-editor.vs { .current-line { - border: none; + border: 0; background: $well-light-border; } @@ -139,7 +139,7 @@ &.active { background: $white-light; - border-bottom: none; + border-bottom: 0; } a { @@ -181,7 +181,7 @@ &.tabs-divider { width: 100%; background-color: $white-light; - border-right: none; + border-right: 0; border-top-right-radius: 2px; } } diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss index eed711b1b66..fe455a04960 100644 --- a/app/assets/stylesheets/pages/search.scss +++ b/app/assets/stylesheets/pages/search.scss @@ -5,7 +5,7 @@ margin-bottom: $gl-padding; &:last-child { - border-bottom: none; + border-bottom: 0; } } @@ -57,7 +57,7 @@ input[type="checkbox"]:hover { } .search-input { - border: none; + border: 0; font-size: 14px; padding: 0 20px 0 0; margin-left: 5px; @@ -78,10 +78,6 @@ input[type="checkbox"]:hover { } .search-input-wrap { - // Fallback if flexbox is not supported - display: inline-block; - width: 100%; - .search-icon, .clear-icon { position: absolute; diff --git a/app/assets/stylesheets/pages/todos.scss b/app/assets/stylesheets/pages/todos.scss index 6c8d87185e9..2139a029fc7 100644 --- a/app/assets/stylesheets/pages/todos.scss +++ b/app/assets/stylesheets/pages/todos.scss @@ -141,7 +141,7 @@ } pre { - border: none; + border: 0; background: $gray-light; border-radius: 0; color: $todo-body-pre-color; diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index e2f6e511c86..50f0ef4414a 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -252,7 +252,7 @@ margin-top: 20px; padding: 0; border-top: 1px solid $white-dark; - border-bottom: none; + border-bottom: 0; } .commit-stats li { diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb index b1ed973d178..9c222549cdc 100644 --- a/app/controllers/concerns/issuable_actions.rb +++ b/app/controllers/concerns/issuable_actions.rb @@ -57,12 +57,11 @@ module IssuableActions def destroy issuable.destroy - destroy_method = "destroy_#{issuable.class.name.underscore}".to_sym - TodoService.new.public_send(destroy_method, issuable, current_user) # rubocop:disable GitlabSecurity/PublicSend + TodoService.new.destroy_issuable(issuable, current_user) name = issuable.human_class_name flash[:notice] = "The #{name} was successfully deleted." - index_path = polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable.class]) + index_path = polymorphic_path([parent, issuable.class]) respond_to do |format| format.html { redirect_to index_path } @@ -164,4 +163,8 @@ module IssuableActions def update_service raise NotImplementedError end + + def parent + @project || @group + end end diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb index 57b45f335fa..3c64fd964ff 100644 --- a/app/controllers/concerns/notes_actions.rb +++ b/app/controllers/concerns/notes_actions.rb @@ -39,7 +39,7 @@ module NotesActions @note = Notes::CreateService.new(note_project, current_user, create_params).execute if @note.is_a?(Note) - Banzai::NoteRenderer.render([@note], @project, current_user) + Notes::RenderService.new(current_user).execute([@note], @project) end respond_to do |format| @@ -52,7 +52,7 @@ module NotesActions @note = Notes::UpdateService.new(project, current_user, note_params).execute(note) if @note.is_a?(Note) - Banzai::NoteRenderer.render([@note], @project, current_user) + Notes::RenderService.new(current_user).execute([@note], @project) end respond_to do |format| diff --git a/app/controllers/concerns/renders_notes.rb b/app/controllers/concerns/renders_notes.rb index 4791bc561a4..824ad06465c 100644 --- a/app/controllers/concerns/renders_notes.rb +++ b/app/controllers/concerns/renders_notes.rb @@ -3,7 +3,7 @@ module RendersNotes preload_noteable_for_regular_notes(notes) preload_max_access_for_authors(notes, @project) preload_first_time_contribution_for_authors(noteable, notes) - Banzai::NoteRenderer.render(notes, @project, current_user) + Notes::RenderService.new(current_user).execute(notes, @project) notes end diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb index cd94a36a6e7..d9884a47ec4 100644 --- a/app/controllers/dashboard/projects_controller.rb +++ b/app/controllers/dashboard/projects_controller.rb @@ -57,5 +57,7 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController @events = EventCollection .new(projects, offset: params[:offset].to_i, filter: event_filter) .to_a + + Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?) end end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 19a5db6fd17..280ed93faf8 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -32,6 +32,8 @@ class DashboardController < Dashboard::ApplicationController @events = EventCollection .new(projects, offset: params[:offset].to_i, filter: @event_filter) .to_a + + Events::RenderService.new(current_user).execute(@events) end def set_show_full_reference diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index bc3e95f1aed..eb53a522f90 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -155,6 +155,8 @@ class GroupsController < Groups::ApplicationController @events = EventCollection .new(@projects, offset: params[:offset].to_i, filter: event_filter) .to_a + + Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?) end def user_actions diff --git a/app/controllers/metrics_controller.rb b/app/controllers/metrics_controller.rb index 37587a52eaf..d81ad135198 100644 --- a/app/controllers/metrics_controller.rb +++ b/app/controllers/metrics_controller.rb @@ -3,10 +3,16 @@ class MetricsController < ActionController::Base protect_from_forgery with: :exception - before_action :validate_prometheus_metrics - def index - render text: metrics_service.metrics_text, content_type: 'text/plain; version=0.0.4' + response = if Gitlab::Metrics.prometheus_metrics_enabled? + metrics_service.metrics_text + else + help_page = help_page_url('administration/monitoring/prometheus/gitlab_metrics', + anchor: 'gitlab-prometheus-metrics' + ) + "# Metrics are disabled, see: #{help_page}\n" + end + render text: response, content_type: 'text/plain; version=0.0.4' end private @@ -14,8 +20,4 @@ class MetricsController < ActionController::Base def metrics_service @metrics_service ||= MetricsService.new end - - def validate_prometheus_metrics - render_404 unless Gitlab::Metrics.prometheus_metrics_enabled? - end end diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb index 0e71977a58a..1269759fc2b 100644 --- a/app/controllers/projects/merge_requests/application_controller.rb +++ b/app/controllers/projects/merge_requests/application_controller.rb @@ -2,7 +2,6 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont before_action :check_merge_requests_available! before_action :merge_request before_action :authorize_read_merge_request! - before_action :ensure_ref_fetched private @@ -10,12 +9,6 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont @issuable = @merge_request ||= @project.merge_requests.find_by!(iid: params[:id]) end - # Make sure merge requests created before 8.0 - # have head file in refs/merge-requests/ - def ensure_ref_fetched - @merge_request.ensure_ref_fetched if Gitlab::Database.read_write? - end - def merge_request_params params.require(:merge_request).permit(merge_request_params_attributes) end diff --git a/app/controllers/projects/merge_requests/creations_controller.rb b/app/controllers/projects/merge_requests/creations_controller.rb index 99dc3dda9e7..129682f64aa 100644 --- a/app/controllers/projects/merge_requests/creations_controller.rb +++ b/app/controllers/projects/merge_requests/creations_controller.rb @@ -4,7 +4,6 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap include RendersCommits skip_before_action :merge_request - skip_before_action :ensure_ref_fetched before_action :authorize_create_merge_request! before_action :apply_diff_view_cookie!, only: [:diffs, :diff_for_path] before_action :build_merge_request, except: [:create] diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 17cac69e588..c86acae8fe4 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -7,7 +7,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo include IssuableCollections skip_before_action :merge_request, only: [:index, :bulk_update] - skip_before_action :ensure_ref_fetched, only: [:index, :bulk_update] before_action :authorize_update_issuable!, only: [:close, :edit, :update, :remove_wip, :sort] @@ -52,7 +51,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo def show validates_merge_request - ensure_ref_fetched close_merge_request_without_source_project check_if_can_be_merged diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index db543d688a0..1688121e27e 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -300,6 +300,8 @@ class ProjectsController < Projects::ApplicationController @events = EventCollection .new(projects, offset: params[:offset].to_i, filter: event_filter) .to_a + + Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?) end def project_params diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 4ee855806ab..5fca31b4956 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -108,6 +108,8 @@ class UsersController < ApplicationController .references(:project) .with_associations .limit_recent(20, params[:offset]) + + Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?) end def load_projects diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index fd88e0d794a..079b3cd3aa0 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -172,16 +172,6 @@ module EventsHelper end end - def event_note(text, options = {}) - text = first_line_in_markdown(text, 150, options) - - sanitize( - text, - tags: %w(a img gl-emoji b pre code p span), - attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + ['style', 'data-src', 'data-name', 'data-unicode-version'] - ) - end - def event_commit_title(message) message ||= '' (message.split("\n").first || "").truncate(70) diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb index 46bced00c72..2c85d7d7720 100644 --- a/app/helpers/markup_helper.rb +++ b/app/helpers/markup_helper.rb @@ -69,10 +69,16 @@ module MarkupHelper # as Markdown. HTML tags in the parsed output are not counted toward the # +max_chars+ limit. If the length limit falls within a tag's contents, then # the tag contents are truncated without removing the closing tag. - def first_line_in_markdown(text, max_chars = nil, options = {}) - md = markdown(text, options).strip + def first_line_in_markdown(object, attribute, max_chars = nil, options = {}) + md = markdown_field(object, attribute, options) - truncate_visible(md, max_chars || md.length) if md.present? + text = truncate_visible(md, max_chars || md.length) if md.present? + + sanitize( + text, + tags: %w(a img gl-emoji b pre code p span), + attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + ['style', 'data-src', 'data-name', 'data-unicode-version'] + ) end def markdown(text, context = {}) @@ -83,15 +89,17 @@ module MarkupHelper prepare_for_rendering(html, context) end - def markdown_field(object, field) + def markdown_field(object, field, context = {}) object = object.for_display if object.respond_to?(:for_display) redacted_field_html = object.try(:"redacted_#{field}_html") return '' unless object.present? return redacted_field_html if redacted_field_html - html = Banzai.render_field(object, field) - prepare_for_rendering(html, object.banzai_render_context(field)) + html = Banzai.render_field(object, field, context) + context.reverse_merge!(object.banzai_render_context(field)) if object.respond_to?(:banzai_render_context) + + prepare_for_rendering(html, context) end def markup(file_name, text, context = {}) @@ -218,7 +226,7 @@ module MarkupHelper data: data, title: options[:title], aria: { label: options[:title] } do - icon(options[:icon]) + sprite_icon(options[:icon]) end end diff --git a/app/models/concerns/ignorable_column.rb b/app/models/concerns/ignorable_column.rb index eb9f3423e48..03793e8bcbb 100644 --- a/app/models/concerns/ignorable_column.rb +++ b/app/models/concerns/ignorable_column.rb @@ -21,8 +21,8 @@ module IgnorableColumn @ignored_columns ||= Set.new end - def ignore_column(name) - ignored_columns << name.to_s + def ignore_column(*names) + ignored_columns.merge(names.map(&:to_s)) end end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 3133dc9e7eb..f80601f3484 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -8,7 +8,8 @@ class MergeRequest < ActiveRecord::Base include CreatedAtFilterable include TimeTrackable - ignore_column :locked_at + ignore_column :locked_at, + :ref_fetched belongs_to :target_project, class_name: "Project" belongs_to :source_project, class_name: "Project" @@ -426,7 +427,7 @@ class MergeRequest < ActiveRecord::Base end def create_merge_request_diff - fetch_ref + fetch_ref! # n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37435 Gitlab::GitalyClient.allow_n_plus_1_calls do @@ -811,29 +812,14 @@ class MergeRequest < ActiveRecord::Base end end - def fetch_ref - write_ref - update_column(:ref_fetched, true) + def fetch_ref! + target_project.repository.fetch_source_branch!(source_project.repository, source_branch, ref_path) end def ref_path "refs/#{Repository::REF_MERGE_REQUEST}/#{iid}/head" end - def ref_fetched? - super || - begin - computed_value = project.repository.ref_exists?(ref_path) - update_column(:ref_fetched, true) if computed_value - - computed_value - end - end - - def ensure_ref_fetched - fetch_ref unless ref_fetched? - end - def in_locked_state begin lock_mr @@ -975,10 +961,4 @@ class MergeRequest < ActiveRecord::Base project.merge_requests.merged.where(author_id: author_id).empty? end - - private - - def write_ref - target_project.repository.fetch_source_branch(source_project.repository, source_branch, ref_path) - end end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 0601a61a926..4d401e7ba18 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -36,7 +36,7 @@ class Namespace < ActiveRecord::Base validates :path, presence: true, length: { maximum: 255 }, - dynamic_path: true + namespace_path: true validate :nesting_level_allowed diff --git a/app/models/project.rb b/app/models/project.rb index fe712ac3d48..110326ebb8e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -243,10 +243,8 @@ class Project < ActiveRecord::Base message: Gitlab::Regex.project_name_regex_message } validates :path, presence: true, - dynamic_path: true, + project_path: true, length: { maximum: 255 }, - format: { with: Gitlab::PathRegex.project_path_format_regex, - message: Gitlab::PathRegex.project_path_format_message }, uniqueness: { scope: :namespace_id } validates :namespace, presence: true diff --git a/app/models/repository.rb b/app/models/repository.rb index 69cddb36b2e..ef715d982ae 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -969,8 +969,8 @@ class Repository gitlab_shell.fetch_remote(raw_repository, remote, ssh_auth: ssh_auth, forced: forced, no_tags: no_tags) end - def fetch_source_branch(source_repository, source_branch, local_ref) - raw_repository.fetch_source_branch(source_repository.raw_repository, source_branch, local_ref) + def fetch_source_branch!(source_repository, source_branch, local_ref) + raw_repository.fetch_source_branch!(source_repository.raw_repository, source_branch, local_ref) end def compare_source_branch(target_branch_name, source_repository, source_branch_name, straight:) diff --git a/app/models/user.rb b/app/models/user.rb index bcda4564595..aa88cda4dc0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -146,7 +146,7 @@ class User < ActiveRecord::Base presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: Gitlab::Database::MAX_INT_VALUE } validates :username, - dynamic_path: true, + user_path: true, presence: true, uniqueness: { case_sensitive: false } @@ -164,7 +164,7 @@ class User < ActiveRecord::Base before_validation :set_notification_email, if: :email_changed? before_validation :set_public_email, if: :public_email_changed? before_save :ensure_incoming_email_token - before_save :ensure_user_rights_and_limits, if: :external_changed? + before_save :ensure_user_rights_and_limits, if: ->(user) { user.new_record? || user.external_changed? } before_save :skip_reconfirmation!, if: ->(user) { user.email_changed? && user.read_only_attribute?(:email) } before_save :check_for_verified_email, if: ->(user) { user.email_changed? && !user.new_record? } after_save :ensure_namespace_correct @@ -1139,8 +1139,9 @@ class User < ActiveRecord::Base self.can_create_group = false self.projects_limit = 0 else - self.can_create_group = gitlab_config.default_can_create_group - self.projects_limit = current_application_settings.default_projects_limit + # Only revert these back to the default if they weren't specifically changed in this update. + self.can_create_group = gitlab_config.default_can_create_group unless can_create_group_changed? + self.projects_limit = current_application_settings.default_projects_limit unless projects_limit_changed? end end diff --git a/app/services/base_renderer.rb b/app/services/base_renderer.rb new file mode 100644 index 00000000000..d6e30bd7008 --- /dev/null +++ b/app/services/base_renderer.rb @@ -0,0 +1,7 @@ +class BaseRenderer + attr_reader :current_user + + def initialize(current_user = nil) + @current_user = current_user + end +end diff --git a/app/services/events/render_service.rb b/app/services/events/render_service.rb new file mode 100644 index 00000000000..0b62d8aedf1 --- /dev/null +++ b/app/services/events/render_service.rb @@ -0,0 +1,21 @@ +module Events + class RenderService < BaseRenderer + def execute(events, atom_request: false) + events.map(&:note).compact.group_by(&:project).each do |project, notes| + render_notes(notes, project, atom_request) + end + end + + private + + def render_notes(notes, project, atom_request) + Notes::RenderService.new(current_user).execute(notes, project, render_options(atom_request)) + end + + def render_options(atom_request) + return {} unless atom_request + + { only_path: false, xhtml: true } + end + end +end diff --git a/app/services/notes/render_service.rb b/app/services/notes/render_service.rb new file mode 100644 index 00000000000..a77e98c2b07 --- /dev/null +++ b/app/services/notes/render_service.rb @@ -0,0 +1,21 @@ +module Notes + class RenderService < BaseRenderer + # Renders a collection of Note instances. + # + # notes - The notes to render. + # project - The project to use for redacting. + # user - The user viewing the notes. + + # Possible options: + # requested_path - The request path. + # project_wiki - The project's wiki. + # ref - The current Git reference. + # only_path - flag to turn relative paths into absolute ones. + # xhtml - flag to save the html in XHTML + def execute(notes, project, **opts) + renderer = Banzai::ObjectRenderer.new(project, current_user, **opts) + + renderer.render(notes, :note) + end + end +end diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index b6125cafa83..e694c5761da 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -31,12 +31,12 @@ class TodoService mark_pending_todos_as_done(issue, current_user) end - # When we destroy an issue we should: + # When we destroy an issuable we should: # # * refresh the todos count cache for the current user # - def destroy_issue(issue, current_user) - destroy_issuable(issue, current_user) + def destroy_issuable(issuable, user) + user.update_todos_count_cache end # When we reassign an issue we should: @@ -72,14 +72,6 @@ class TodoService mark_pending_todos_as_done(merge_request, current_user) end - # When we destroy a merge request we should: - # - # * refresh the todos count cache for the current user - # - def destroy_merge_request(merge_request, current_user) - destroy_issuable(merge_request, current_user) - end - # When we reassign a merge request we should: # # * creates a pending todo for new assignee if merge request is assigned @@ -234,10 +226,6 @@ class TodoService create_mention_todos(issuable.project, issuable, author, nil, skip_users) end - def destroy_issuable(issuable, user) - user.update_todos_count_cache - end - def toggling_tasks?(issuable) issuable.previous_changes.include?('description') && issuable.tasks? && issuable.updated_tasks.any? diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb index 3a9c151cf9b..976017dfa82 100644 --- a/app/services/users/migrate_to_ghost_user_service.rb +++ b/app/services/users/migrate_to_ghost_user_service.rb @@ -25,7 +25,7 @@ module Users user.block # Reverse the user block if record migration fails - if !migrate_records && transition + if !migrate_records_in_transaction && transition transition.rollback user.save! end @@ -36,18 +36,22 @@ module Users private - def migrate_records + def migrate_records_in_transaction user.transaction(requires_new: true) do @ghost_user = User.ghost - migrate_issues - migrate_merge_requests - migrate_notes - migrate_abuse_reports - migrate_award_emojis + migrate_records end end + def migrate_records + migrate_issues + migrate_merge_requests + migrate_notes + migrate_abuse_reports + migrate_award_emojis + end + def migrate_issues user.issues.update_all(author_id: ghost_user.id) Issue.where(last_edited_by_id: user.id).update_all(last_edited_by_id: ghost_user.id) diff --git a/app/validators/abstract_path_validator.rb b/app/validators/abstract_path_validator.rb new file mode 100644 index 00000000000..adbccb65a84 --- /dev/null +++ b/app/validators/abstract_path_validator.rb @@ -0,0 +1,38 @@ +class AbstractPathValidator < ActiveModel::EachValidator + extend Gitlab::EncodingHelper + + def self.path_regex + raise NotImplementedError + end + + def self.format_regex + raise NotImplementedError + end + + def self.format_error_message + raise NotImplementedError + end + + def self.full_path(record, value) + value + end + + def self.valid_path?(path) + encode!(path) + "#{path}/" =~ path_regex + end + + def validate_each(record, attribute, value) + unless value =~ self.class.format_regex + record.errors.add(attribute, self.class.format_error_message) + return + end + + full_path = self.class.full_path(record, value) + return unless full_path + + unless self.class.valid_path?(full_path) + record.errors.add(attribute, "#{value} is a reserved name") + end + end +end diff --git a/app/validators/dynamic_path_validator.rb b/app/validators/dynamic_path_validator.rb deleted file mode 100644 index 4688aabc2a8..00000000000 --- a/app/validators/dynamic_path_validator.rb +++ /dev/null @@ -1,53 +0,0 @@ -# DynamicPathValidator -# -# Custom validator for GitLab path values. -# These paths are assigned to `Namespace` (& `Group` as a subclass) & `Project` -# -# Values are checked for formatting and exclusion from a list of illegal path -# names. -class DynamicPathValidator < ActiveModel::EachValidator - extend Gitlab::EncodingHelper - - class << self - def valid_user_path?(path) - encode!(path) - "#{path}/" =~ Gitlab::PathRegex.root_namespace_path_regex - end - - def valid_group_path?(path) - encode!(path) - "#{path}/" =~ Gitlab::PathRegex.full_namespace_path_regex - end - - def valid_project_path?(path) - encode!(path) - "#{path}/" =~ Gitlab::PathRegex.full_project_path_regex - end - end - - def path_valid_for_record?(record, value) - full_path = record.respond_to?(:build_full_path) ? record.build_full_path : value - - return true unless full_path - - case record - when Project - self.class.valid_project_path?(full_path) - when Group - self.class.valid_group_path?(full_path) - else # User or non-Group Namespace - self.class.valid_user_path?(full_path) - end - end - - def validate_each(record, attribute, value) - unless value =~ Gitlab::PathRegex.namespace_format_regex - record.errors.add(attribute, Gitlab::PathRegex.namespace_format_message) - return - end - - unless path_valid_for_record?(record, value) - record.errors.add(attribute, "#{value} is a reserved name") - end - end -end diff --git a/app/validators/namespace_path_validator.rb b/app/validators/namespace_path_validator.rb new file mode 100644 index 00000000000..4a0aa64ae0c --- /dev/null +++ b/app/validators/namespace_path_validator.rb @@ -0,0 +1,19 @@ +class NamespacePathValidator < AbstractPathValidator + extend Gitlab::EncodingHelper + + def self.path_regex + Gitlab::PathRegex.full_namespace_path_regex + end + + def self.format_regex + Gitlab::PathRegex.namespace_format_regex + end + + def self.format_error_message + Gitlab::PathRegex.namespace_format_message + end + + def self.full_path(record, value) + record.build_full_path + end +end diff --git a/app/validators/project_path_validator.rb b/app/validators/project_path_validator.rb new file mode 100644 index 00000000000..829b596ad3c --- /dev/null +++ b/app/validators/project_path_validator.rb @@ -0,0 +1,19 @@ +class ProjectPathValidator < AbstractPathValidator + extend Gitlab::EncodingHelper + + def self.path_regex + Gitlab::PathRegex.full_project_path_regex + end + + def self.format_regex + Gitlab::PathRegex.project_path_format_regex + end + + def self.format_error_message + Gitlab::PathRegex.project_path_format_message + end + + def self.full_path(record, value) + record.build_full_path + end +end diff --git a/app/validators/user_path_validator.rb b/app/validators/user_path_validator.rb new file mode 100644 index 00000000000..adf02901802 --- /dev/null +++ b/app/validators/user_path_validator.rb @@ -0,0 +1,15 @@ +class UserPathValidator < AbstractPathValidator + extend Gitlab::EncodingHelper + + def self.path_regex + Gitlab::PathRegex.root_namespace_path_regex + end + + def self.format_regex + Gitlab::PathRegex.namespace_format_regex + end + + def self.format_error_message + Gitlab::PathRegex.namespace_format_message + end +end diff --git a/app/views/admin/background_jobs/show.html.haml b/app/views/admin/background_jobs/show.html.haml index 3ef8f2a3acb..f0cc4d7ee62 100644 --- a/app/views/admin/background_jobs/show.html.haml +++ b/app/views/admin/background_jobs/show.html.haml @@ -42,4 +42,4 @@ .panel.panel-default - %iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: none" } + %iframe{ src: sidekiq_path, width: '100%', height: 970, style: "border: 0" } diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml index 38fd053ae65..efe1fb99efc 100644 --- a/app/views/dashboard/todos/_todo.html.haml +++ b/app/views/dashboard/todos/_todo.html.haml @@ -36,7 +36,7 @@ .todo-body .todo-note .md - = event_note(todo.body, project: todo.project) + = first_line_in_markdown(todo, :body, 150, project: todo.project) - if todo.pending? .todo-actions diff --git a/app/views/events/_event_note.atom.haml b/app/views/events/_event_note.atom.haml index 6fa2f9bd4db..7e264eb5575 100644 --- a/app/views/events/_event_note.atom.haml +++ b/app/views/events/_event_note.atom.haml @@ -1,2 +1,2 @@ %div{ xmlns: "http://www.w3.org/1999/xhtml" } - = markdown(note.note, pipeline: :atom, project: note.project, author: note.author) + = markdown_field(note, :note) diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index df4b9562215..de6383e4097 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -10,7 +10,7 @@ .event-body .event-note .md - = event_note(event.target.note, project: event.project) + = first_line_in_markdown(event.target, :note, 150, project: event.project) - note = event.target - if note.attachment.url - if note.attachment.image? diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml index 29387d6627e..4c5cc249159 100644 --- a/app/views/layouts/_search.html.haml +++ b/app/views/layouts/_search.html.haml @@ -5,7 +5,7 @@ - if @group && @group.persisted? && @group.path - group_data_attrs = { group_path: j(@group.path), name: @group.name, issues_path: issues_group_path(j(@group.path)), mr_path: merge_requests_group_path(j(@group.path)) } - if @project && @project.persisted? - - project_data_attrs = { project_path: j(@project.path), name: j(@project.name), issues_path: project_issues_path(@project), mr_path: project_merge_requests_path(@project) } + - project_data_attrs = { project_path: j(@project.path), name: j(@project.name), issues_path: project_issues_path(@project), mr_path: project_merge_requests_path(@project), issues_disabled: !@project.issues_enabled? } .search.search-form{ class: "#{'has-location-badge' if label.present?}" } = form_tag search_path, method: :get, class: 'navbar-form' do |f| .search-input-container diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index 770608eddff..f8a2ea18989 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -19,16 +19,16 @@ %li.pull-right .toolbar-group - = markdown_toolbar_button({ icon: "bold fw", data: { "md-tag" => "**" }, title: "Add bold text" }) - = markdown_toolbar_button({ icon: "italic fw", data: { "md-tag" => "*" }, title: "Add italic text" }) - = markdown_toolbar_button({ icon: "quote-right fw", data: { "md-tag" => "> ", "md-prepend" => true }, title: "Insert a quote" }) - = markdown_toolbar_button({ icon: "code fw", data: { "md-tag" => "`", "md-block" => "```" }, title: "Insert code" }) - = markdown_toolbar_button({ icon: "list-ul fw", data: { "md-tag" => "* ", "md-prepend" => true }, title: "Add a bullet list" }) - = markdown_toolbar_button({ icon: "list-ol fw", data: { "md-tag" => "1. ", "md-prepend" => true }, title: "Add a numbered list" }) - = markdown_toolbar_button({ icon: "check-square-o fw", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: "Add a task list" }) + = markdown_toolbar_button({ icon: "bold", data: { "md-tag" => "**" }, title: "Add bold text" }) + = markdown_toolbar_button({ icon: "italic", data: { "md-tag" => "*" }, title: "Add italic text" }) + = markdown_toolbar_button({ icon: "quote", data: { "md-tag" => "> ", "md-prepend" => true }, title: "Insert a quote" }) + = markdown_toolbar_button({ icon: "code", data: { "md-tag" => "`", "md-block" => "```" }, title: "Insert code" }) + = markdown_toolbar_button({ icon: "list-bulleted", data: { "md-tag" => "* ", "md-prepend" => true }, title: "Add a bullet list" }) + = markdown_toolbar_button({ icon: "list-numbered", data: { "md-tag" => "1. ", "md-prepend" => true }, title: "Add a numbered list" }) + = markdown_toolbar_button({ icon: "task-done", data: { "md-tag" => "* [ ] ", "md-prepend" => true }, title: "Add a task list" }) .toolbar-group %button.toolbar-btn.js-zen-enter.has-tooltip{ type: "button", tabindex: -1, aria: { label: "Go full screen" }, title: "Go full screen", data: { container: "body" } } - = icon("arrows-alt fw") + = sprite_icon("screen-full") .md-write-holder = yield diff --git a/app/views/projects/commit/_ajax_signature.html.haml b/app/views/projects/commit/_ajax_signature.html.haml index 83821326aec..1d6a0fa38ca 100644 --- a/app/views/projects/commit/_ajax_signature.html.haml +++ b/app/views/projects/commit/_ajax_signature.html.haml @@ -1,2 +1,2 @@ - if commit.has_signature? - %button{ class: commit_signature_badge_classes('js-loading-gpg-badge'), data: { toggle: 'tooltip', placement: 'auto top', title: 'GPG signature (loading...)', 'commit-sha' => commit.sha } } + %a{ href: '#', tabindex: 0, class: commit_signature_badge_classes('js-loading-gpg-badge'), data: { toggle: 'tooltip', placement: 'auto top', title: 'GPG signature (loading...)', 'commit-sha' => commit.sha } } diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml index edff018ba6d..b6b7aae6f9a 100644 --- a/app/views/projects/commit/_signature_badge.html.haml +++ b/app/views/projects/commit/_signature_badge.html.haml @@ -24,5 +24,5 @@ = link_to('Learn more about signing commits', help_page_path('user/project/repository/gpg_signed_commits/index.md'), class: 'gpg-popover-help-link') -%button{ class: css_classes, data: { toggle: 'popover', html: 'true', placement: 'auto top', title: title, content: content } } +%a{ href: '#', tabindex: 0, class: css_classes, data: { toggle: 'popover', html: 'true', placement: 'auto top', title: title, content: content } } = label diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml index e1b4a49850a..4f78102be0c 100644 --- a/app/views/projects/issues/_new_branch.html.haml +++ b/app/views/projects/issues/_new_branch.html.haml @@ -1,3 +1,7 @@ +- can_create_merge_request = can?(current_user, :create_merge_request, @project) +- data_action = can_create_merge_request ? 'create-mr' : 'create-branch' +- value = can_create_merge_request ? 'Create a merge request' : 'Create a branch' + - if can?(current_user, :push_code, @project) .create-mr-dropdown-wrap{ data: { can_create_path: can_create_branch_project_issue_path(@project, @issue), create_mr_path: create_merge_request_project_issue_path(@project, @issue), create_branch_path: project_branches_path(@project, branch_name: @issue.to_branch_name, issue_iid: @issue.iid) } } .btn-group.unavailable @@ -6,20 +10,21 @@ %span.text Checking branch availability… .btn-group.available.hide - %input.btn.js-create-merge-request.btn-inverted.btn-success{ type: 'button', value: 'Create a merge request', data: { action: 'create-mr' } } + %input.btn.js-create-merge-request.btn-inverted.btn-success{ type: 'button', value: value, data: { action: data_action } } %button.btn.btn-inverted.dropdown-toggle.btn-inverted.btn-success.js-dropdown-toggle{ type: 'button', data: { 'dropdown-trigger' => '#create-merge-request-dropdown' } } = icon('caret-down') %ul#create-merge-request-dropdown.dropdown-menu.dropdown-menu-align-right{ data: { dropdown: true } } - %li.droplab-item-selected{ role: 'button', data: { value: 'create-mr', 'text' => 'Create a merge request' } } - .menu-item - .icon-container - = icon('check') - .description - %strong Create a merge request - %span - Creates a merge request named after this issue, with source branch created from '#{@project.default_branch}'. - %li.divider.droplab-item-ignore - %li{ role: 'button', data: { value: 'create-branch', 'text' => 'Create a branch' } } + - if can_create_merge_request + %li.droplab-item-selected{ role: 'button', data: { value: 'create-mr', 'text' => 'Create a merge request' } } + .menu-item + .icon-container + = icon('check') + .description + %strong Create a merge request + %span + Creates a merge request named after this issue, with source branch created from '#{@project.default_branch}'. + %li.divider.droplab-item-ignore + %li{ class: [!can_create_merge_request && 'droplab-item-selected'], role: 'button', data: { value: 'create-branch', 'text' => 'Create a branch' } } .menu-item .icon-container = icon('check') diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 1927216e191..467f19b4c56 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -7,7 +7,7 @@ - if protected_tag?(@project, tag) %span.label.label-success.prepend-left-4 - protected + = s_('TagsPage|protected') - if tag.message.present? @@ -18,7 +18,7 @@ = render 'projects/branches/commit', commit: commit, project: @project - else %p - Cant find HEAD commit for this tag + = s_("TagsPage|Can't find HEAD commit for this tag") - if release && release.description.present? .description.prepend-top-default .wiki @@ -28,9 +28,9 @@ = render 'projects/buttons/download', project: @project, ref: tag.name, pipeline: @tags_pipelines[tag.name] - if can?(current_user, :push_code, @project) - = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn has-tooltip', title: "Edit release notes", data: { container: "body" } do + = link_to edit_project_tag_release_path(@project, tag.name), class: 'btn has-tooltip', title: s_('TagsPage|Edit release notes'), data: { container: "body" } do = icon("pencil") - if can?(current_user, :admin_project, @project) - = link_to project_tag_path(@project, tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, tag) ? 'disabled' : ''}", title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{tag.name}' tag cannot be undone. Are you sure?", container: 'body' }, remote: true do + = link_to project_tag_path(@project, tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, tag) ? 'disabled' : ''}", title: s_('TagsPage|Delete tag'), method: :delete, data: { confirm: s_('TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?') % { tag_name: tag.name }, container: 'body' }, remote: true do = icon("trash-o") diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index 27d58d4c0e8..fd3b8c01b83 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -1,16 +1,16 @@ - @no_container = true - @sort ||= sort_value_recently_updated -- page_title "Tags" +- page_title _('TagsPage|Tags') - add_to_breadcrumbs("Repository", project_tree_path(@project)) .flex-list{ class: container_class } .top-area.adjust .nav-text.row-main-content - Tags give the ability to mark specific points in history as being important + = s_('TagsPage|Tags give the ability to mark specific points in history as being important') .nav-controls.row-fixed-content = form_tag(filter_tags_path, method: :get) do - = search_field_tag :search, params[:search], { placeholder: 'Filter by tag name', id: 'tag-search', class: 'form-control search-text-input input-short', spellcheck: false } + = search_field_tag :search, params[:search], { placeholder: s_('TagsPage|Filter by tag name'), id: 'tag-search', class: 'form-control search-text-input input-short', spellcheck: false } .dropdown %button.dropdown-toggle{ type: 'button', data: { toggle: 'dropdown'} } @@ -19,13 +19,13 @@ = icon('chevron-down') %ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable %li.dropdown-header - Sort by + = s_('TagsPage|Sort by') - tags_sort_options_hash.each do |value, title| %li = link_to title, filter_tags_path(sort: value), class: ("is-active" if @sort == value) - if can?(current_user, :push_code, @project) = link_to new_project_tag_path(@project), class: 'btn btn-create new-tag-btn' do - New tag + = s_('TagsPage|New tag') .tags - if @tags.any? @@ -36,9 +36,9 @@ - else .nothing-here-block - Repository has no tags yet. + = s_('TagsPage|Repository has no tags yet.') %br %small - Use git tag command to add a new one: + = s_('TagsPage|Use git tag command to add a new one:') %br %span.monospace git tag -a v1.4 -m 'version 1.4' diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index 521b4d927bc..3e99e0e8234 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -1,4 +1,4 @@ -- page_title "New Tag" +- page_title s_('TagsPage|New Tag') - default_ref = params[:ref] || @project.default_branch - if @error @@ -7,7 +7,7 @@ = @error %h3.page-title - New Tag + = s_('TagsPage|New Tag') %hr = form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal common-note-form tag-form js-quick-submit js-requires-input" do @@ -23,20 +23,23 @@ = button_tag type: 'button', title: default_ref, class: 'dropdown-menu-toggle wide form-control js-branch-select', required: true, data: { toggle: 'dropdown', selected: default_ref, field_name: 'ref' } do .text-left.dropdown-toggle-text= default_ref = render 'shared/ref_dropdown', dropdown_class: 'wide' - .help-block Existing branch name, tag, or commit SHA + .help-block + = s_('TagsPage|Existing branch name, tag, or commit SHA') .form-group = label_tag :message, nil, class: 'control-label' .col-sm-10 = text_area_tag :message, @message, required: false, tabindex: 3, class: 'form-control', rows: 5 - .help-block Optionally, add a message to the tag. + .help-block + = s_('TagsPage|Optionally, add a message to the tag.') %hr .form-group = label_tag :release_description, 'Release notes', class: 'control-label' .col-sm-10 = render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do - = render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: "Write your release notes or drag files here...", current_text: @release_description + = render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: s_('TagsPage|Write your release notes or drag files here...'), current_text: @release_description = render 'shared/notes/hints' - .help-block Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page. + .help-block + = s_('TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page.') .form-actions = button_tag 'Create tag', class: 'btn btn-create', tabindex: 3 = link_to 'Cancel', project_tags_path(@project), class: 'btn btn-cancel' diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml index 43aa2b27af6..dfe2c37ed8e 100644 --- a/app/views/projects/tags/show.html.haml +++ b/app/views/projects/tags/show.html.haml @@ -1,7 +1,7 @@ - @no_container = true -- add_to_breadcrumbs "Tags", project_tags_path(@project) +- add_to_breadcrumbs s_('TagsPage|Tags'), project_tags_path(@project) - breadcrumb_title @tag.name -- page_title @tag.name, "Tags" +- page_title @tag.name, s_('TagsPage|Tags') %div{ class: container_class } .top-area.multi-line @@ -12,25 +12,25 @@ = @tag.name - if protected_tag?(@project, @tag) %span.label.label-success - protected + = s_('TagsPage|protected') - if @commit = render 'projects/branches/commit', commit: @commit, project: @project - else - Cant find HEAD commit for this tag + = s_("TagsPage|Can't find HEAD commit for this tag") .nav-controls.controls-flex - if can?(current_user, :push_code, @project) - = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Edit release notes' do + = link_to edit_project_tag_release_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Edit release notes') do = icon("pencil") - = link_to project_tree_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Browse files' do + = link_to project_tree_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse files') do = icon('files-o') - = link_to project_commits_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: 'Browse commits' do + = link_to project_commits_path(@project, @tag.name), class: 'btn controls-item has-tooltip', title: s_('TagsPage|Browse commits') do = icon('history') .btn-container.controls-item = render 'projects/buttons/download', project: @project, ref: @tag.name - if can?(current_user, :admin_project, @project) .btn-container.controls-item-full - = link_to project_tag_path(@project, @tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, @tag) ? 'disabled' : ''}", title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{@tag.name}' tag cannot be undone. Are you sure?" } do + = link_to project_tag_path(@project, @tag.name), class: "btn btn-remove remove-row has-tooltip #{protected_tag?(@project, @tag) ? 'disabled' : ''}", title: s_('TagsPage|Delete tag'), method: :delete, data: { confirm: s_('TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?') % { tag_name: @tag.name } } do %i.fa.fa-trash-o - if @tag.message.present? @@ -43,4 +43,4 @@ .wiki = markdown_field(@release, :description) - else - This tag has no release notes. + = s_('TagsPage|This tag has no release notes.') diff --git a/changelogs/unreleased/20666-404-error-issue-assigned-with-issues-disabled.yml b/changelogs/unreleased/20666-404-error-issue-assigned-with-issues-disabled.yml new file mode 100644 index 00000000000..830a275bfd5 --- /dev/null +++ b/changelogs/unreleased/20666-404-error-issue-assigned-with-issues-disabled.yml @@ -0,0 +1,6 @@ +--- +title: Fixes 404 error to 'Issues assigned to me' and 'Issues I've created' when issues + are disabled +merge_request: 15021 +author: Jacopo Beschi @jacopo-beschi +type: fixed diff --git a/changelogs/unreleased/27375-dashboard-activity-performance.yml b/changelogs/unreleased/27375-dashboard-activity-performance.yml new file mode 100644 index 00000000000..87c6197a24d --- /dev/null +++ b/changelogs/unreleased/27375-dashboard-activity-performance.yml @@ -0,0 +1,5 @@ +--- +title: Improve DashboardController#activity.json performance +merge_request: 14985 +author: +type: performance diff --git a/changelogs/unreleased/34768-fix-issuable-header-wrapping.yml b/changelogs/unreleased/34768-fix-issuable-header-wrapping.yml new file mode 100644 index 00000000000..49195bd4168 --- /dev/null +++ b/changelogs/unreleased/34768-fix-issuable-header-wrapping.yml @@ -0,0 +1,5 @@ +--- +title: Fix problem with issuable header wrapping when content is too long +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml b/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml new file mode 100644 index 00000000000..57ddd8f8388 --- /dev/null +++ b/changelogs/unreleased/38247-hide-create-mr-button-in-issue-show.yml @@ -0,0 +1,5 @@ +--- +title: Remove create MR button from issues when MRs are disabled +merge_request: 15071 +author: George Andrinopoulos +type: fixed diff --git a/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml b/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml new file mode 100644 index 00000000000..c7e840f0723 --- /dev/null +++ b/changelogs/unreleased/38385-gpg-tooltips-not-working-in-safari.yml @@ -0,0 +1,5 @@ +--- +title: Fix GPG signature popup info in Safari and Firefox +merge_request: 15228 +author: +type: fixed diff --git a/changelogs/unreleased/38589-internationalize-tags-page.yml b/changelogs/unreleased/38589-internationalize-tags-page.yml new file mode 100644 index 00000000000..4af3da8c23c --- /dev/null +++ b/changelogs/unreleased/38589-internationalize-tags-page.yml @@ -0,0 +1,5 @@ +--- +title: Internationalized tags page +merge_request: 38589 +author: +type: other diff --git a/changelogs/unreleased/39668-tooltip-safari.yml b/changelogs/unreleased/39668-tooltip-safari.yml new file mode 100644 index 00000000000..5a0f677cf10 --- /dev/null +++ b/changelogs/unreleased/39668-tooltip-safari.yml @@ -0,0 +1,5 @@ +--- +title: Remove native title tooltip in pipeline jobs dropdown in Safari +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/39757-border-zero-of-scss-lint.yml b/changelogs/unreleased/39757-border-zero-of-scss-lint.yml new file mode 100644 index 00000000000..ef0ac6c7df9 --- /dev/null +++ b/changelogs/unreleased/39757-border-zero-of-scss-lint.yml @@ -0,0 +1,5 @@ +--- +title: Enable BorderZero rule in scss-lint +merge_request: 15168 +author: Takuya Noguchi +type: other diff --git a/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml b/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml new file mode 100644 index 00000000000..42bcf9b1edd --- /dev/null +++ b/changelogs/unreleased/dm-block-group-and-project-creation-when-external-by-default.yml @@ -0,0 +1,6 @@ +--- +title: Make sure group and project creation is blocked for new users that are external + by default +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml b/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml new file mode 100644 index 00000000000..ad41d9b84c3 --- /dev/null +++ b/changelogs/unreleased/dm-reallow-project-path-ending-in-period.yml @@ -0,0 +1,5 @@ +--- +title: Reallow project paths ending in periods +merge_request: +author: +type: fixed diff --git a/changelogs/unreleased/expose-job-duration.yml b/changelogs/unreleased/expose-job-duration.yml new file mode 100644 index 00000000000..1fe5d897d47 --- /dev/null +++ b/changelogs/unreleased/expose-job-duration.yml @@ -0,0 +1,5 @@ +--- +title: Expose duration in Job entity +merge_request: 13644 +author: Mehdi Lahmam (@mehlah) +type: added diff --git a/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml b/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml new file mode 100644 index 00000000000..0ec9bcbcde2 --- /dev/null +++ b/changelogs/unreleased/fix-md-form-tabs-double-click-toggle.yml @@ -0,0 +1,6 @@ +--- +title: Fix markdown form tabs toggling preview mode from double clicking write mode + button +merge_request: 15119 +author: +type: fixed diff --git a/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml b/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml new file mode 100644 index 00000000000..4eeedec2c99 --- /dev/null +++ b/changelogs/unreleased/jej-fs-prevent-push-when-missing-objects.yml @@ -0,0 +1,5 @@ +--- +title: Prevent git push when LFS objects are missing +merge_request: 13837 +author: +type: added diff --git a/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml b/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml new file mode 100644 index 00000000000..abab2e55f90 --- /dev/null +++ b/changelogs/unreleased/pawel-metrics-to-prometheus-33643.yml @@ -0,0 +1,5 @@ +--- +title: Add Prometheus equivalent of all InfluxDB metrics +merge_request: 13891 +author: +type: changed diff --git a/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml b/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml new file mode 100644 index 00000000000..987f7286244 --- /dev/null +++ b/changelogs/unreleased/pawel-show_empty_page_when_prometheus_metrics_are_disabled-35639.yml @@ -0,0 +1,5 @@ +--- +title: Make Prometheus metrics endpoint return empty response when metrics are disabled +merge_request: 14490 +author: +type: changed diff --git a/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml b/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml new file mode 100644 index 00000000000..57f54bec1e6 --- /dev/null +++ b/changelogs/unreleased/remove-ensure-ref-fetched-from-controllers.yml @@ -0,0 +1,5 @@ +--- +title: Stop merge requests from fetching their refs when the data is already available. +merge_request: 15129 +author: +type: removed diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 12694f8016f..d1156b0c8a8 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -535,6 +535,7 @@ Settings.webpack.dev_server['port'] ||= 3808 Settings['monitoring'] ||= Settingslogic.new({}) Settings.monitoring['ip_whitelist'] ||= ['127.0.0.1/8'] Settings.monitoring['unicorn_sampler_interval'] ||= 10 +Settings.monitoring['ruby_sampler_interval'] ||= 60 Settings.monitoring['sidekiq_exporter'] ||= Settingslogic.new({}) Settings.monitoring.sidekiq_exporter['enabled'] ||= false Settings.monitoring.sidekiq_exporter['address'] ||= 'localhost' diff --git a/config/initializers/7_prometheus_metrics.rb b/config/initializers/7_prometheus_metrics.rb index 31839297523..e8f33593fe0 100644 --- a/config/initializers/7_prometheus_metrics.rb +++ b/config/initializers/7_prometheus_metrics.rb @@ -11,7 +11,15 @@ Prometheus::Client.configure do |config| config.multiprocess_files_dir ||= Rails.root.join('tmp/prometheus_multiproc_dir') end - config.pid_provider = Prometheus::Client::Support::Unicorn.method(:worker_pid_provider) + config.pid_provider = -> do + wid = Prometheus::Client::Support::Unicorn.worker_id + wid = Process.pid if wid.nil? + if wid.nil? + "process_pid_#{Process.pid}" + else + "worker_id_#{wid}" + end + end end Sidekiq.configure_server do |config| @@ -19,3 +27,11 @@ Sidekiq.configure_server do |config| Gitlab::Metrics::SidekiqMetricsExporter.instance.start end end + +if Gitlab::Metrics.prometheus_metrics_enabled? + unless Sidekiq.server? + Gitlab::Metrics::Samplers::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start + end + + Gitlab::Metrics::Samplers::RubySampler.initialize_instance(Settings.monitoring.ruby_sampler_interval).start +end diff --git a/config/initializers/8_metrics.rb b/config/initializers/8_metrics.rb index 2d8704622b6..7ef594836d6 100644 --- a/config/initializers/8_metrics.rb +++ b/config/initializers/8_metrics.rb @@ -77,7 +77,6 @@ def instrument_classes(instrumentation) instrumentation.instrument_instance_methods(Banzai::ObjectRenderer) instrumentation.instrument_instance_methods(Banzai::Redactor) - instrumentation.instrument_methods(Banzai::NoteRenderer) [Issuable, Mentionable, Participable].each do |klass| instrumentation.instrument_instance_methods(klass) @@ -116,17 +115,9 @@ def instrument_classes(instrumentation) # Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/30224#note_32306159 instrumentation.instrument_instance_method(MergeRequestDiff, :load_commits) - - # Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/36061 - instrumentation.instrument_instance_method(MergeRequest, :ensure_ref_fetched) - instrumentation.instrument_instance_method(MergeRequest, :fetch_ref) end # rubocop:enable Metrics/AbcSize -unless Sidekiq.server? - Gitlab::Metrics::UnicornSampler.initialize_instance(Settings.monitoring.unicorn_sampler_interval).start -end - Gitlab::Application.configure do |config| # 0 should be Sentry to catch errors in this middleware config.middleware.insert(1, Gitlab::Metrics::RequestsRackMiddleware) @@ -192,7 +183,7 @@ if Gitlab::Metrics.enabled? GC::Profiler.enable - Gitlab::Metrics::InfluxSampler.initialize_instance.start + Gitlab::Metrics::Samplers::InfluxSampler.initialize_instance.start module TrackNewRedisConnections def connect(*args) diff --git a/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb b/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb new file mode 100644 index 00000000000..4e8f495d65d --- /dev/null +++ b/db/post_migrate/20171101134435_remove_ref_fetched_from_merge_requests.rb @@ -0,0 +1,14 @@ +class RemoveRefFetchedFromMergeRequests < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # We don't need to cache this anymore: the refs are now created + # upon save/update and there is no more use for this flag + # + # See https://gitlab.com/gitlab-org/gitlab-ce/issues/36061 + def change + remove_column :merge_requests, :ref_fetched, :boolean + end +end diff --git a/db/schema.rb b/db/schema.rb index 9e07114a2d1..430f7f2f5e0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1047,7 +1047,6 @@ ActiveRecord::Schema.define(version: 20171106101200) do t.datetime "last_edited_at" t.integer "last_edited_by_id" t.integer "head_pipeline_id" - t.boolean "ref_fetched" t.string "merge_jid" t.boolean "discussion_locked" t.integer "latest_merge_request_diff_id" diff --git a/doc/administration/logs.md b/doc/administration/logs.md index c9ed2d84ccb..debaa2330d0 100644 --- a/doc/administration/logs.md +++ b/doc/administration/logs.md @@ -192,4 +192,13 @@ installations from source. It logs information whenever a [repository check is run][repocheck] on a project. +## Reconfigure Logs + +Reconfigure log files live in `/var/log/gitlab/reconfigure` for Omnibus GitLab +packages. Installations from source don't have reconfigure logs. A reconfigure log +is populated whenever `gitlab-ctl reconfigure` is run manually or as part of an upgrade. + +Reconfigure logs files are named according to the UNIX timestamp of when the reconfigure +was initiated, such as `1509705644.log` + [repocheck]: repository_checks.md diff --git a/doc/development/ux_guide/resources.md b/doc/development/ux_guide/resources.md index 2f760c94414..db57258237f 100644 --- a/doc/development/ux_guide/resources.md +++ b/doc/development/ux_guide/resources.md @@ -10,4 +10,8 @@ you can use during GitLab development. ## Design repository All design files are stored in the [gitlab-design](https://gitlab.com/gitlab-org/gitlab-design) -repository and maintained by GitLab UX designers.
\ No newline at end of file +repository and maintained by GitLab UX designers. + +## [brand.ai](https://brand.ai/git-lab/primary-brand) + +We are in the process of capturing our UI paradigms on brand.ai, see https://brand.ai/git-lab/primary-brand diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 67cecb6a7ad..398a7906dcb 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -822,6 +822,7 @@ module API class Job < Grape::Entity expose :id, :status, :stage, :name, :ref, :tag, :coverage expose :created_at, :started_at, :finished_at + expose :duration expose :user, with: User expose :artifacts_file, using: JobArtifactFile, if: -> (job, opts) { job.artifacts? } expose :commit, with: Commit diff --git a/lib/banzai.rb b/lib/banzai.rb index 35ca234c1ba..5df98f66f3b 100644 --- a/lib/banzai.rb +++ b/lib/banzai.rb @@ -3,8 +3,8 @@ module Banzai Renderer.render(text, context) end - def self.render_field(object, field) - Renderer.render_field(object, field) + def self.render_field(object, field, context = {}) + Renderer.render_field(object, field, context) end def self.cache_collection_render(texts_and_contexts) diff --git a/lib/banzai/filter/absolute_link_filter.rb b/lib/banzai/filter/absolute_link_filter.rb new file mode 100644 index 00000000000..1ec6201523f --- /dev/null +++ b/lib/banzai/filter/absolute_link_filter.rb @@ -0,0 +1,34 @@ +require 'uri' + +module Banzai + module Filter + # HTML filter that converts relative urls into absolute ones. + class AbsoluteLinkFilter < HTML::Pipeline::Filter + def call + return doc unless context[:only_path] == false + + doc.search('a.gfm').each do |el| + process_link_attr el.attribute('href') + end + + doc + end + + protected + + def process_link_attr(html_attr) + return if html_attr.blank? + return if html_attr.value.start_with?('//') + + uri = URI(html_attr.value) + html_attr.value = absolute_link_attr(uri) if uri.relative? + rescue URI::Error + # noop + end + + def absolute_link_attr(uri) + URI.join(Gitlab.config.gitlab.url, uri).to_s + end + end + end +end diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index a0f7e4e5ad5..9fef386de16 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -311,30 +311,6 @@ module Banzai def project_refs_cache RequestStore[:banzai_project_refs] ||= {} end - - def cached_call(request_store_key, cache_key, path: []) - if RequestStore.active? - cache = RequestStore[request_store_key] ||= Hash.new do |hash, key| - hash[key] = Hash.new { |h, k| h[k] = {} } - end - - cache = cache.dig(*path) if path.any? - - get_or_set_cache(cache, cache_key) { yield } - else - yield - end - end - - def get_or_set_cache(cache, key) - if cache.key?(key) - cache[key] - else - value = yield - cache[key] = value if key.present? - value - end - end end end end diff --git a/lib/banzai/filter/reference_filter.rb b/lib/banzai/filter/reference_filter.rb index c6ae28adf87..b9d5ecf70ec 100644 --- a/lib/banzai/filter/reference_filter.rb +++ b/lib/banzai/filter/reference_filter.rb @@ -8,6 +8,8 @@ module Banzai # :project (required) - Current project, ignored if reference is cross-project. # :only_path - Generate path-only links. class ReferenceFilter < HTML::Pipeline::Filter + include RequestStoreReferenceCache + class << self attr_accessor :reference_type end diff --git a/lib/banzai/filter/user_reference_filter.rb b/lib/banzai/filter/user_reference_filter.rb index afb6e25963c..c7fa8a8119f 100644 --- a/lib/banzai/filter/user_reference_filter.rb +++ b/lib/banzai/filter/user_reference_filter.rb @@ -60,10 +60,14 @@ module Banzai self.class.references_in(text) do |match, username| if username == 'all' && !skip_project_check? link_to_all(link_content: link_content) - elsif namespace = namespaces[username.downcase] - link_to_namespace(namespace, link_content: link_content) || match else - match + cached_call(:banzai_url_for_object, match, path: [User, username.downcase]) do + if namespace = namespaces[username.downcase] + link_to_namespace(namespace, link_content: link_content) || match + else + match + end + end end end end @@ -74,7 +78,10 @@ module Banzai # The keys of this Hash are the namespace paths, the values the # corresponding Namespace objects. def namespaces - @namespaces ||= Namespace.where_full_path_in(usernames).index_by(&:full_path).transform_keys(&:downcase) + @namespaces ||= Namespace.eager_load(:owner, :route) + .where_full_path_in(usernames) + .index_by(&:full_path) + .transform_keys(&:downcase) end # Returns all usernames referenced in the current document. diff --git a/lib/banzai/note_renderer.rb b/lib/banzai/note_renderer.rb deleted file mode 100644 index 2b7c10f1a0e..00000000000 --- a/lib/banzai/note_renderer.rb +++ /dev/null @@ -1,21 +0,0 @@ -module Banzai - module NoteRenderer - # Renders a collection of Note instances. - # - # notes - The notes to render. - # project - The project to use for redacting. - # user - The user viewing the notes. - # path - The request path. - # wiki - The project's wiki. - # git_ref - The current Git reference. - def self.render(notes, project, user = nil, path = nil, wiki = nil, git_ref = nil) - renderer = ObjectRenderer.new(project, - user, - requested_path: path, - project_wiki: wiki, - ref: git_ref) - - renderer.render(notes, :note) - end - end -end diff --git a/lib/banzai/object_renderer.rb b/lib/banzai/object_renderer.rb index e40556e869c..9bb8ed913d8 100644 --- a/lib/banzai/object_renderer.rb +++ b/lib/banzai/object_renderer.rb @@ -37,7 +37,7 @@ module Banzai objects.each_with_index do |object, index| redacted_data = redacted[index] - object.__send__("redacted_#{attribute}_html=", redacted_data[:document].to_html.html_safe) # rubocop:disable GitlabSecurity/PublicSend + object.__send__("redacted_#{attribute}_html=", redacted_data[:document].to_html(save_options).html_safe) # rubocop:disable GitlabSecurity/PublicSend object.user_visible_reference_count = redacted_data[:visible_reference_count] if object.respond_to?(:user_visible_reference_count) end end @@ -83,5 +83,10 @@ module Banzai skip_redaction: true ) end + + def save_options + return {} unless base_context[:xhtml] + { save_with: Nokogiri::XML::Node::SaveOptions::AS_XHTML } + end end end diff --git a/lib/banzai/pipeline/post_process_pipeline.rb b/lib/banzai/pipeline/post_process_pipeline.rb index 131ac3b0eec..dcd52bc03c7 100644 --- a/lib/banzai/pipeline/post_process_pipeline.rb +++ b/lib/banzai/pipeline/post_process_pipeline.rb @@ -3,9 +3,10 @@ module Banzai class PostProcessPipeline < BasePipeline def self.filters FilterArray[ + Filter::RedactorFilter, Filter::RelativeLinkFilter, Filter::IssuableStateFilter, - Filter::RedactorFilter + Filter::AbsoluteLinkFilter ] end diff --git a/lib/banzai/renderer.rb b/lib/banzai/renderer.rb index 5f91884a878..5cb9adf52b0 100644 --- a/lib/banzai/renderer.rb +++ b/lib/banzai/renderer.rb @@ -32,12 +32,9 @@ module Banzai # Convert a Markdown-containing field on an object into an HTML-safe String # of HTML. This method is analogous to calling render(object.field), but it # can cache the rendered HTML in the object, rather than Redis. - # - # The context to use is managed by the object and cannot be changed. - # Use #render, passing it the field text, if a custom rendering is needed. - def self.render_field(object, field) + def self.render_field(object, field, context = {}) unless object.respond_to?(:cached_markdown_fields) - return cacheless_render_field(object, field) + return cacheless_render_field(object, field, context) end object.refresh_markdown_cache! unless object.cached_html_up_to_date?(field) @@ -46,9 +43,9 @@ module Banzai end # Same as +render_field+, but without consulting or updating the cache field - def self.cacheless_render_field(object, field, options = {}) + def self.cacheless_render_field(object, field, context = {}) text = object.__send__(field) # rubocop:disable GitlabSecurity/PublicSend - context = object.banzai_render_context(field).merge(options) + context = context.reverse_merge(object.banzai_render_context(field)) if object.respond_to?(:banzai_render_context) cacheless_render(text, context) end diff --git a/lib/banzai/request_store_reference_cache.rb b/lib/banzai/request_store_reference_cache.rb new file mode 100644 index 00000000000..426131442a2 --- /dev/null +++ b/lib/banzai/request_store_reference_cache.rb @@ -0,0 +1,27 @@ +module Banzai + module RequestStoreReferenceCache + def cached_call(request_store_key, cache_key, path: []) + if RequestStore.active? + cache = RequestStore[request_store_key] ||= Hash.new do |hash, key| + hash[key] = Hash.new { |h, k| h[k] = {} } + end + + cache = cache.dig(*path) if path.any? + + get_or_set_cache(cache, cache_key) { yield } + else + yield + end + end + + def get_or_set_cache(cache, key) + if cache.key?(key) + cache[key] + else + value = yield + cache[key] = value if key.present? + value + end + end + end +end diff --git a/lib/constraints/group_url_constrainer.rb b/lib/constraints/group_url_constrainer.rb index 6fc1d56d7a0..fd2ac2db0a9 100644 --- a/lib/constraints/group_url_constrainer.rb +++ b/lib/constraints/group_url_constrainer.rb @@ -2,7 +2,7 @@ class GroupUrlConstrainer def matches?(request) full_path = request.params[:group_id] || request.params[:id] - return false unless DynamicPathValidator.valid_group_path?(full_path) + return false unless NamespacePathValidator.valid_path?(full_path) Group.find_by_full_path(full_path, follow_redirects: request.get?).present? end diff --git a/lib/constraints/project_url_constrainer.rb b/lib/constraints/project_url_constrainer.rb index 5bef29eb1da..e90ecb5ec69 100644 --- a/lib/constraints/project_url_constrainer.rb +++ b/lib/constraints/project_url_constrainer.rb @@ -4,7 +4,7 @@ class ProjectUrlConstrainer project_path = request.params[:project_id] || request.params[:id] full_path = [namespace_path, project_path].join('/') - return false unless DynamicPathValidator.valid_project_path?(full_path) + return false unless ProjectPathValidator.valid_path?(full_path) # We intentionally allow SELECT(*) here so result of this query can be used # as cache for further Project.find_by_full_path calls within request diff --git a/lib/constraints/user_url_constrainer.rb b/lib/constraints/user_url_constrainer.rb index d16ae7f3f40..b7633aa7cbb 100644 --- a/lib/constraints/user_url_constrainer.rb +++ b/lib/constraints/user_url_constrainer.rb @@ -2,7 +2,7 @@ class UserUrlConstrainer def matches?(request) full_path = request.params[:username] - return false unless DynamicPathValidator.valid_user_path?(full_path) + return false unless UserPathValidator.valid_path?(full_path) User.find_by_full_path(full_path, follow_redirects: request.get?).present? end diff --git a/lib/github/import.rb b/lib/github/import.rb index 8cabbdec940..fef63dd7168 100644 --- a/lib/github/import.rb +++ b/lib/github/import.rb @@ -163,7 +163,6 @@ module Github iid: pull_request.iid, title: pull_request.title, description: description, - ref_fetched: true, source_project: pull_request.source_project, source_branch: pull_request.source_branch_name, source_branch_sha: pull_request.source_branch_sha, diff --git a/lib/gitlab/checks/change_access.rb b/lib/gitlab/checks/change_access.rb index b6805230348..ef92fc5a0a0 100644 --- a/lib/gitlab/checks/change_access.rb +++ b/lib/gitlab/checks/change_access.rb @@ -12,7 +12,8 @@ module Gitlab change_existing_tags: 'You are not allowed to change existing tags on this project.', update_protected_tag: 'Protected tags cannot be updated.', delete_protected_tag: 'Protected tags cannot be deleted.', - create_protected_tag: 'You are not allowed to create this tag as it is protected.' + create_protected_tag: 'You are not allowed to create this tag as it is protected.', + lfs_objects_missing: 'LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all".' }.freeze attr_reader :user_access, :project, :skip_authorization, :protocol @@ -36,6 +37,7 @@ module Gitlab push_checks branch_checks tag_checks + lfs_objects_exist_check true end @@ -136,6 +138,14 @@ module Gitlab def matching_merge_request? Checks::MatchingMergeRequest.new(@newrev, @branch_name, @project).match? end + + def lfs_objects_exist_check + lfs_check = Checks::LfsIntegrity.new(project, @newrev) + + if lfs_check.objects_missing? + raise GitAccess::UnauthorizedError, ERROR_MESSAGES[:lfs_objects_missing] + end + end end end end diff --git a/lib/gitlab/checks/lfs_integrity.rb b/lib/gitlab/checks/lfs_integrity.rb new file mode 100644 index 00000000000..27a95764dc1 --- /dev/null +++ b/lib/gitlab/checks/lfs_integrity.rb @@ -0,0 +1,24 @@ +module Gitlab + module Checks + class LfsIntegrity + REV_LIST_OBJECT_LIMIT = 2_000 + + def initialize(project, newrev) + @project = project + @newrev = newrev + end + + def objects_missing? + return false unless @newrev && @project.lfs_enabled? + + new_lfs_pointers = Gitlab::Git::LfsChanges.new(@project.repository, @newrev).new_pointers(object_limit: REV_LIST_OBJECT_LIMIT) + + return false unless new_lfs_pointers.present? + + existing_count = @project.lfs_objects.where(oid: new_lfs_pointers.map(&:lfs_oid)).count + + existing_count != new_lfs_pointers.count + end + end + end +end diff --git a/lib/gitlab/daemon.rb b/lib/gitlab/daemon.rb index dfd17e35707..f07fd1dfdda 100644 --- a/lib/gitlab/daemon.rb +++ b/lib/gitlab/daemon.rb @@ -43,7 +43,7 @@ module Gitlab if thread thread.wakeup if thread.alive? - thread.join + thread.join unless Thread.current == thread @thread = nil end end diff --git a/lib/gitlab/git/lfs_changes.rb b/lib/gitlab/git/lfs_changes.rb index 2749e2e69e2..732dd5d998a 100644 --- a/lib/gitlab/git/lfs_changes.rb +++ b/lib/gitlab/git/lfs_changes.rb @@ -8,25 +8,22 @@ module Gitlab def new_pointers(object_limit: nil, not_in: nil) @new_pointers ||= begin - object_ids = new_objects(not_in: not_in) - object_ids = object_ids.take(object_limit) if object_limit + rev_list.new_objects(not_in: not_in, require_path: true) do |object_ids| + object_ids = object_ids.take(object_limit) if object_limit - Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) + Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) + end end end def all_pointers - object_ids = rev_list.all_objects(require_path: true) - - Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) + rev_list.all_objects(require_path: true) do |object_ids| + Gitlab::Git::Blob.batch_lfs_pointers(@repository, object_ids) + end end private - def new_objects(not_in:) - rev_list.new_objects(require_path: true, lazy: true, not_in: not_in) - end - def rev_list ::Gitlab::Git::RevList.new(path_to_repo: @repository.path_to_repo, newrev: @newrev) diff --git a/lib/gitlab/git/popen.rb b/lib/gitlab/git/popen.rb index b45da6020ee..d41fe78daa1 100644 --- a/lib/gitlab/git/popen.rb +++ b/lib/gitlab/git/popen.rb @@ -7,7 +7,7 @@ module Gitlab module Popen FAST_GIT_PROCESS_TIMEOUT = 15.seconds - def popen(cmd, path, vars = {}) + def popen(cmd, path, vars = {}, lazy_block: nil) unless cmd.is_a?(Array) raise "System commands must be given as an array of strings" end @@ -22,7 +22,12 @@ module Gitlab yield(stdin) if block_given? stdin.close - @cmd_output << stdout.read + if lazy_block + return lazy_block.call(stdout.lazy) + else + @cmd_output << stdout.read + end + @cmd_output << stderr.read @cmd_status = wait_thr.value.exitstatus end diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 182ffc96ef9..df4ad586e12 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -1044,7 +1044,7 @@ module Gitlab delete_refs(tmp_ref) if tmp_ref end - def fetch_source_branch(source_repository, source_branch, local_ref) + def fetch_source_branch!(source_repository, source_branch, local_ref) with_repo_branch_commit(source_repository, source_branch) do |commit| if commit write_ref(local_ref, commit.sha) diff --git a/lib/gitlab/git/rev_list.rb b/lib/gitlab/git/rev_list.rb index e0c884aceaa..4974205b8fd 100644 --- a/lib/gitlab/git/rev_list.rb +++ b/lib/gitlab/git/rev_list.rb @@ -25,17 +25,18 @@ module Gitlab # This skips commit objects and root trees, which might not be needed when # looking for blobs # - # Can return a lazy enumerator to limit work done on megabytes of data - def new_objects(require_path: nil, lazy: false, not_in: nil) - object_output = execute([*base_args, newrev, *not_in_refs(not_in), '--objects']) + # When given a block it will yield objects as a lazy enumerator so + # the caller can limit work done instead of processing megabytes of data + def new_objects(require_path: nil, not_in: nil, &lazy_block) + args = [*base_args, newrev, *not_in_refs(not_in), '--objects'] - objects_from_output(object_output, require_path: require_path, lazy: lazy) + get_objects(args, require_path: require_path, &lazy_block) end - def all_objects(require_path: nil) - object_output = execute([*base_args, '--all', '--objects']) + def all_objects(require_path: nil, &lazy_block) + args = [*base_args, '--all', '--objects'] - objects_from_output(object_output, require_path: require_path, lazy: true) + get_objects(args, require_path: require_path, &lazy_block) end # This methods returns an array of missed references @@ -64,6 +65,10 @@ module Gitlab output.split("\n") end + def lazy_execute(args, &lazy_block) + popen(args, nil, Gitlab::Git::Env.to_env_hash, lazy_block: lazy_block) + end + def base_args [ Gitlab.config.git.bin_path, @@ -72,20 +77,28 @@ module Gitlab ] end - def objects_from_output(object_output, require_path: nil, lazy: nil) - objects = object_output.lazy.map do |output_line| + def get_objects(args, require_path: nil) + if block_given? + lazy_execute(args) do |lazy_output| + objects = objects_from_output(lazy_output, require_path: require_path) + + yield(objects) + end + else + object_output = execute(args) + + objects_from_output(object_output, require_path: require_path) + end + end + + def objects_from_output(object_output, require_path: nil) + object_output.map do |output_line| sha, path = output_line.split(' ', 2) next if require_path && path.blank? sha end.reject(&:nil?) - - if lazy - objects - else - objects.force - end end end end diff --git a/lib/gitlab/hook_data/merge_request_builder.rb b/lib/gitlab/hook_data/merge_request_builder.rb index eaef19c9d04..503452c8ff3 100644 --- a/lib/gitlab/hook_data/merge_request_builder.rb +++ b/lib/gitlab/hook_data/merge_request_builder.rb @@ -19,7 +19,6 @@ module Gitlab merge_user_id merge_when_pipeline_succeeds milestone_id - ref_fetched source_branch source_project_id state diff --git a/lib/gitlab/metrics/background_transaction.rb b/lib/gitlab/metrics/background_transaction.rb new file mode 100644 index 00000000000..d01de5eef0a --- /dev/null +++ b/lib/gitlab/metrics/background_transaction.rb @@ -0,0 +1,16 @@ +module Gitlab + module Metrics + class BackgroundTransaction < Transaction + def initialize(worker_class) + super() + @worker_class = worker_class + end + + protected + + def labels + { controller: @worker_class.name, action: 'perform' } + end + end + end +end diff --git a/lib/gitlab/metrics/base_sampler.rb b/lib/gitlab/metrics/base_sampler.rb deleted file mode 100644 index 716d20bb91a..00000000000 --- a/lib/gitlab/metrics/base_sampler.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'logger' -module Gitlab - module Metrics - class BaseSampler < Daemon - # interval - The sampling interval in seconds. - def initialize(interval) - interval_half = interval.to_f / 2 - - @interval = interval - @interval_steps = (-interval_half..interval_half).step(0.1).to_a - - super() - end - - def safe_sample - sample - rescue => e - Rails.logger.warn("#{self.class}: #{e}, stopping") - stop - end - - def sample - raise NotImplementedError - end - - # Returns the sleep interval with a random adjustment. - # - # The random adjustment is put in place to ensure we: - # - # 1. Don't generate samples at the exact same interval every time (thus - # potentially missing anything that happens in between samples). - # 2. Don't sample data at the same interval two times in a row. - def sleep_interval - while (step = @interval_steps.sample) - if step != @last_step - @last_step = step - - return @interval + @last_step - end - end - end - - private - - attr_reader :running - - def start_working - @running = true - sleep(sleep_interval) - - while running - safe_sample - - sleep(sleep_interval) - end - end - - def stop_working - @running = false - end - end - end -end diff --git a/lib/gitlab/metrics/influx_db.rb b/lib/gitlab/metrics/influx_db.rb index 7b06bb953aa..bdf7910b7c7 100644 --- a/lib/gitlab/metrics/influx_db.rb +++ b/lib/gitlab/metrics/influx_db.rb @@ -11,6 +11,8 @@ module Gitlab settings[:enabled] || false end + # Prometheus histogram buckets used for arbitrary code measurements + EXECUTION_MEASUREMENT_BUCKETS = [0.001, 0.002, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1].freeze RAILS_ROOT = Rails.root.to_s METRICS_ROOT = Rails.root.join('lib', 'gitlab', 'metrics').to_s PATH_REGEX = /^#{RAILS_ROOT}\/?/ @@ -99,24 +101,27 @@ module Gitlab cpu_stop = System.cpu_time real_stop = Time.now.to_f - real_time = (real_stop - real_start) * 1000.0 + real_time = (real_stop - real_start) cpu_time = cpu_stop - cpu_start - trans.increment("#{name}_real_time", real_time) - trans.increment("#{name}_cpu_time", cpu_time) - trans.increment("#{name}_call_count", 1) + Gitlab::Metrics.histogram("gitlab_#{name}_real_duration_seconds".to_sym, + "Measure #{name}", + Transaction::BASE_LABELS, + EXECUTION_MEASUREMENT_BUCKETS) + .observe(trans.labels, real_time) - retval - end + Gitlab::Metrics.histogram("gitlab_#{name}_cpu_duration_seconds".to_sym, + "Measure #{name}", + Transaction::BASE_LABELS, + EXECUTION_MEASUREMENT_BUCKETS) + .observe(trans.labels, cpu_time / 1000.0) - # Adds a tag to the current transaction (if any) - # - # name - The name of the tag to add. - # value - The value of the tag. - def tag_transaction(name, value) - trans = current_transaction + # InfluxDB stores the _real_time time values as milliseconds + trans.increment("#{name}_real_time", real_time * 1000, false) + trans.increment("#{name}_cpu_time", cpu_time, false) + trans.increment("#{name}_call_count", 1, false) - trans&.add_tag(name, value) + retval end # Sets the action of the current transaction (if any) diff --git a/lib/gitlab/metrics/influx_sampler.rb b/lib/gitlab/metrics/influx_sampler.rb deleted file mode 100644 index 6db1dd755b7..00000000000 --- a/lib/gitlab/metrics/influx_sampler.rb +++ /dev/null @@ -1,101 +0,0 @@ -module Gitlab - module Metrics - # Class that sends certain metrics to InfluxDB at a specific interval. - # - # This class is used to gather statistics that can't be directly associated - # with a transaction such as system memory usage, garbage collection - # statistics, etc. - class InfluxSampler < BaseSampler - # interval - The sampling interval in seconds. - def initialize(interval = Metrics.settings[:sample_interval]) - super(interval) - @last_step = nil - - @metrics = [] - - @last_minor_gc = Delta.new(GC.stat[:minor_gc_count]) - @last_major_gc = Delta.new(GC.stat[:major_gc_count]) - - if Gitlab::Metrics.mri? - require 'allocations' - - Allocations.start - end - end - - def sample - sample_memory_usage - sample_file_descriptors - sample_objects - sample_gc - - flush - ensure - GC::Profiler.clear - @metrics.clear - end - - def flush - Metrics.submit_metrics(@metrics.map(&:to_hash)) - end - - def sample_memory_usage - add_metric('memory_usage', value: System.memory_usage) - end - - def sample_file_descriptors - add_metric('file_descriptors', value: System.file_descriptor_count) - end - - if Metrics.mri? - def sample_objects - sample = Allocations.to_hash - counts = sample.each_with_object({}) do |(klass, count), hash| - name = klass.name - - next unless name - - hash[name] = count - end - - # Symbols aren't allocated so we'll need to add those manually. - counts['Symbol'] = Symbol.all_symbols.length - - counts.each do |name, count| - add_metric('object_counts', { count: count }, type: name) - end - end - else - def sample_objects - end - end - - def sample_gc - time = GC::Profiler.total_time * 1000.0 - stats = GC.stat.merge(total_time: time) - - # We want the difference of GC runs compared to the last sample, not the - # total amount since the process started. - stats[:minor_gc_count] = - @last_minor_gc.compared_with(stats[:minor_gc_count]) - - stats[:major_gc_count] = - @last_major_gc.compared_with(stats[:major_gc_count]) - - stats[:count] = stats[:minor_gc_count] + stats[:major_gc_count] - - add_metric('gc_statistics', stats) - end - - def add_metric(series, values, tags = {}) - prefix = sidekiq? ? 'sidekiq_' : 'rails_' - - @metrics << Metric.new("#{prefix}#{series}", values, tags) - end - - def sidekiq? - Sidekiq.server? - end - end - end -end diff --git a/lib/gitlab/metrics/instrumentation.rb b/lib/gitlab/metrics/instrumentation.rb index 6aa38542cb4..023e9963493 100644 --- a/lib/gitlab/metrics/instrumentation.rb +++ b/lib/gitlab/metrics/instrumentation.rb @@ -118,19 +118,21 @@ module Gitlab def self.instrument(type, mod, name) return unless Metrics.enabled? - name = name.to_sym + name = name.to_sym target = type == :instance ? mod : mod.singleton_class if type == :instance target = mod - label = "#{mod.name}##{name}" + method_name = "##{name}" method = mod.instance_method(name) else target = mod.singleton_class - label = "#{mod.name}.#{name}" + method_name = ".#{name}" method = mod.method(name) end + label = "#{mod.name}#{method_name}" + unless instrumented?(target) target.instance_variable_set(PROXY_IVAR, Module.new) end @@ -153,7 +155,8 @@ module Gitlab proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1 def #{name}(#{args_signature}) if trans = Gitlab::Metrics::Instrumentation.transaction - trans.method_call_for(#{label.to_sym.inspect}).measure { super } + trans.method_call_for(#{label.to_sym.inspect}, #{mod.name.inspect}, "#{method_name}") + .measure { super } else super end diff --git a/lib/gitlab/metrics/method_call.rb b/lib/gitlab/metrics/method_call.rb index d3465e5ec19..90235095306 100644 --- a/lib/gitlab/metrics/method_call.rb +++ b/lib/gitlab/metrics/method_call.rb @@ -2,15 +2,45 @@ module Gitlab module Metrics # Class for tracking timing information about method calls class MethodCall - attr_reader :real_time, :cpu_time, :call_count + MUTEX = Mutex.new + BASE_LABELS = { module: nil, method: nil }.freeze + attr_reader :real_time, :cpu_time, :call_count, :labels + + def self.call_real_duration_histogram + return @call_real_duration_histogram if @call_real_duration_histogram + + MUTEX.synchronize do + @call_real_duration_histogram ||= Gitlab::Metrics.histogram( + :gitlab_method_call_real_duration_seconds, + 'Method calls real duration', + Transaction::BASE_LABELS.merge(BASE_LABELS), + [0.1, 0.2, 0.5, 1, 2, 5, 10] + ) + end + end + + def self.call_cpu_duration_histogram + return @call_cpu_duration_histogram if @call_cpu_duration_histogram + + MUTEX.synchronize do + @call_duration_histogram ||= Gitlab::Metrics.histogram( + :gitlab_method_call_cpu_duration_seconds, + 'Method calls cpu duration', + Transaction::BASE_LABELS.merge(BASE_LABELS), + [0.1, 0.2, 0.5, 1, 2, 5, 10] + ) + end + end # name - The full name of the method (including namespace) such as # `User#sign_in`. # - # series - The series to use for storing the data. - def initialize(name, series) + def initialize(name, module_name, method_name, transaction) + @module_name = module_name + @method_name = method_name + @transaction = transaction @name = name - @series = series + @labels = { module: @module_name, method: @method_name } @real_time = 0 @cpu_time = 0 @call_count = 0 @@ -22,21 +52,27 @@ module Gitlab start_cpu = System.cpu_time retval = yield - @real_time += System.monotonic_time - start_real - @cpu_time += System.cpu_time - start_cpu + real_time = System.monotonic_time - start_real + cpu_time = System.cpu_time - start_cpu + + @real_time += real_time + @cpu_time += cpu_time @call_count += 1 + self.class.call_real_duration_histogram.observe(@transaction.labels.merge(labels), real_time / 1000.0) + self.class.call_cpu_duration_histogram.observe(@transaction.labels.merge(labels), cpu_time / 1000.0) + retval end # Returns a Metric instance of the current method call. def to_metric Metric.new( - @series, + Instrumentation.series, { - duration: real_time, + duration: real_time, cpu_duration: cpu_time, - call_count: call_count + call_count: call_count }, method: @name ) diff --git a/lib/gitlab/metrics/prometheus.rb b/lib/gitlab/metrics/prometheus.rb index 460dab47276..09103b4ca2d 100644 --- a/lib/gitlab/metrics/prometheus.rb +++ b/lib/gitlab/metrics/prometheus.rb @@ -5,6 +5,9 @@ module Gitlab module Prometheus include Gitlab::CurrentSettings + REGISTRY_MUTEX = Mutex.new + PROVIDER_MUTEX = Mutex.new + def metrics_folder_present? multiprocess_files_dir = ::Prometheus::Client.configuration.multiprocess_files_dir @@ -20,23 +23,38 @@ module Gitlab end def registry - @registry ||= ::Prometheus::Client.registry + return @registry if @registry + + REGISTRY_MUTEX.synchronize do + @registry ||= ::Prometheus::Client.registry + end end def counter(name, docstring, base_labels = {}) - provide_metric(name) || registry.counter(name, docstring, base_labels) + safe_provide_metric(:counter, name, docstring, base_labels) end def summary(name, docstring, base_labels = {}) - provide_metric(name) || registry.summary(name, docstring, base_labels) + safe_provide_metric(:summary, name, docstring, base_labels) end def gauge(name, docstring, base_labels = {}, multiprocess_mode = :all) - provide_metric(name) || registry.gauge(name, docstring, base_labels, multiprocess_mode) + safe_provide_metric(:gauge, name, docstring, base_labels, multiprocess_mode) end def histogram(name, docstring, base_labels = {}, buckets = ::Prometheus::Client::Histogram::DEFAULT_BUCKETS) - provide_metric(name) || registry.histogram(name, docstring, base_labels, buckets) + safe_provide_metric(:histogram, name, docstring, base_labels, buckets) + end + + private + + def safe_provide_metric(method, name, *args) + metric = provide_metric(name) + return metric if metric + + PROVIDER_MUTEX.synchronize do + provide_metric(name) || registry.method(method).call(name, *args) + end end def provide_metric(name) @@ -47,8 +65,6 @@ module Gitlab end end - private - def prometheus_metrics_enabled_unmemoized metrics_folder_present? && current_application_settings[:prometheus_metrics_enabled] || false end diff --git a/lib/gitlab/metrics/rack_middleware.rb b/lib/gitlab/metrics/rack_middleware.rb index adc0db1a874..2d45765df3f 100644 --- a/lib/gitlab/metrics/rack_middleware.rb +++ b/lib/gitlab/metrics/rack_middleware.rb @@ -2,20 +2,6 @@ module Gitlab module Metrics # Rack middleware for tracking Rails and Grape requests. class RackMiddleware - CONTROLLER_KEY = 'action_controller.instance'.freeze - ENDPOINT_KEY = 'api.endpoint'.freeze - CONTENT_TYPES = { - 'text/html' => :html, - 'text/plain' => :txt, - 'application/json' => :json, - 'text/js' => :js, - 'application/atom+xml' => :atom, - 'image/png' => :png, - 'image/jpeg' => :jpeg, - 'image/gif' => :gif, - 'image/svg+xml' => :svg - }.freeze - def initialize(app) @app = app end @@ -35,12 +21,6 @@ module Gitlab # Even in the event of an error we want to submit any metrics we # might've gathered up to this point. ensure - if env[CONTROLLER_KEY] - tag_controller(trans, env) - elsif env[ENDPOINT_KEY] - tag_endpoint(trans, env) - end - trans.finish end @@ -48,60 +28,19 @@ module Gitlab end def transaction_from_env(env) - trans = Transaction.new + trans = WebTransaction.new(env) - trans.set(:request_uri, filtered_path(env)) - trans.set(:request_method, env['REQUEST_METHOD']) + trans.set(:request_uri, filtered_path(env), false) + trans.set(:request_method, env['REQUEST_METHOD'], false) trans end - def tag_controller(trans, env) - controller = env[CONTROLLER_KEY] - action = "#{controller.class.name}##{controller.action_name}" - suffix = CONTENT_TYPES[controller.content_type] - - if suffix && suffix != :html - action += ".#{suffix}" - end - - trans.action = action - end - - def tag_endpoint(trans, env) - endpoint = env[ENDPOINT_KEY] - - begin - route = endpoint.route - rescue - # endpoint.route is calling env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info] - # but env[Grape::Env::GRAPE_ROUTING_ARGS] is nil in the case of a 405 response - # so we're rescuing exceptions and bailing out - end - - if route - path = endpoint_paths_cache[route.request_method][route.path] - trans.action = "Grape##{route.request_method} #{path}" - end - end - private def filtered_path(env) ActionDispatch::Request.new(env).filtered_path.presence || env['REQUEST_URI'] end - - def endpoint_paths_cache - @endpoint_paths_cache ||= Hash.new do |hash, http_method| - hash[http_method] = Hash.new do |inner_hash, raw_path| - inner_hash[raw_path] = endpoint_instrumentable_path(raw_path) - end - end - end - - def endpoint_instrumentable_path(raw_path) - raw_path.sub('(.:format)', '').sub('/:version', '') - end end end end diff --git a/lib/gitlab/metrics/samplers/base_sampler.rb b/lib/gitlab/metrics/samplers/base_sampler.rb new file mode 100644 index 00000000000..37f90c4673d --- /dev/null +++ b/lib/gitlab/metrics/samplers/base_sampler.rb @@ -0,0 +1,64 @@ +require 'logger' + +module Gitlab + module Metrics + module Samplers + class BaseSampler < Daemon + # interval - The sampling interval in seconds. + def initialize(interval) + interval_half = interval.to_f / 2 + + @interval = interval + @interval_steps = (-interval_half..interval_half).step(0.1).to_a + + super() + end + + def safe_sample + sample + rescue => e + Rails.logger.warn("#{self.class}: #{e}, stopping") + stop + end + + def sample + raise NotImplementedError + end + + # Returns the sleep interval with a random adjustment. + # + # The random adjustment is put in place to ensure we: + # + # 1. Don't generate samples at the exact same interval every time (thus + # potentially missing anything that happens in between samples). + # 2. Don't sample data at the same interval two times in a row. + def sleep_interval + while step = @interval_steps.sample + if step != @last_step + @last_step = step + + return @interval + @last_step + end + end + end + + private + + attr_reader :running + + def start_working + @running = true + sleep(sleep_interval) + while running + safe_sample + sleep(sleep_interval) + end + end + + def stop_working + @running = false + end + end + end + end +end diff --git a/lib/gitlab/metrics/samplers/influx_sampler.rb b/lib/gitlab/metrics/samplers/influx_sampler.rb new file mode 100644 index 00000000000..f4f9b5ca792 --- /dev/null +++ b/lib/gitlab/metrics/samplers/influx_sampler.rb @@ -0,0 +1,103 @@ +module Gitlab + module Metrics + module Samplers + # Class that sends certain metrics to InfluxDB at a specific interval. + # + # This class is used to gather statistics that can't be directly associated + # with a transaction such as system memory usage, garbage collection + # statistics, etc. + class InfluxSampler < BaseSampler + # interval - The sampling interval in seconds. + def initialize(interval = Metrics.settings[:sample_interval]) + super(interval) + @last_step = nil + + @metrics = [] + + @last_minor_gc = Delta.new(GC.stat[:minor_gc_count]) + @last_major_gc = Delta.new(GC.stat[:major_gc_count]) + + if Gitlab::Metrics.mri? + require 'allocations' + + Allocations.start + end + end + + def sample + sample_memory_usage + sample_file_descriptors + sample_objects + sample_gc + + flush + ensure + GC::Profiler.clear + @metrics.clear + end + + def flush + Metrics.submit_metrics(@metrics.map(&:to_hash)) + end + + def sample_memory_usage + add_metric('memory_usage', value: System.memory_usage) + end + + def sample_file_descriptors + add_metric('file_descriptors', value: System.file_descriptor_count) + end + + if Metrics.mri? + def sample_objects + sample = Allocations.to_hash + counts = sample.each_with_object({}) do |(klass, count), hash| + name = klass.name + + next unless name + + hash[name] = count + end + + # Symbols aren't allocated so we'll need to add those manually. + counts['Symbol'] = Symbol.all_symbols.length + + counts.each do |name, count| + add_metric('object_counts', { count: count }, type: name) + end + end + else + def sample_objects + end + end + + def sample_gc + time = GC::Profiler.total_time * 1000.0 + stats = GC.stat.merge(total_time: time) + + # We want the difference of GC runs compared to the last sample, not the + # total amount since the process started. + stats[:minor_gc_count] = + @last_minor_gc.compared_with(stats[:minor_gc_count]) + + stats[:major_gc_count] = + @last_major_gc.compared_with(stats[:major_gc_count]) + + stats[:count] = stats[:minor_gc_count] + stats[:major_gc_count] + + add_metric('gc_statistics', stats) + end + + def add_metric(series, values, tags = {}) + prefix = sidekiq? ? 'sidekiq_' : 'rails_' + + @metrics << Metric.new("#{prefix}#{series}", values, tags) + end + + def sidekiq? + Sidekiq.server? + end + end + end + end +end diff --git a/lib/gitlab/metrics/samplers/ruby_sampler.rb b/lib/gitlab/metrics/samplers/ruby_sampler.rb new file mode 100644 index 00000000000..8b5a60e6b8b --- /dev/null +++ b/lib/gitlab/metrics/samplers/ruby_sampler.rb @@ -0,0 +1,110 @@ +require 'prometheus/client/support/unicorn' + +module Gitlab + module Metrics + module Samplers + class RubySampler < BaseSampler + def metrics + @metrics ||= init_metrics + end + + def with_prefix(prefix, name) + "ruby_#{prefix}_#{name}".to_sym + end + + def to_doc_string(name) + name.to_s.humanize + end + + def labels + {} + end + + def initialize(interval) + super(interval) + + if Metrics.mri? + require 'allocations' + + Allocations.start + end + end + + def init_metrics + metrics = {} + metrics[:sampler_duration] = Metrics.histogram(with_prefix(:sampler_duration, :seconds), 'Sampler time', {}) + metrics[:total_time] = Metrics.gauge(with_prefix(:gc, :time_total), 'Total GC time', labels, :livesum) + GC.stat.keys.each do |key| + metrics[key] = Metrics.gauge(with_prefix(:gc, key), to_doc_string(key), labels, :livesum) + end + + metrics[:objects_total] = Metrics.gauge(with_prefix(:objects, :total), 'Objects total', labels.merge(class: nil), :livesum) + metrics[:memory_usage] = Metrics.gauge(with_prefix(:memory, :usage_total), 'Memory used total', labels, :livesum) + metrics[:file_descriptors] = Metrics.gauge(with_prefix(:file, :descriptors_total), 'File descriptors total', labels, :livesum) + + metrics + end + + def sample + start_time = System.monotonic_time + sample_gc + sample_objects + + metrics[:memory_usage].set(labels, System.memory_usage) + metrics[:file_descriptors].set(labels, System.file_descriptor_count) + + metrics[:sampler_duration].observe(labels.merge(worker_label), (System.monotonic_time - start_time) / 1000.0) + ensure + GC::Profiler.clear + end + + private + + def sample_gc + metrics[:total_time].set(labels, GC::Profiler.total_time * 1000) + + GC.stat.each do |key, value| + metrics[key].set(labels, value) + end + end + + def sample_objects + list_objects.each do |name, count| + metrics[:objects_total].set(labels.merge(class: name), count) + end + end + + if Metrics.mri? + def list_objects + sample = Allocations.to_hash + counts = sample.each_with_object({}) do |(klass, count), hash| + name = klass.name + + next unless name + + hash[name] = count + end + + # Symbols aren't allocated so we'll need to add those manually. + counts['Symbol'] = Symbol.all_symbols.length + counts + end + else + def list_objects + end + end + + def worker_label + return {} unless defined?(Unicorn::Worker) + worker_no = ::Prometheus::Client::Support::Unicorn.worker_id + + if worker_no + { unicorn: worker_no } + else + { unicorn: 'master' } + end + end + end + end + end +end diff --git a/lib/gitlab/metrics/samplers/unicorn_sampler.rb b/lib/gitlab/metrics/samplers/unicorn_sampler.rb new file mode 100644 index 00000000000..ea325651fbb --- /dev/null +++ b/lib/gitlab/metrics/samplers/unicorn_sampler.rb @@ -0,0 +1,50 @@ +module Gitlab + module Metrics + module Samplers + class UnicornSampler < BaseSampler + def initialize(interval) + super(interval) + end + + def unicorn_active_connections + @unicorn_active_connections ||= Gitlab::Metrics.gauge(:unicorn_active_connections, 'Unicorn active connections', {}, :max) + end + + def unicorn_queued_connections + @unicorn_queued_connections ||= Gitlab::Metrics.gauge(:unicorn_queued_connections, 'Unicorn queued connections', {}, :max) + end + + def enabled? + # Raindrops::Linux.tcp_listener_stats is only present on Linux + unicorn_with_listeners? && Raindrops::Linux.respond_to?(:tcp_listener_stats) + end + + def sample + Raindrops::Linux.tcp_listener_stats(tcp_listeners).each do |addr, stats| + unicorn_active_connections.set({ type: 'tcp', address: addr }, stats.active) + unicorn_queued_connections.set({ type: 'tcp', address: addr }, stats.queued) + end + + Raindrops::Linux.unix_listener_stats(unix_listeners).each do |addr, stats| + unicorn_active_connections.set({ type: 'unix', address: addr }, stats.active) + unicorn_queued_connections.set({ type: 'unix', address: addr }, stats.queued) + end + end + + private + + def tcp_listeners + @tcp_listeners ||= Unicorn.listener_names.grep(%r{\A[^/]+:\d+\z}) + end + + def unix_listeners + @unix_listeners ||= Unicorn.listener_names - tcp_listeners + end + + def unicorn_with_listeners? + defined?(Unicorn) && Unicorn.listener_names.any? + end + end + end + end +end diff --git a/lib/gitlab/metrics/sidekiq_middleware.rb b/lib/gitlab/metrics/sidekiq_middleware.rb index b983a40611f..55c707d5386 100644 --- a/lib/gitlab/metrics/sidekiq_middleware.rb +++ b/lib/gitlab/metrics/sidekiq_middleware.rb @@ -5,7 +5,7 @@ module Gitlab # This middleware is intended to be used as a server-side middleware. class SidekiqMiddleware def call(worker, message, queue) - trans = Transaction.new("#{worker.class.name}#perform") + trans = BackgroundTransaction.new(worker.class) begin # Old gitlad-shell messages don't provide enqueued_at/created_at attributes diff --git a/lib/gitlab/metrics/subscribers/action_view.rb b/lib/gitlab/metrics/subscribers/action_view.rb index d435a33e9c7..3da474fc1ec 100644 --- a/lib/gitlab/metrics/subscribers/action_view.rb +++ b/lib/gitlab/metrics/subscribers/action_view.rb @@ -15,10 +15,24 @@ module Gitlab private + def metric_view_rendering_duration_seconds + @metric_view_rendering_duration_seconds ||= Gitlab::Metrics.histogram( + :gitlab_view_rendering_duration_seconds, + 'View rendering time', + Transaction::BASE_LABELS.merge({ path: nil }), + [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0] + ) + end + def track(event) values = values_for(event) tags = tags_for(event) + metric_view_rendering_duration_seconds.observe( + current_transaction.labels.merge(tags), + event.duration + ) + current_transaction.increment(:view_duration, event.duration) current_transaction.add_metric(SERIES, values, tags) end diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb index 96cad941d5c..064299f40c8 100644 --- a/lib/gitlab/metrics/subscribers/active_record.rb +++ b/lib/gitlab/metrics/subscribers/active_record.rb @@ -7,9 +7,10 @@ module Gitlab def sql(event) return unless current_transaction + metric_sql_duration_seconds.observe(current_transaction.labels, event.duration / 1000.0) - current_transaction.increment(:sql_duration, event.duration) - current_transaction.increment(:sql_count, 1) + current_transaction.increment(:sql_duration, event.duration, false) + current_transaction.increment(:sql_count, 1, false) end private @@ -17,6 +18,15 @@ module Gitlab def current_transaction Transaction.current end + + def metric_sql_duration_seconds + @metric_sql_duration_seconds ||= Gitlab::Metrics.histogram( + :gitlab_sql_duration_seconds, + 'SQL time', + Transaction::BASE_LABELS, + [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0] + ) + end end end end diff --git a/lib/gitlab/metrics/subscribers/rails_cache.rb b/lib/gitlab/metrics/subscribers/rails_cache.rb index aaed2184f44..efd3c9daf79 100644 --- a/lib/gitlab/metrics/subscribers/rails_cache.rb +++ b/lib/gitlab/metrics/subscribers/rails_cache.rb @@ -7,28 +7,29 @@ module Gitlab attach_to :active_support def cache_read(event) - increment(:cache_read, event.duration) + observe(:read, event.duration) return unless current_transaction return if event.payload[:super_operation] == :fetch if event.payload[:hit] - current_transaction.increment(:cache_read_hit_count, 1) + current_transaction.increment(:cache_read_hit_count, 1, false) else - current_transaction.increment(:cache_read_miss_count, 1) + metric_cache_misses_total.increment(current_transaction.labels) + current_transaction.increment(:cache_read_miss_count, 1, false) end end def cache_write(event) - increment(:cache_write, event.duration) + observe(:write, event.duration) end def cache_delete(event) - increment(:cache_delete, event.duration) + observe(:delete, event.duration) end def cache_exist?(event) - increment(:cache_exists, event.duration) + observe(:exists, event.duration) end def cache_fetch_hit(event) @@ -40,16 +41,18 @@ module Gitlab def cache_generate(event) return unless current_transaction + metric_cache_misses_total.increment(current_transaction.labels) current_transaction.increment(:cache_read_miss_count, 1) end - def increment(key, duration) + def observe(key, duration) return unless current_transaction - current_transaction.increment(:cache_duration, duration) - current_transaction.increment(:cache_count, 1) - current_transaction.increment("#{key}_duration".to_sym, duration) - current_transaction.increment("#{key}_count".to_sym, 1) + metric_cache_operation_duration_seconds.observe(current_transaction.labels.merge({ operation: key }), duration / 1000.0) + current_transaction.increment(:cache_duration, duration, false) + current_transaction.increment(:cache_count, 1, false) + current_transaction.increment("cache_#{key}_duration".to_sym, duration, false) + current_transaction.increment("cache_#{key}_count".to_sym, 1, false) end private @@ -57,6 +60,23 @@ module Gitlab def current_transaction Transaction.current end + + def metric_cache_operation_duration_seconds + @metric_cache_operation_duration_seconds ||= Gitlab::Metrics.histogram( + :gitlab_cache_operation_duration_seconds, + 'Cache access time', + Transaction::BASE_LABELS.merge({ action: nil }), + [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0] + ) + end + + def metric_cache_misses_total + @metric_cache_misses_total ||= Gitlab::Metrics.counter( + :gitlab_cache_misses_total, + 'Cache read miss', + Transaction::BASE_LABELS + ) + end end end end diff --git a/lib/gitlab/metrics/transaction.rb b/lib/gitlab/metrics/transaction.rb index 4f9fb1c7853..ee3afc5ffdb 100644 --- a/lib/gitlab/metrics/transaction.rb +++ b/lib/gitlab/metrics/transaction.rb @@ -2,34 +2,33 @@ module Gitlab module Metrics # Class for storing metrics information of a single transaction. class Transaction + # base labels shared among all transactions + BASE_LABELS = { controller: nil, action: nil }.freeze + THREAD_KEY = :_gitlab_metrics_transaction + METRICS_MUTEX = Mutex.new # The series to store events (e.g. Git pushes) in. EVENT_SERIES = 'events'.freeze attr_reader :tags, :values, :method, :metrics - attr_accessor :action - def self.current Thread.current[THREAD_KEY] end - # action - A String describing the action performed, usually the class - # plus method name. - def initialize(action = nil) + def initialize @metrics = [] @methods = {} - @started_at = nil + @started_at = nil @finished_at = nil @values = Hash.new(0) - @tags = {} - @action = action + @tags = {} @memory_before = 0 - @memory_after = 0 + @memory_after = 0 end def duration @@ -44,12 +43,15 @@ module Gitlab Thread.current[THREAD_KEY] = self @memory_before = System.memory_usage - @started_at = System.monotonic_time + @started_at = System.monotonic_time yield ensure @memory_after = System.memory_usage - @finished_at = System.monotonic_time + @finished_at = System.monotonic_time + + self.class.metric_transaction_duration_seconds.observe(labels, duration * 1000) + self.class.metric_transaction_allocated_memory_bytes.observe(labels, allocated_memory * 1024.0) Thread.current[THREAD_KEY] = nil end @@ -66,33 +68,29 @@ module Gitlab # event_name - The name of the event (e.g. "git_push"). # tags - A set of tags to attach to the event. def add_event(event_name, tags = {}) - @metrics << Metric.new(EVENT_SERIES, - { count: 1 }, - { event: event_name }.merge(tags), - :event) + self.class.metric_event_counter(event_name, tags).increment(tags.merge(labels)) + @metrics << Metric.new(EVENT_SERIES, { count: 1 }, tags.merge(event: event_name), :event) end # Returns a MethodCall object for the given name. - def method_call_for(name) + def method_call_for(name, module_name, method_name) unless method = @methods[name] - @methods[name] = method = MethodCall.new(name, Instrumentation.series) + @methods[name] = method = MethodCall.new(name, module_name, method_name, self) end method end - def increment(name, value) + def increment(name, value, use_prometheus = true) + self.class.metric_transaction_counter(name).increment(labels, value) if use_prometheus @values[name] += value end - def set(name, value) + def set(name, value, use_prometheus = true) + self.class.metric_transaction_gauge(name).set(labels, value) if use_prometheus @values[name] = value end - def add_tag(key, value) - @tags[key] = value - end - def finish track_self submit @@ -117,14 +115,83 @@ module Gitlab submit_hashes = submit.map do |metric| hash = metric.to_hash - - hash[:tags][:action] ||= @action if @action && !metric.event? + hash[:tags][:action] ||= action if action && !metric.event? hash end Metrics.submit_metrics(submit_hashes) end + + def labels + BASE_LABELS + end + + # returns string describing the action performed, usually the class plus method name. + def action + "#{labels[:controller]}##{labels[:action]}" if labels && !labels.empty? + end + + def self.metric_transaction_duration_seconds + return @metric_transaction_duration_seconds if @metric_transaction_duration_seconds + + METRICS_MUTEX.synchronize do + @metric_transaction_duration_seconds ||= Gitlab::Metrics.histogram( + :gitlab_transaction_duration_seconds, + 'Transaction duration', + BASE_LABELS, + [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.500, 2.0, 10.0] + ) + end + end + + def self.metric_transaction_allocated_memory_bytes + return @metric_transaction_allocated_memory_bytes if @metric_transaction_allocated_memory_bytes + + METRICS_MUTEX.synchronize do + @metric_transaction_allocated_memory_bytes ||= Gitlab::Metrics.histogram( + :gitlab_transaction_allocated_memory_bytes, + 'Transaction allocated memory bytes', + BASE_LABELS, + [1000, 10000, 20000, 500000, 1000000, 2000000, 5000000, 10000000, 20000000, 100000000] + ) + end + end + + def self.metric_event_counter(event_name, tags) + return @metric_event_counters[event_name] if @metric_event_counters&.has_key?(event_name) + + METRICS_MUTEX.synchronize do + @metric_event_counters ||= {} + @metric_event_counters[event_name] ||= Gitlab::Metrics.counter( + "gitlab_transaction_event_#{event_name}_total".to_sym, + "Transaction event #{event_name} counter", + tags.merge(BASE_LABELS) + ) + end + end + + def self.metric_transaction_counter(name) + return @metric_transaction_counters[name] if @metric_transaction_counters&.has_key?(name) + + METRICS_MUTEX.synchronize do + @metric_transaction_counters ||= {} + @metric_transaction_counters[name] ||= Gitlab::Metrics.counter( + "gitlab_transaction_#{name}_total".to_sym, "Transaction #{name} counter", BASE_LABELS + ) + end + end + + def self.metric_transaction_gauge(name) + return @metric_transaction_gauges[name] if @metric_transaction_gauges&.has_key?(name) + + METRICS_MUTEX.synchronize do + @metric_transaction_gauges ||= {} + @metric_transaction_gauges[name] ||= Gitlab::Metrics.gauge( + "gitlab_transaction_#{name}".to_sym, "Transaction gauge #{name}", BASE_LABELS, :livesum + ) + end + end end end end diff --git a/lib/gitlab/metrics/unicorn_sampler.rb b/lib/gitlab/metrics/unicorn_sampler.rb deleted file mode 100644 index f6987252039..00000000000 --- a/lib/gitlab/metrics/unicorn_sampler.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Gitlab - module Metrics - class UnicornSampler < BaseSampler - def initialize(interval) - super(interval) - end - - def unicorn_active_connections - @unicorn_active_connections ||= Gitlab::Metrics.gauge(:unicorn_active_connections, 'Unicorn active connections', {}, :max) - end - - def unicorn_queued_connections - @unicorn_queued_connections ||= Gitlab::Metrics.gauge(:unicorn_queued_connections, 'Unicorn queued connections', {}, :max) - end - - def enabled? - # Raindrops::Linux.tcp_listener_stats is only present on Linux - unicorn_with_listeners? && Raindrops::Linux.respond_to?(:tcp_listener_stats) - end - - def sample - Raindrops::Linux.tcp_listener_stats(tcp_listeners).each do |addr, stats| - unicorn_active_connections.set({ type: 'tcp', address: addr }, stats.active) - unicorn_queued_connections.set({ type: 'tcp', address: addr }, stats.queued) - end - - Raindrops::Linux.unix_listener_stats(unix_listeners).each do |addr, stats| - unicorn_active_connections.set({ type: 'unix', address: addr }, stats.active) - unicorn_queued_connections.set({ type: 'unix', address: addr }, stats.queued) - end - end - - private - - def tcp_listeners - @tcp_listeners ||= Unicorn.listener_names.grep(%r{\A[^/]+:\d+\z}) - end - - def unix_listeners - @unix_listeners ||= Unicorn.listener_names - tcp_listeners - end - - def unicorn_with_listeners? - defined?(Unicorn) && Unicorn.listener_names.any? - end - end - end -end diff --git a/lib/gitlab/metrics/web_transaction.rb b/lib/gitlab/metrics/web_transaction.rb new file mode 100644 index 00000000000..89ff02a96d6 --- /dev/null +++ b/lib/gitlab/metrics/web_transaction.rb @@ -0,0 +1,82 @@ +module Gitlab + module Metrics + class WebTransaction < Transaction + CONTROLLER_KEY = 'action_controller.instance'.freeze + ENDPOINT_KEY = 'api.endpoint'.freeze + + CONTENT_TYPES = { + 'text/html' => :html, + 'text/plain' => :txt, + 'application/json' => :json, + 'text/js' => :js, + 'application/atom+xml' => :atom, + 'image/png' => :png, + 'image/jpeg' => :jpeg, + 'image/gif' => :gif, + 'image/svg+xml' => :svg + }.freeze + + def initialize(env) + super() + @env = env + end + + def labels + return @labels if @labels + + # memoize transaction labels only source env variables were present + @labels = if @env[CONTROLLER_KEY] + labels_from_controller || {} + elsif @env[ENDPOINT_KEY] + labels_from_endpoint || {} + end + + @labels || {} + end + + private + + def labels_from_controller + controller = @env[CONTROLLER_KEY] + + action = "#{controller.action_name}" + suffix = CONTENT_TYPES[controller.content_type] + + if suffix && suffix != :html + action += ".#{suffix}" + end + + { controller: controller.class.name, action: action } + end + + def labels_from_endpoint + endpoint = @env[ENDPOINT_KEY] + + begin + route = endpoint.route + rescue + # endpoint.route is calling env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info] + # but env[Grape::Env::GRAPE_ROUTING_ARGS] is nil in the case of a 405 response + # so we're rescuing exceptions and bailing out + end + + if route + path = endpoint_paths_cache[route.request_method][route.path] + { controller: 'Grape', action: "#{route.request_method} #{path}" } + end + end + + def endpoint_paths_cache + @endpoint_paths_cache ||= Hash.new do |hash, http_method| + hash[http_method] = Hash.new do |inner_hash, raw_path| + inner_hash[raw_path] = endpoint_instrumentable_path(raw_path) + end + end + end + + def endpoint_instrumentable_path(raw_path) + raw_path.sub('(.:format)', '').sub('/:version', '') + end + end + end +end diff --git a/lib/gitlab/middleware/rails_queue_duration.rb b/lib/gitlab/middleware/rails_queue_duration.rb index 63c3372da51..bc70b2459ef 100644 --- a/lib/gitlab/middleware/rails_queue_duration.rb +++ b/lib/gitlab/middleware/rails_queue_duration.rb @@ -14,11 +14,22 @@ module Gitlab proxy_start = env['HTTP_GITLAB_WORKHORSE_PROXY_START'].presence if trans && proxy_start # Time in milliseconds since gitlab-workhorse started the request - trans.set(:rails_queue_duration, Time.now.to_f * 1_000 - proxy_start.to_f / 1_000_000) + duration = Time.now.to_f * 1_000 - proxy_start.to_f / 1_000_000 + trans.set(:rails_queue_duration, duration) + metric_rails_queue_duration_seconds.observe(trans.labels, duration / 1_000) end @app.call(env) end + + private + + def metric_rails_queue_duration_seconds + @metric_rails_queue_duration_seconds ||= Gitlab::Metrics.histogram( + :gitlab_rails_queue_duration_seconds, + Gitlab::Metrics::Transaction::BASE_LABELS + ) + end end end end diff --git a/lib/gitlab/o_auth/user.rb b/lib/gitlab/o_auth/user.rb index 47c2a422387..b4b3b00c84d 100644 --- a/lib/gitlab/o_auth/user.rb +++ b/lib/gitlab/o_auth/user.rb @@ -179,7 +179,7 @@ module Gitlab valid_username = ::Namespace.clean_path(username) uniquify = Uniquify.new - valid_username = uniquify.string(valid_username) { |s| !DynamicPathValidator.valid_user_path?(s) } + valid_username = uniquify.string(valid_username) { |s| !UserPathValidator.valid_path?(s) } name = auth_hash.name name = valid_username if name.strip.empty? diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 77b843f84ae..8e688dede89 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:34-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:29-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Bulgarian\n" "Language: bg_BG\n" @@ -34,6 +34,11 @@ msgstr[1] "%s Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð±Ñха пропуÑнати, за да не Ñ msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} подаде %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "1 Ñхема" @@ -110,9 +121,18 @@ msgstr "Добавете SSH ключ в профила Ñи, за да може msgid "Add new directory" msgstr "ДобавÑне на нова папка" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -128,6 +148,9 @@ msgstr "ÐаиÑтина ли иÑкате да изтриете този пла msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -235,6 +261,9 @@ msgstr[1] "Клонове" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Клонът <strong>%{branch_name}</strong> беше Ñъздаден. За да наÑтроите автоматичното внедрÑване, изберете Yaml шаблон за GitLab CI и подайте промените Ñи. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "ТърÑете в клоновете" @@ -445,15 +474,24 @@ msgstr "пропуÑнато" msgid "CiStatus|running" msgstr "протича в момента" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "ПодаваниÑ" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "РъководÑтво за ÑътрудничеÑтво" msgid "Contributors" msgstr "Сътрудници" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -676,7 +728,7 @@ msgid "Create New Directory" msgstr "Създаване на нова папка" msgid "Create a personal access token on your account to pull or push via %{protocol}." -msgstr "Създайте Ñи личен жетон за доÑтъп в профила Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." +msgstr "Създайте Ñи личен жетон за доÑтъп в акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." msgid "Create directory" msgstr "Създаване на папка" @@ -684,9 +736,21 @@ msgstr "Създаване на папка" msgid "Create empty bare repository" msgstr "Създаване на празно хранилище" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Създаване на заÑвка за Ñливане" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Създаване на нов…" @@ -773,6 +837,9 @@ msgstr "Име на папката" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "Ð’ÑÑка Ñедмица (в неделÑ, в 4 ч. Ñутринта)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "СобÑтвеникът не може да бъде променен" msgid "Failed to remove the pipeline schedule" msgstr "Планът за Ñхема не може да бъде премахнат" +msgid "File name" +msgstr "" + msgid "Files" msgstr "Файлове" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "Шаблон за интервала" @@ -1052,6 +1182,9 @@ msgstr "Ðаучете повече в" msgid "Learn more in the|pipeline schedules documentation" msgstr "документациÑта отноÑно планирането на Ñхеми" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "ÐапуÑкане на групата" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "Медиана" @@ -1105,6 +1244,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Ðов проблем" @@ -1122,18 +1264,27 @@ msgstr "Ðова папка" msgid "New file" msgstr "Ðов файл" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "Ðов проблем" msgid "New merge request" msgstr "Ðова заÑвка за Ñливане" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "Ðов план" msgid "New snippet" msgstr "Ðов отрÑзък" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "Ðов етикет" @@ -1212,6 +1363,12 @@ msgstr "Ðаблюдение" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Филтър" @@ -1353,9 +1510,54 @@ msgstr "Ñ ÐµÑ‚Ð°Ð¿Ð¸" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване." @@ -1365,9 +1567,6 @@ msgstr "Проектът „%{project_name}“ беше Ñъздаден уÑпРmsgid "Project '%{project_name}' was successfully updated." msgstr "Проектът „%{project_name}“ беше обновен уÑпешно." -msgid "Project '%{project_name}' will be deleted." -msgstr "Проектът „%{project_name}“ ще бъде изтрит." - msgid "Project access must be granted explicitly to each user." msgstr "ДоÑтъпът до проекта Ñ‚Ñ€Ñбва да бъде даван поотделно на вÑеки потребител." @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Прочетете повече" @@ -1515,6 +1729,9 @@ msgstr "ОтмÑна на тази заÑвка за Ñливане" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "Планиране на Ñхемите" msgid "Search branches and tags" msgstr "ТърÑете в клоновете и етикетите" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "Изберете формата на архива" @@ -1546,7 +1772,7 @@ msgid "Service Templates" msgstr "" msgid "Set a password on your account to pull or push via %{protocol}." -msgstr "Задайте парола на профила Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." +msgstr "Задайте парола на акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}." msgid "Set up CI" msgstr "ÐаÑтройка на ÐИ" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "Създайте %{new_merge_request} Ñ Ñ‚ÐµÐ·Ð¸ промени" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "Преминаване към клон/етикет" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "Етапът на програмиране показва времето от първото подаване до Ñъздаването на заÑвката за Ñливане. Данните ще бъдат добавени тук автоматично Ñлед като бъде Ñъздадена първата заÑвка за Ñливане." @@ -1744,6 +1982,15 @@ msgstr "Връзката на разклонение беше премахнат msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "Етапът на проблемите показва колко е времето от Ñъздаването на проблем до определÑнето на целеви етап на проекта за него, или до добавÑнето му в ÑпиÑък на дъÑката за проблеми. Започнете да добавÑте проблеми, за да видите данните за този етап." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "Етапът от цикъла на разработка" @@ -1774,6 +2021,12 @@ msgstr "Етапът на подготовка за издаване показРmsgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "Етапът на теÑтване показва времето, което е нужно на „Gitlab CI“ да изпълни вÑÑка Ñхема от задачи за Ñвързаната заÑвка за Ñливане. Данните ще бъдат добавени автоматично Ñлед като приключи изпълнението на първата Ви Ñхема." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "Времето, което отнема вÑеки Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ данни за ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ ÐµÑ‚Ð°Ð¿." @@ -1783,6 +2036,9 @@ msgstr "СтойноÑтта, коÑто Ñе намира в Ñредата нРmsgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "Без звезда" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2150,9 +2412,21 @@ msgstr "Ðа път Ñте да премахнете връзката на раРmsgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ðа път Ñте да прехвърлите „%{project_name_with_namespace}“ към друг ÑобÑтвеник. ÐÐИСТИÐРли иÑкате това?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "Можете да добавÑте файлове Ñамо когато Ñе намирате в клон" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "Ðе можете да Ñъздавате повече проекти" @@ -2178,7 +2452,7 @@ msgid "You will receive notifications only for comments in which you were @menti msgstr "Ще получавате извеÑÑ‚Ð¸Ñ Ñамо за коментари, в които Ви @Ñпоменават" msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account" -msgstr "ÐÑма да можете да изтеглÑте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила Ñи" +msgstr "ÐÑма да можете да изтеглÑте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за акаунта Ñи" msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile" msgstr "ÐÑма да можете да изтеглÑте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила Ñи" @@ -2186,6 +2460,9 @@ msgstr "ÐÑма да можете да изтеглÑте или изпраща msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "Вашето име" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "родител" msgstr[1] "родители" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po index f65012d1e1f..431e11818c1 100644 --- a/locale/de/gitlab.po +++ b/locale/de/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:36-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:30-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: German\n" "Language: de_DE\n" @@ -34,6 +34,11 @@ msgstr[1] "%s zusätzliche Commits wurden ausgelassen um Leistungsprobleme zu ve msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} hat %{commit_timeago} committet" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "%{storage_name}: %{failed_attempts} fehlgeschlagene Speicherzugriffe: msgid "(checkout the %{link} for information on how to install it)." msgstr "(beachte die Informationen zur Installation auf %{link})." +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "" @@ -110,9 +121,18 @@ msgstr "Füge einen SSH Schlüssel zu deinem Profil hinzu, um mittels SSH zu üb msgid "Add new directory" msgstr "Erstelle eine neues Verzeichnis" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "Alle" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -128,6 +148,9 @@ msgstr "Bist Du sicher, dass Du diesen Pipeline-Zeitplan löschen möchtest?" msgid "Are you sure you want to discard your changes?" msgstr "Bist Du sicher, dass Du alle Änderungen zurücksetzen willst?" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "Bist Du sicher, dass Du den Registrierungstoken zurücksetzen willst?" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "Abrechnung" @@ -235,6 +261,9 @@ msgstr[1] "Zweige" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Branch <strong>%{branch_name}</strong> wurde erstellt. Um die automatische Bereitstellung einzurichten, wähle eine GitLab CI Yaml Vorlage und committe Deine Änderungen. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Branches durchsuchen" @@ -445,15 +474,24 @@ msgstr "übersprungen" msgid "CiStatus|running" msgstr "laufend" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "Schließen" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "Commit" msgstr[1] "Commits" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "Mitarbeitsanleitung" msgid "Contributors" msgstr "Mitarbeiter" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "Öffentlichen SSH-Schlüssel in die Zwischenablage kopieren" @@ -684,9 +736,21 @@ msgstr "Erstelle Verzeichnis" msgid "Create empty bare repository" msgstr "Erstelle leeres Repository" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Erstelle Merge Request" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Erstelle neues..." @@ -773,6 +837,9 @@ msgstr "Verzeichnisname" msgid "Discard changes" msgstr "Änderungen verwerfen" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "Wöchentlich (Sonntags um 4:00 Uhr)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "Wechsel des Besitzers fehlgeschlagen" msgid "Failed to remove the pipeline schedule" msgstr "Entfernung der Pipelineplanung fehlgeschlagen" +msgid "File name" +msgstr "" + msgid "Files" msgstr "Dateien" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "Systemzustand" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "Intervallmuster" @@ -1052,6 +1182,9 @@ msgstr "Erfahre mehr in den" msgid "Learn more in the|pipeline schedules documentation" msgstr "Pipelineplanungsdokumentation" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "Verlasse die Gruppe" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "Gesperrte Dateien" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "Median" @@ -1105,6 +1244,9 @@ msgstr "hier" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Neues Ticket" @@ -1122,18 +1264,27 @@ msgstr "Neues Verzeichnis" msgid "New file" msgstr "Neue Datei" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "Neues Ticket" msgid "New merge request" msgstr "Neuer Merge Request" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "Neuer Zeitplan" msgid "New snippet" msgstr "Neuer Schnipsel" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "Neuer Tag" @@ -1212,6 +1363,12 @@ msgstr "Beobachten" msgid "Notifications" msgstr "Benachrichtigungen" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Filter" @@ -1353,9 +1510,54 @@ msgstr "mit Stages" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "Profil" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "Das Projekt '%{project_name}' wurde zur Löschung eingeplant." @@ -1365,9 +1567,6 @@ msgstr "Das Projekt '%{project_name}' wurde erfolgreich erstellt." msgid "Project '%{project_name}' was successfully updated." msgstr "Das Projekt '%{project_name}' wurde erfolgreich aktualisiert." -msgid "Project '%{project_name}' will be deleted." -msgstr "Das Projekt '%{project_name}' wird gelöscht." - msgid "Project access must be granted explicitly to each user." msgstr "Jedem Nutzer muss explizit der Zugriff auf das Projekt gewährt werden." @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "Ãœbertragungsereignisse" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Mehr lesen" @@ -1515,6 +1729,9 @@ msgstr "Merge Request zurücksetzen" msgid "SSH Keys" msgstr "SSH-Schlüssel" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "Pipelines planen" msgid "Search branches and tags" msgstr "Suche nach Branches und Tags" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "Archivierungsformat auswählen" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "Beginne einen %{new_merge_request} mit diesen Änderungen" msgid "Start the Runner!" msgstr "Starte den Runner!" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "Zu Branch/Tag wechseln" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "Die Entwicklungsphase stellt die Zeit vom ersten Commit bis zum Erstellen eines Merge Requests dar. Sobald Du Deinen ersten Merge Request anlegst, werden dessen Daten automatisch ergänzt." @@ -1744,6 +1982,15 @@ msgstr "Die Beziehung des Ablegers wurde entfernt." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "Die Ticketphase stellt die Zeit vom Anlegen eines Tickets bis zum Zuweisen eines Meilensteins oder Hinzufügen zur Aufgabentafel dar. Erstelle einen Ticket, damit dessen Daten hier erscheinen." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "Die Phase des Entwicklungslebenszyklus." @@ -1774,6 +2021,12 @@ msgstr "Die Staging-Phase stellt die Zeit zwischen der Umsetzung eines Merge Re msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "Die Testphase stellt die Zeit dar, die GitLab CI benötigt um die Pipelines von zugehörigen Merge Requests abzuarbeiten. Sobald die erste Pipeline abgeschlossen ist, werden deren Daten hier automatisch angezeigt." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "Zeit, die für das jeweilige Ereignis in der Phase ermittelt wurde." @@ -1783,6 +2036,9 @@ msgstr "Der mittlere aller erfassten Werte. Zum Beispiel ist für 3, 5, 9 der Me msgid "There are problems accessing Git storage: " msgstr "Es gibt ein Problem beim Zugriff auf den Gitspeicher:" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "Entfavorisieren" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "Wiki" @@ -2150,9 +2412,21 @@ msgstr "Du bist dabei, die Beziehung des Ablegers zum Ursprungsprojekt %{forked_ msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Du bist dabei %{project_name_with_namespace} einem andere Besitzer zu übergeben. Bist Du dir WIRKLICH sicher?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "Du kannst Dateien nur hinzufügen, wenn Du dich auf einem Branch befindest." +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "Du hast die Projektbegrenzung erreicht." @@ -2186,6 +2460,9 @@ msgstr "Du kannst erst mittels SSH übertragen (push) oder abrufen (pull), nachd msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "Dein Name" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "Vorgänger" msgstr[1] "Vorgänger" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po index 838c7b62810..0a1b379b3d3 100644 --- a/locale/eo/gitlab.po +++ b/locale/eo/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:36-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:30-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Esperanto\n" "Language: eo_UY\n" @@ -34,6 +34,11 @@ msgstr[1] "%s enmetadoj estis transsaltitaj, por ne troÅarÄi la sistemon." msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} enmetis %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "1 ĉenstablo" @@ -110,9 +121,18 @@ msgstr "Aldonu SSH-Ålosilon al via profilo por ebligi al vi eltiri kaj alpuÅi msgid "Add new directory" msgstr "Aldoni novan dosierujon" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -128,6 +148,9 @@ msgstr "Ĉu vi certe volas forigi ĉi tiun ĉenstablan planon?" msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -235,6 +261,9 @@ msgstr[1] "Branĉoj" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La branĉo <strong>%{branch_name}</strong> estis kreita. Por agordi aÅtomatan disponigadon, bonvolu elekti Yaml-Åablonon por GitLab CI kaj enmeti viajn ÅanÄojn. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Serĉu branĉon" @@ -445,15 +474,24 @@ msgstr "transsaltita" msgid "CiStatus|running" msgstr "plenumiÄanta" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "Enmetado" msgstr[1] "Enmetadoj" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "Gvidlinioj por kontribuado" msgid "Contributors" msgstr "Kontribuantoj" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -684,9 +736,21 @@ msgstr "Krei dosierujon" msgid "Create empty bare repository" msgstr "Krei malplenan deponejon" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Krei peton pri kunfando" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Krei novan…" @@ -773,6 +837,9 @@ msgstr "Nomo de dosierujo" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "Ĉiusemajne (en dimanĉo, je 4:00)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "Ne eblas ÅanÄi la posedanton" msgid "Failed to remove the pipeline schedule" msgstr "Ne eblas forigi la ĉenstablan planon" +msgid "File name" +msgstr "" + msgid "Files" msgstr "Dosieroj" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "Intervala Åablono" @@ -1052,6 +1182,9 @@ msgstr "Lernu pli en la" msgid "Learn more in the|pipeline schedules documentation" msgstr "dokumentado pri ĉenstablaj planoj" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "Forlasi la grupon" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "Mediano" @@ -1105,6 +1244,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Nova problemo" @@ -1122,18 +1264,27 @@ msgstr "Nova dosierujo" msgid "New file" msgstr "Nova dosiero" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "Nova problemo" msgid "New merge request" msgstr "Nova peto pri kunfando" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "Nova plano" msgid "New snippet" msgstr "Nova kodaĵo" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "Nova etikedo" @@ -1212,6 +1363,12 @@ msgstr "Rigardado" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Filtrilo" @@ -1353,9 +1510,54 @@ msgstr "kun etapoj" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "La projekto „%{project_name}“ estis alvicigita por forigado." @@ -1365,9 +1567,6 @@ msgstr "La projekto „%{project_name}“ estis sukcese kreita." msgid "Project '%{project_name}' was successfully updated." msgstr "La projekto „%{project_name}“ estis sukcese Äisdatigita." -msgid "Project '%{project_name}' will be deleted." -msgstr "La projekto „%{project_name}“ estos forigita." - msgid "Project access must be granted explicitly to each user." msgstr "Ĉiu uzanto devas akiri propran atingon al la projekto." @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Legu pli" @@ -1515,6 +1729,9 @@ msgstr "Malfari ĉi tiun peton pri kunfando" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "Planado de la ĉenstabloj" msgid "Search branches and tags" msgstr "Serĉu branĉon aÅ etikedon" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "Elektu formaton de arkivo" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "Kreu %{new_merge_request} kun ĉi tiuj ÅanÄoj" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "Iri al branĉo/etikedo" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "La etapo de programado montras la tempon de la unua enmetado Äis la kreado de la peto pri kunfando. La datenoj aldoniÄos aÅtomate ĉi tie post kiam vi kreas la unuan peton pri kunfando." @@ -1744,6 +1982,15 @@ msgstr "La rilato de disbranĉigo estis forigita." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "La etapo de la problemo montras kiom la tempo pasas de la kreado de problemo Äis la atribuado de la problemo al cela etapo de la projekto, aÅ al listo sur la problemtabulo. Komencu krei problemojn por vidi la datenojn por ĉi tiu etapo." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "La etapo de la disvolva ciklo." @@ -1774,6 +2021,12 @@ msgstr "La etapo de preparo por eldono montras la tempon inter la aplikado de la msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "La etapo de testado montras kiom da tempo necesas al „GitLab CI“ por plenumi ĉiujn ĉenstablojn por la rilata peto pri kunfando. La datenoj aldoniÄos aÅtomate post kiam via unua ĉenstablo finiÄos." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "La tempo, kiu estas necesa por ĉiu dateno kolektita de la etapo." @@ -1783,6 +2036,9 @@ msgstr "La valoro, kiu troviÄas en la mezo de aro da rigardataj valoroj. Ekzemp msgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "Malsteligi" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2148,11 +2410,23 @@ msgid "You are going to remove the fork relationship to source project %{forked_ msgstr "Vi forigos la rilaton de la disbranĉigo al la originala projekto, „%{forked_from_project}“. Ĉu vi estas ABSOLUTE certa?" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" -msgstr "Vi transigos „%{project_name_with_namespace}“ al alia posedanto. Ĉu vi estas ABSOLUTE certa?" +msgstr "Vi estas transigonta „%{project_name_with_namespace}“ al alia posedanto. Ĉu vi estas ABSOLUTE certa?" + +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" msgid "You can only add files when you are on a branch" msgstr "Oni povas aldoni dosierojn nur kiam oni estas en branĉo" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "Vi ne povas krei pliajn projektojn" @@ -2186,6 +2460,9 @@ msgstr "Vi ne povos eltiri aÅ alpuÅi kodon per SSH antaÅ ol vi %{add_ssh_key_ msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "Via nomo" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "patro" msgstr[1] "patroj" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po index c930e22a083..31ff4e08592 100644 --- a/locale/es/gitlab.po +++ b/locale/es/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:31-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -34,6 +34,11 @@ msgstr[1] "%s cambios adicionales han sido omitidos para evitar problemas de ren msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} cambió %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "" @@ -110,9 +121,18 @@ msgstr "Agregar una clave SSH a tu perfil para actualizar o enviar a través de msgid "Add new directory" msgstr "Agregar nuevo directorio" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -128,6 +148,9 @@ msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?" msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -235,6 +261,9 @@ msgstr[1] "Ramas" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La rama <strong>%{branch_name}</strong> fue creada. Para configurar el auto despliegue, escoge una plantilla Yaml para GitLab CI y envÃa tus cambios. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Buscar ramas" @@ -445,15 +474,24 @@ msgstr "omitido" msgid "CiStatus|running" msgstr "en ejecución" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "Cambio" msgstr[1] "Cambios" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "GuÃa de contribución" msgid "Contributors" msgstr "Contribuidores" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -684,9 +736,21 @@ msgstr "Crear directorio" msgid "Create empty bare repository" msgstr "Crear repositorio vacÃo" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Crear solicitud de fusión" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Crear nuevo..." @@ -773,6 +837,9 @@ msgstr "Nombre del directorio" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "Todas las semanas (domingos a las 4:00 am)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "Error al cambiar el propietario" msgid "Failed to remove the pipeline schedule" msgstr "Error al eliminar la programación del pipeline" +msgid "File name" +msgstr "" + msgid "Files" msgstr "Archivos" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "Patrón de intervalo" @@ -1052,6 +1182,9 @@ msgstr "Más información en la" msgid "Learn more in the|pipeline schedules documentation" msgstr "documentación sobre la programación de pipelines" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "Abandonar grupo" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "Mediana" @@ -1105,6 +1244,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Nueva incidencia" @@ -1122,18 +1264,27 @@ msgstr "Nuevo directorio" msgid "New file" msgstr "Nuevo archivo" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "Nueva incidencia" msgid "New merge request" msgstr "Nueva solicitud de fusión" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "Nueva programación" msgid "New snippet" msgstr "Nuevo fragmento de código" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "Nueva etiqueta" @@ -1212,6 +1363,12 @@ msgstr "Vigilancia" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Filtrar" @@ -1353,9 +1510,54 @@ msgstr "con etapas" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "Proyecto ‘%{project_name}’ en cola para eliminación." @@ -1365,9 +1567,6 @@ msgstr "Proyecto ‘%{project_name}’ fue creado satisfactoriamente." msgid "Project '%{project_name}' was successfully updated." msgstr "Proyecto ‘%{project_name}’ fue actualizado satisfactoriamente." -msgid "Project '%{project_name}' will be deleted." -msgstr "Proyecto ‘%{project_name}’ será eliminado." - msgid "Project access must be granted explicitly to each user." msgstr "El acceso al proyecto debe concederse explÃcitamente a cada usuario." @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Leer más" @@ -1515,6 +1729,9 @@ msgstr "Revertir esta solicitud de fusión" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "Programación de Pipelines" msgid "Search branches and tags" msgstr "Buscar ramas y etiquetas" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "Seleccionar formato de archivo" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "Iniciar una %{new_merge_request} con estos cambios" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "Cambiar rama/etiqueta" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "La etapa de desarrollo muestra el tiempo desde el primer cambio hasta la creación de la solicitud de fusión. Los datos serán automáticamente incorporados aquà una vez creada tu primera solicitud de fusión." @@ -1744,6 +1982,15 @@ msgstr "La relación con la bifurcación se ha eliminado." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "La etapa de incidencia muestra el tiempo que toma desde la creación de un tema hasta asignar el tema a un hito, o añadir el tema a una lista en el panel de temas. Empieza a crear temas para ver los datos de esta etapa." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "La etapa del ciclo de vida de desarrollo." @@ -1774,6 +2021,12 @@ msgstr "La etapa de puesta en escena muestra el tiempo entre la fusión y el des msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "La etapa de pruebas muestra el tiempo que GitLab CI toma para ejecutar cada pipeline para la solicitud de fusión relacionada. Los datos se añadirán automáticamente luego de que el primer pipeline termine de ejecutarse." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "El tiempo utilizado por cada entrada de datos obtenido por esa etapa." @@ -1783,6 +2036,9 @@ msgstr "El valor en el punto medio de una serie de valores observados. Por ejemp msgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "No Destacar" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2150,9 +2412,21 @@ msgstr "Vas a eliminar el enlace de la bifurcación con el proyecto original %{f msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Vas a transferir %{project_name_with_namespace} a otro propietario. ¿Estás TOTALMENTE seguro?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "Solo puedes agregar archivos cuando estás en una rama" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "Has alcanzado el lÃmite de tu proyecto" @@ -2186,6 +2460,9 @@ msgstr "No podrás actualizar o enviar código al proyecto a través de SSH hast msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "Tu nombre" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "padre" msgstr[1] "padres" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po index 56cc02c55d5..a4f9a34b13b 100644 --- a/locale/fr/gitlab.po +++ b/locale/fr/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:36-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:30-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: French\n" "Language: fr_FR\n" @@ -23,8 +23,8 @@ msgstr[1] "%d validations" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d couche" +msgstr[1] "%d couches" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -34,6 +34,11 @@ msgstr[1] "%s validations supplémentaires ont été masquées afin d'éviter de msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} a validé %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} validations de retard sur %{default_branch}, %{number_commits_ahead} validations d'avance" @@ -54,6 +59,12 @@ msgstr[1] "%{storage_name} : %{failed_attempts} tentatives d’accès au stocka msgid "(checkout the %{link} for information on how to install it)." msgstr "(Lisez %{link} pour savoir comment l'installer)." +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "1 pipeline" @@ -63,13 +74,13 @@ msgid "1st contribution!" msgstr "1ère contribution !" msgid "2FA enabled" -msgstr "" +msgstr "2FA activé" msgid "A collection of graphs regarding Continuous Integration" msgstr "Un ensemble de graphiques concernant l’Intégration Continue (CI)" msgid "About auto deploy" -msgstr "A propos de l'auto-déploiement" +msgstr "À propos de l'auto-déploiement" msgid "Abuse Reports" msgstr "Rapports d’abus" @@ -99,7 +110,7 @@ msgid "Add Contribution guide" msgstr "Ajouter un guide de contribution" msgid "Add Group Webhooks and GitLab Enterprise Edition." -msgstr "" +msgstr "Ajouter des Webhooks de groupe et GitLab Enterprise Edition." msgid "Add License" msgstr "Ajouter une licence" @@ -110,9 +121,18 @@ msgstr "Ajoutez une clef SSH à votre profil pour pouvoir récupérer et pousser msgid "Add new directory" msgstr "Ajouter un nouveau dossier" +msgid "AdminHealthPageLink|health page" +msgstr "État des services" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "Tous" +msgid "An error occurred. Please try again." +msgstr "Une erreur est survenue. Merci de réessayer." + msgid "Appearance" msgstr "Apparence" @@ -123,13 +143,16 @@ msgid "Archived project! Repository is read-only" msgstr "Projet archivé ! Le dépôt est en lecture seule" msgid "Are you sure you want to delete this pipeline schedule?" -msgstr "Êtes-vous sûr de vouloir supprimer ce pipeline programmé" +msgstr "Êtes-vous sûr·e de vouloir supprimer ce pipeline programmé ?" msgid "Are you sure you want to discard your changes?" -msgstr "Êtes-vous sûr de vouloir annuler vos modifications ?" +msgstr "Êtes-vous sûr·e de vouloir annuler vos modifications ?" + +msgid "Are you sure you want to leave this group?" +msgstr "Êtes-vous sûr·e de vouloir quitter ce groupe ?" msgid "Are you sure you want to reset registration token?" -msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton d’inscription ?" +msgstr "Êtes-vous sûr·e de vouloir réinitialiser le jeton d’inscription ?" msgid "Are you sure you want to reset the health check token?" msgstr "Êtes-vous sûr de vouloir réinitialiser le jeton de bilan de santé ?" @@ -147,64 +170,67 @@ msgid "Authentication Log" msgstr "Journal d'authentification" msgid "Author" -msgstr "" +msgstr "Auteur" msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." -msgstr "" +msgstr "Les applications de révision automatique et le déploiement automatique requièrent un nom de domaine et un %{kubernetes} pour fonctionner correctement." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." -msgstr "" +msgstr "Les applications de révision automatique et de déploiement automatique requièrent un nom de domaine pour fonctionner correctement." msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." -msgstr "" +msgstr "Les applications de révision automatique et de déploiement automatique requièrent un %{kubernetes} pour fonctionner correctement." msgid "AutoDevOps|Auto DevOps (Beta)" -msgstr "" - -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" +msgstr "Auto DevOps (Béta)" msgid "AutoDevOps|Auto DevOps documentation" -msgstr "" +msgstr "Documentation Auto DevOps" msgid "AutoDevOps|Enable in settings" -msgstr "" +msgstr "Activer dans les paramètres" + +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "AutoDevOps vous permet de construire, tester et déployer automatiquement votre application à partir d'une configuration CI/CD prédéfinie." msgid "AutoDevOps|Learn more in the %{link_to_documentation}" -msgstr "" +msgstr "En savoir plus dans %{link_to_documentation}" + +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "Vous pouvez activer %{link_to_settings} pour ce projet." msgid "Billing" msgstr "Facturation" msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." -msgstr "" +msgstr "%{group_name} est actuellement abonné au forfait %{plan_link}." msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "" +msgstr "La mise à niveau de certains abonnements n’est actuellement pas disponible." msgid "BillingPlans|Current plan" -msgstr "" +msgstr "Abonnement actuel" msgid "BillingPlans|Customer Support" -msgstr "" +msgstr "Support client" msgid "BillingPlans|Downgrade" -msgstr "" +msgstr "Retour à un forfait inférieur" msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." -msgstr "" +msgstr "En savoir plus sur chaque abonnement en lisant nos %{faq_link}." msgid "BillingPlans|Manage plan" -msgstr "" +msgstr "Gérer l'abonnement" msgid "BillingPlans|Please contact %{customer_support_link} in that case." -msgstr "" +msgstr "Merci de contacter %{customer_support_link} à ce sujet." msgid "BillingPlans|See all %{plan_name} features" -msgstr "" +msgstr "Voir toutes les fonctionnalités de l’abonnement %{plan_name}" msgid "BillingPlans|This group uses the plan associated with its parent group." -msgstr "Ce groupe utilise le plan associé à son groupe parent." +msgstr "Ce groupe utilise l’abonnement associé à son groupe parent." msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." msgstr "Pour gérer le plan de ce groupe, visitez la section facturation de %{parent_billing_page_link}." @@ -213,19 +239,19 @@ msgid "BillingPlans|Upgrade" msgstr "Mise à niveau" msgid "BillingPlans|You are currently on the %{plan_link} plan." -msgstr "" +msgstr "Vous êtes actuellement abonné·e au forfait %{plan_link}." msgid "BillingPlans|frequently asked questions" -msgstr "" +msgstr "Foire aux questions" msgid "BillingPlans|monthly" -msgstr "" +msgstr "Mensuellement" msgid "BillingPlans|paid annually at %{price_per_year}" -msgstr "" +msgstr "au prix annuel de %{price_per_year}" msgid "BillingPlans|per user" -msgstr "" +msgstr "par utilisateur" msgid "Branch" msgid_plural "Branches" @@ -233,7 +259,10 @@ msgstr[0] "Branche" msgstr[1] "Branches" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" -msgstr "La branche <strong>%{branch_name}</strong> a été crée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}" +msgstr "La branche <strong>%{branch_name}</strong> a été créée. Pour mettre en place le déploiement automatisé, sélectionnez un modèle de fichier Yaml pour l'intégration continue (CI) de GitLab, et validez les modifications. %{link_to_autodeploy_doc}" + +msgid "Branch has changed" +msgstr "La branche a été modifiée" msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Rechercher la branche" @@ -314,7 +343,7 @@ msgid "Branches|To discard the local changes and overwrite the branch with the u msgstr "Pour rejeter les changements locaux et écraser la branche avec la version du dépôt en amont, veuillez la supprimer ici puis cliquez ci-dessus sur 'Mettre à jour maintenant'." msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." -msgstr "Vous êtes sur le point de supprimer définitivement la branche protégées %{branch_name}." +msgstr "Vous êtes sur le point de supprimer définitivement la branche protégée %{branch_name}." msgid "Branches|diverged from upstream" msgstr "a dévié du dépôt en amont" @@ -362,13 +391,13 @@ msgid "Change Weight" msgstr "Changer le poids" msgid "ChangeTypeActionLabel|Pick into branch" -msgstr "Sélectionner dans la branche" +msgstr "Picorer dans la branche" msgid "ChangeTypeActionLabel|Revert in branch" msgstr "Défaire dans la branche" msgid "ChangeTypeAction|Cherry-pick" -msgstr "Sélectionner" +msgstr "Picorer" msgid "ChangeTypeAction|Revert" msgstr "Défaire" @@ -377,19 +406,19 @@ msgid "Changelog" msgstr "Journal des modifications" msgid "Charts" -msgstr "Graphiques" +msgstr "Statistiques" msgid "Chat" msgstr "Chat" msgid "Cherry-pick this commit" -msgstr "Sélectionner cette validation" +msgstr "Picorer cette validation" msgid "Cherry-pick this merge request" -msgstr "Sélectionner cette demande de fusion" +msgstr "Picorer cette demande de fusion" msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all." -msgstr "" +msgstr "Choisissez quels groupes vous souhaitez répliquer sur le nÅ“ud secondaire. Laissez vide pour tous les répliquer." msgid "CiStatusLabel|canceled" msgstr "annulé" @@ -445,134 +474,146 @@ msgstr "ignoré" msgid "CiStatus|running" msgstr "en cours" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "CircuitBreaker API" + msgid "Clone repository" -msgstr "" +msgstr "Cloner le dépôt" msgid "Close" msgstr "Fermer" +msgid "Cluster" +msgstr "Cluster" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" -msgstr "" +msgstr "Un %{link_to_container_project} doit avoir été créé pour ce compte" + +msgid "ClusterIntegration|Cluster details" +msgstr "Détails du cluster" msgid "ClusterIntegration|Cluster integration" -msgstr "" +msgstr "Intégration du cluster" msgid "ClusterIntegration|Cluster integration is disabled for this project." -msgstr "" +msgstr "L'intégration du cluster est désactivée pour ce projet." msgid "ClusterIntegration|Cluster integration is enabled for this project." -msgstr "" +msgstr "L'intégration du cluster est activée pour ce projet." msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "L'intégration de cluster est activée pour ce projet. La désactivation de cette intégration n’affectera pas votre cluster, il coupera temporairement la connexion de GitLab à celui-ci." msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." -msgstr "" +msgstr "Le cluster est en cours de création sur Google Container Engine…" msgid "ClusterIntegration|Cluster name" -msgstr "" +msgstr "Nom du cluster" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" -msgstr "" +msgstr "Le cluster a été correctement créé sur Google Container Engine" msgid "ClusterIntegration|Copy cluster name" -msgstr "" +msgstr "Copier le nom du cluster" msgid "ClusterIntegration|Create cluster" -msgstr "" +msgstr "Créer le cluster" msgid "ClusterIntegration|Create new cluster on Google Container Engine" -msgstr "" +msgstr "Créer un nouveau cluster sur Google Container Engine" msgid "ClusterIntegration|Enable cluster integration" -msgstr "" +msgstr "Activer l’intégration du cluster" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "ID de projet Google Cloud Platform" msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Google Container Engine project" -msgstr "" - -msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" +msgstr "En savoir plus sur %{link_to_documentation}" -msgid "ClusterIntegration|See machine types" -msgstr "" +msgid "ClusterIntegration|Machine type" +msgstr "Type de machine" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" -msgstr "" +msgstr "Assurez-vous que votre compte %{link_to_requirements} pour créer des clusters" + +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "Gérer l’intégration du cluster sur votre projet GitLab" msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" -msgstr "" +msgstr "Gérer votre cluster en visitant le lien %{link_gke}" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "Nombre de nÅ“uds" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "Veuillez vous assurer que votre compte Google répond aux exigences suivantes : " msgid "ClusterIntegration|Project namespace (optional, unique)" -msgstr "" +msgstr "Espace de noms du projet (facultatif, unique)" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "Lire notre %{link_to_help_page} sur l’intégration d’un cluster." msgid "ClusterIntegration|Remove cluster integration" -msgstr "" +msgstr "Retirer l’intégration du cluster" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "Retirer l’intégration" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." -msgstr "" +msgstr "Supprimer l'intégration du cluster supprimera sa configuration que vous avez ajoutée pour ce projet. Cela ne supprimera pas votre projet." -msgid "ClusterIntegration|Save changes" -msgstr "" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "Voir et modifier les détails de votre cluster" + +msgid "ClusterIntegration|See machine types" +msgstr "Voir les types de machine" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "Voir vos projets" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "Voir les zones" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" - -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" +msgstr "Un problème est survenu de notre côté." -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" +msgstr "Un problème est survenu lors de la création de votre cluster sur Google Container Engine." msgid "ClusterIntegration|Toggle Cluster" -msgstr "" - -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" +msgstr "Activer/désactiver le cluster" msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "Avec un cluster associé à ce projet, vous pouvez utiliser des applications de revue, déployer vos applications, exécuter vos pipelines et bien plus encore, de manière très simple." msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" -msgstr "" +msgstr "Votre compte doit disposer de %{link_to_container_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "Zone" msgid "ClusterIntegration|access to Google Container Engine" -msgstr "" +msgstr "Accéder à Google Container Engine" msgid "ClusterIntegration|cluster" -msgstr "" +msgstr "cluster" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "page d’aide" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "répond aux exigences" msgid "ClusterIntegration|properly configured" -msgstr "" +msgstr "correctement configuré" msgid "Comments" msgstr "Commentaires" @@ -582,8 +623,13 @@ msgid_plural "Commits" msgstr[0] "Validation" msgstr[1] "Validations" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" -msgstr "" +msgstr "Message de validation" msgid "Commit duration in minutes for last 30 commits" msgstr "Durée des 30 derniers pipelines en minutes" @@ -613,49 +659,49 @@ msgid "Compare" msgstr "Comparer" msgid "Container Registry" -msgstr "" +msgstr "Registre de conteneur" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "Créé" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" -msgstr "" +msgstr "D’abord inscrivez-vous au registre de conteneur GitLab à l’aide de votre nom d’utilisateur GitLab et de votre mot de passe. Si vous avez %{link_2fa} vous devrez utiliser un %{link_token} :" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "GitLab prend en charge jusqu'à 3 niveaux de noms d’image. Les exemples d’images suivants sont valides pour votre projet :" msgid "ContainerRegistry|How to use the Container Registry" -msgstr "" +msgstr "Comment utiliser le registre de conteneur" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "En savoir plus sur" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "Aucune étiquettes dans le registre de conteneur pour l’image de ce conteneur." msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "Une fois identifié·e, vous êtes libre de créer et télécharger une image de conteneur en utilisant les commandes courantes de %{build} et %{push}" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "Supprimer le dépôt" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "Supprimer l’étiquette" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "Taille" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "Étiquette" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "ID d‘étiquette" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "Utilisez des noms d’images différents" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." -msgstr "" +msgstr "Avec le registre de conteneur Docker intégré à GitLab, chaque projet peut avoir son propre espace pour stocker ses images Docker." msgid "Contribution guide" msgstr "Guilde de contribution" @@ -663,6 +709,12 @@ msgstr "Guilde de contribution" msgid "Contributors" msgstr "Contributeurs" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "Contrôler la concurrence maximale des remplacements de fichier-joint LFS pour ce nÅ“ud secondaire" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "Contrôler la concurrence maximale des remplacements de dépôt pour ce nÅ“ud secondaire" + msgid "Copy SSH public key to clipboard" msgstr "Copier la clé publique SSH dans le presse-papier" @@ -684,9 +736,21 @@ msgstr "Créer un dossier" msgid "Create empty bare repository" msgstr "Créer un dépôt vide" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Créer une demande de fusion" +msgid "Create new branch" +msgstr "Créer une nouvelle branche" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Créer nouveau..." @@ -721,7 +785,7 @@ msgid "CycleAnalyticsStage|Code" msgstr "Code" msgid "CycleAnalyticsStage|Issue" -msgstr "Incident" +msgstr "Ticket" msgid "CycleAnalyticsStage|Plan" msgstr "Planification" @@ -762,7 +826,7 @@ msgid "Description" msgstr "Description" msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." -msgstr "" +msgstr "Les modèles de description permettent de définir des modèles spécifiques au contexte pour les champs de description de tickets et demandes de fusion pour votre projet." msgid "Details" msgstr "Détails" @@ -773,8 +837,11 @@ msgstr "Nom du dossier" msgid "Discard changes" msgstr "Supprimer les modifications" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "Passer l’introduction Cycle Analytics" + msgid "Dismiss Merge Request promotion" -msgstr "" +msgstr "Rejeter la promotion de la demande de fusion" msgid "Don't show again" msgstr "Ne plus montrer" @@ -822,7 +889,7 @@ msgid "EventFilterBy|Filter by comments" msgstr "Filtrer par commentaires" msgid "EventFilterBy|Filter by issue events" -msgstr "Filtrer par événements d'incident" +msgstr "Filtrer par événements de ticket" msgid "EventFilterBy|Filter by merge events" msgstr "Filtrer par événements de fusion" @@ -834,23 +901,29 @@ msgid "EventFilterBy|Filter by team" msgstr "Filtrer par équipe" msgid "Every day (at 4:00am)" -msgstr "Chaque jour (à 4:00 du matin)" +msgstr "Chaque jour (à 4h00 du matin)" msgid "Every month (on the 1st at 4:00am)" msgstr "Chaque mois (le 1er à 4:00 du matin)" msgid "Every week (Sundays at 4:00am)" -msgstr "Chaque semaine (dimanche à 4:00 du matin)" +msgstr "Chaque semaine (dimanche à 4h00 du matin)" msgid "Explore projects" msgstr "Explorer les projets" +msgid "Explore public groups" +msgstr "Explorer les groupes publics" + msgid "Failed to change the owner" msgstr "Échec du changement de propriétaire" msgid "Failed to remove the pipeline schedule" msgstr "Échec de la suppression du pipeline programmé" +msgid "File name" +msgstr "" + msgid "Files" msgstr "Fichiers" @@ -878,13 +951,13 @@ msgid "ForkedFromProjectPath|Forked from" msgstr "Fourché depuis" msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" -msgstr "" +msgstr "Fourché depuis %{project_name} (supprimé)" msgid "Format" msgstr "Format" msgid "From issue creation until deploy to production" -msgstr "Depuis la création de l'incident jusqu'au déploiement en production" +msgstr "Depuis la création du ticket jusqu'au déploiement en production" msgid "From merge request merge until deploy to production" msgstr "Depuis la fusion de la demande de fusion jusqu'au déploiement en production" @@ -893,19 +966,25 @@ msgid "GPG Keys" msgstr "Clés GPG" msgid "Geo Nodes" -msgstr "" +msgstr "NÅ“uds Geo" + +msgid "Geo|File sync capacity" +msgstr "Capacité de synchronisation de fichier" msgid "Geo|Groups to replicate" -msgstr "" +msgstr "Groupes à répliquer" + +msgid "Geo|Repository sync capacity" +msgstr "Capacité de synchronisation du dépôt" msgid "Geo|Select groups to replicate." -msgstr "" +msgstr "Sélectionner les groupes à répliquer." msgid "Git storage health information has been reset" msgstr "Les informations de santé du stockage Git ont été réinitialisées" msgid "GitLab Runner section" -msgstr "Section de Runner GitLab" +msgstr "Section de l'Exécuteur GitLab" msgid "Go to your fork" msgstr "Aller à votre fourche" @@ -914,37 +993,82 @@ msgid "GoToYourFork|Fork" msgstr "Fourche" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "L’authentification Google n’est pas %{link_to_documentation}. Demandez à votre administrateur GitLab si vous souhaitez utiliser ce service." msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" -msgstr "" +msgstr "Empêcher le partage d'un projet de %{group} avec d'autres groupes" msgid "GroupSettings|Share with group lock" -msgstr "" +msgstr "Verrou de partage avec un groupe" msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." -msgstr "" +msgstr "Ce paramètre est appliqué sur %{ancestor_group} et a été modifié dans ce sous-groupe." msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Ce paramètre est appliqué sur %{ancestor_group}. Pour partager des projets dans ce groupe avec un autre groupe, demander au propriétaire de modifier le paramètre ou %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Ce paramètre s’applique sur %{ancestor_group}. Vous pouvez modifier le paramètre ou le %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." -msgstr "" +msgstr "Ce paramètre s’appliquera à tous les sous-groupes, sauf s’il est modifié par un propriétaire du groupe. Les groupes déjà liés au projet continueront d’y avoir accès à moins d’être retirés manuellement." msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" -msgstr "" +msgstr "ne peut pas être désactivé lorsque le groupe parent « Verrou de partage avec un groupe » est activé, sauf pour le propriétaire du groupe parent" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" -msgstr "" +msgstr "supprimer le verrou de partage avec un groupe pour %{ancestor_group_name}" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "Un groupe est une collection de plusieurs projets." + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "Si vous organisez vos projets au sein d’un groupe, il fonctionnera comme un dossier." + +msgid "GroupsEmptyState|No groups found" +msgstr "Aucun groupe trouvé" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "Vous pouvez gérer les autorisations des membres de votre groupe et accéder à chacun de ses projets." + +msgid "GroupsTreeRole|as" +msgstr "comme" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "Êtes-vous sûr·e de vouloir quitter le groupe « ${this.group.fullName} » ?" + +msgid "GroupsTree|Create a project in this group." +msgstr "Créez un projet dans ce groupe." + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "Créer un sous-groupe de ce groupe." + +msgid "GroupsTree|Edit group" +msgstr "Modifier le groupe" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "Impossible de quitter le groupe. Veuillez vous assurer que vous n’êtes pas seul·e propriétaire." + +msgid "GroupsTree|Filter by name..." +msgstr "Filtrer par nom…" + +msgid "GroupsTree|Leave this group" +msgstr "Quitter ce groupe" + +msgid "GroupsTree|Loading groups" +msgstr "Chargement des groupes" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "Désolé, aucun groupe ne correspond à vos critères de recherche" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "Désolé, aucun groupe ni projet ne correspond à vos critères de recherche" msgid "Health Check" -msgstr "Bilan de santé" +msgstr "État des services" msgid "Health information can be retrieved from the following endpoints. More information is available" -msgstr "Des informations de santé peuvent être récupérées depuis les adresses suivantes. Plus d’informations" +msgstr "L’état des service peut être récupéré depuis les adresses suivantes. Plus d’information disponible." msgid "HealthCheck|Access token is" msgstr "Le jeton d’accès est" @@ -968,21 +1092,27 @@ msgid "Import repository" msgstr "Importer un dépôt" msgid "Improve Issue boards with GitLab Enterprise Edition." -msgstr "" +msgstr "Améliorer le tableau de tickets avec GitLab Entreprise Edition." msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." -msgstr "" +msgstr "Améliorer la gestion des tickets avec les poids de ticket et GitLab Entreprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." -msgstr "" +msgstr "Améliorer la recherche avec la Recherche Globale Avancée et GitLab Enterprise Edition." msgid "Install a Runner compatible with GitLab CI" -msgstr "Installez un Runner compatible avec l'intégration continue de GitLab" +msgstr "Installez un Exécuteur compatible avec l'intégration continue de GitLab" msgid "Instance" msgid_plural "Instances" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Instance" +msgstr[1] "Instances" + +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "Interne - Le groupe ainsi que tous les projets internes sont accessibles pour n’importe quel·le utilisa·teur·trice connecté·e." + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "Interne - Le projet est accessible pour n’importe quel·le utilisa·teur·trice connecté·e." msgid "Interval Pattern" msgstr "Schéma d’intervalle" @@ -991,13 +1121,13 @@ msgid "Introducing Cycle Analytics" msgstr "Introduction à l'analyseur de cycle" msgid "Issue board focus mode" -msgstr "" +msgstr "Mode focus du tableau de tickets" msgid "Issue boards with milestones" -msgstr "Tableaux d'incidents avec leurs jalons" +msgstr "Tableaux des tickets avec leurs jalons" msgid "Issue events" -msgstr "Événements de l'incident" +msgstr "Événements du ticket" msgid "IssueBoards|Board" msgstr "Tableau" @@ -1006,7 +1136,7 @@ msgid "IssueBoards|Boards" msgstr "Tableaux" msgid "Issues" -msgstr "Incidents" +msgstr "Tickets" msgid "LFSStatus|Disabled" msgstr "Désactivé" @@ -1015,7 +1145,7 @@ msgid "LFSStatus|Enabled" msgstr "Activé" msgid "Labels" -msgstr "Étiquettes" +msgstr "Labels" msgid "Last %d day" msgid_plural "Last %d days" @@ -1029,16 +1159,16 @@ msgid "Last commit" msgstr "Dernière validation" msgid "Last edited %{date}" -msgstr "" +msgstr "Dernière modification le %{date}" msgid "Last edited by %{name}" -msgstr "" +msgstr "Dernière modification par %{name}" msgid "Last update" -msgstr "" +msgstr "Dernière mise à jour" msgid "Last updated" -msgstr "" +msgstr "Dernière mise à jour" msgid "LastPushEvent|You pushed to" msgstr "Vous avez poussé sur" @@ -1052,6 +1182,9 @@ msgstr "En apprendre plus dans le" msgid "Learn more in the|pipeline schedules documentation" msgstr "documentation concernant la programmation de pipeline" +msgid "Leave" +msgstr "Quitter" + msgid "Leave group" msgstr "Quitter le groupe" @@ -1075,6 +1208,12 @@ msgstr "Verrouillé" msgid "Locked Files" msgstr "Fichiers verrouillés" +msgid "Login" +msgstr "Se connecter" + +msgid "Maximum git storage failures" +msgstr "Nombre maximum d’échecs du stockage git" + msgid "Median" msgstr "Médian" @@ -1094,7 +1233,7 @@ msgid "Messages" msgstr "Messages" msgid "MissingSSHKeyWarningLink|add an SSH key" -msgstr "ajouter une clef SSH" +msgstr "ajouter une clé SSH" msgid "Monitoring" msgstr "Surveillance" @@ -1103,12 +1242,15 @@ msgid "More information is available|here" msgstr "ici" msgid "Multiple issue boards" -msgstr "" +msgstr "Multiple tableaux de tickets" + +msgid "New Cluster" +msgstr "Nouveau cluster" msgid "New Issue" msgid_plural "New Issues" -msgstr[0] "Nouvel incident" -msgstr[1] "Nouveaux incidents" +msgstr[0] "Nouveau ticket" +msgstr[1] "Nouveaux tickets" msgid "New Pipeline Schedule" msgstr "Nouveau pipeline programmé" @@ -1120,25 +1262,34 @@ msgid "New directory" msgstr "Nouveau dossier" msgid "New file" -msgstr "Nouveau Fichier" +msgstr "Nouveau fichier" + +msgid "New group" +msgstr "Nouveau groupe" msgid "New issue" -msgstr "Nouvel incident" +msgstr "Nouveau ticket" msgid "New merge request" msgstr "Nouvelle demande de fusion" +msgid "New project" +msgstr "Nouveau projet" + msgid "New schedule" msgstr "Nouveau programme" msgid "New snippet" msgstr "Nouvel extrait de code" +msgid "New subgroup" +msgstr "Nouveau sous-groupe" + msgid "New tag" msgstr "Nouveau tag" msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" +msgstr "Aucune image de conteneur stockée pour ce projet. Ajoutez en une en suivant les instructions ci-dessous." msgid "No repository" msgstr "Pas de dépôt" @@ -1147,7 +1298,7 @@ msgid "No schedules" msgstr "Aucun programme" msgid "None" -msgstr "Aucun(e)" +msgstr "Aucun·e" msgid "Not available" msgstr "Indisponible" @@ -1159,7 +1310,7 @@ msgid "Notification events" msgstr "Événement de notifications" msgid "NotificationEvent|Close issue" -msgstr "Clore l'incident" +msgstr "Clore le ticket" msgid "NotificationEvent|Close merge request" msgstr "Clore la demande de fusion" @@ -1171,7 +1322,7 @@ msgid "NotificationEvent|Merge merge request" msgstr "Fusionner le demande de fusion" msgid "NotificationEvent|New issue" -msgstr "Nouvel incident" +msgstr "Nouveau ticket" msgid "NotificationEvent|New merge request" msgstr "Nouvelle demande de fusion" @@ -1180,13 +1331,13 @@ msgid "NotificationEvent|New note" msgstr "Nouvelle note" msgid "NotificationEvent|Reassign issue" -msgstr "Réassigner l'incident" +msgstr "Réassigner le ticket" msgid "NotificationEvent|Reassign merge request" msgstr "Réassigner la demande de fusion" msgid "NotificationEvent|Reopen issue" -msgstr "Ré-ouvrir l'incident" +msgstr "Ré-ouvrir le ticket" msgid "NotificationEvent|Successful pipeline" msgstr "Pipeline réussi" @@ -1212,17 +1363,23 @@ msgstr "Surveillé" msgid "Notifications" msgstr "Notifications" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Filtre" msgid "Only project members can comment." -msgstr "" +msgstr "Seuls les membres du projet peuvent commenter." msgid "OpenedNDaysAgo|Opened" msgstr "Ouvert" msgid "Opens in a new window" -msgstr "" +msgstr "Ouvrir dans une nouvelle fenêtre" msgid "Options" msgstr "Paramètres" @@ -1249,7 +1406,7 @@ msgid "Password" msgstr "Mot de Passe" msgid "People without permission will never get a notification and won\\'t be able to comment." -msgstr "" +msgstr "Les personnes sans autorisation ne recevront jamais de notifications et ne pourront pas commenter." msgid "Pipeline" msgstr "Pipeline" @@ -1330,13 +1487,13 @@ msgid "Pipelines charts" msgstr "Graphique des pipelines" msgid "Pipelines for last month" -msgstr "Pipelines pour le dernier mois" +msgstr "Pipelines du dernier mois" msgid "Pipelines for last week" -msgstr "Pipelines pour la dernière semaine" +msgstr "Pipelines de la semaine dernière" msgid "Pipelines for last year" -msgstr "Pipelines pour la dernière année" +msgstr "Pipelines de l’année dernière" msgid "Pipeline|all" msgstr "Tous" @@ -1353,9 +1510,54 @@ msgstr "avec les étapes" msgid "Preferences" msgstr "Préférences" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "Privé - L’accès au projet doit être autorisé explicitement pour chaque utilisa·teur·trice." + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "Privé - Le groupe ainsi que ses projets ne sont accessibles qu’à ses membres." + msgid "Profile" msgstr "Profil" +msgid "Profiles|Account scheduled for removal." +msgstr "Compte programmé pour sa suppression." + +msgid "Profiles|Delete Account" +msgstr "Supprimer le compte" + +msgid "Profiles|Delete account" +msgstr "Supprimer le compte" + +msgid "Profiles|Delete your account?" +msgstr "Supprimer votre compte ?" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "Supprimer un compte aura les conséquences suivantes :" + +msgid "Profiles|Invalid password" +msgstr "Mot de passe incorrect" + +msgid "Profiles|Invalid username" +msgstr "Nom d’utilisateur incorrect" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "Saisissez votre %{confirmationValue} pour confirmer :" + +msgid "Profiles|You don't have access to delete this user." +msgstr "Vous n’avez pas les autorisations suffisantes pour supprimer cet·te utilisa·teur·trice." + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "Vous devez transférer la propriété ou supprimer ces groupes avant de pouvoir supprimer votre compte." + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "Votre compte est actuellement propriétaire des groupes suivants :" + +msgid "Profiles|your account" +msgstr "votre compte" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "Le projet “%{project_name}†est en train d’être supprimé." + msgid "Project '%{project_name}' queued for deletion." msgstr "Projet '%{project_name}' en attente de suppression." @@ -1365,9 +1567,6 @@ msgstr "Projet '%{project_name}' créé avec succès." msgid "Project '%{project_name}' was successfully updated." msgstr "Projet '%{project_name}' mis à jour avec succès." -msgid "Project '%{project_name}' will be deleted." -msgstr "Le projet '%{project_name}' sera supprimé." - msgid "Project access must be granted explicitly to each user." msgstr "L’accès au projet doit être explicitement accordé à chaque utilisateur." @@ -1408,23 +1607,29 @@ msgid "ProjectLifecycle|Stage" msgstr "Étape" msgid "ProjectNetworkGraph|Graph" -msgstr "Graphique " +msgstr "Graphes" msgid "ProjectSettings|Contact an admin to change this setting." -msgstr "" +msgstr "Contactez un administrateur pour modifier ce paramètre." msgid "ProjectSettings|Only signed commits can be pushed to this repository." -msgstr "" +msgstr "Seules les validations signées peuvent être poussées sur ce dépôt." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." -msgstr "" +msgstr "Ce paramètre est appliqué au niveau du serveur et peut être modifié par un administrateur." msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." -msgstr "" +msgstr "Ce paramètre est appliqué au niveau du serveur mais il a été modifié pour ce projet." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un administrateur ne le modifie." + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgstr "" +msgid "Projects" +msgstr "Projets" + msgid "ProjectsDropdown|Frequently visited" msgstr "Fréquemment visité" @@ -1446,12 +1651,21 @@ msgstr "Désolé, aucun projet ne correspond à votre recherche" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Cette fonctionnalité requiert le support du localStorage par votre navigateur" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "Public - Le groupe ainsi que n’importe quel projet public est accessible sans authentification." + +msgid "Public - The project can be accessed without any authentication." +msgstr "Public - Le projet est accessible sans aucune authentification." + msgid "Push Rules" msgstr "Règles de poussée" msgid "Push events" msgstr "Évènements de poussée" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Lire plus" @@ -1471,10 +1685,10 @@ msgid "Related Commits" msgstr "Validations liés" msgid "Related Deployed Jobs" -msgstr "Tâches de déploiement liés" +msgstr "Tâches de déploiement liées" msgid "Related Issues" -msgstr "Incidents liés" +msgstr "Tickets liés" msgid "Related Jobs" msgstr "Tâches liées" @@ -1504,7 +1718,7 @@ msgid "Reset health check access token" msgstr "Réinitialiser le jeton d’accès au bilan de santé" msgid "Reset runners registration token" -msgstr "Réinitialiser le jeton d’inscription des Runners" +msgstr "Réinitialiser le jeton d’inscription des exécuteurs" msgid "Revert this commit" msgstr "Défaire cette validation" @@ -1515,6 +1729,9 @@ msgstr "Défaire cette demande de fusion" msgid "SSH Keys" msgstr "Clés SSH" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "Enregistrer les modifications" @@ -1533,6 +1750,15 @@ msgstr "Programmer des pipelines" msgid "Search branches and tags" msgstr "Rechercher dans les branches et les étiquettes" +msgid "Seconds before reseting failure information" +msgstr "Nombre de secondes avant de réinitialiser les informations d’échec" + +msgid "Seconds to wait after a storage failure" +msgstr "Nombre de secondes d'attente après un échec de stockage" + +msgid "Seconds to wait for a storage access attempt" +msgstr "Nombre de secondes d’attente pour un essai d'accès au stockage" + msgid "Select Archive Format" msgstr "Sélectionnez le format de l'archive" @@ -1578,16 +1804,19 @@ msgid "Snippets" msgstr "Extraits de code" msgid "Something went wrong on our end." -msgstr "" +msgstr "Une erreur est survenue de notre côté." + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "Quelque chose ne s'est pas bien passé en essayant de changer l’état de verrouillage de cet ${this.issuableDisplayName(this.issuableType)}" msgid "Something went wrong while fetching the projects." -msgstr "" +msgstr "Une erreur s'est produite lors de la récupération des projets." msgid "Something went wrong while fetching the registry list." -msgstr "" +msgstr "Une erreur s'est produite lors de la récupération de la liste du registre." -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "" +msgid "Sort by" +msgstr "Trier par" msgid "SortOptions|Access level, ascending" msgstr "Niveau d’accès, croissant" @@ -1608,7 +1837,7 @@ msgid "SortOptions|Due soon" msgstr "Échéance proche" msgid "SortOptions|Label priority" -msgstr "Priorité des étiquettes" +msgstr "Priorité du label" msgid "SortOptions|Largest group" msgstr "Taille de groupe" @@ -1662,7 +1891,7 @@ msgid "SortOptions|Oldest joined" msgstr "Rejoint depuis longtemps" msgid "SortOptions|Oldest sign in" -msgstr "Authentifié depuis longtemps" +msgstr "Authentifié·e depuis longtemps" msgid "SortOptions|Oldest updated" msgstr "Mise à jour depuis longtemps" @@ -1674,7 +1903,7 @@ msgid "SortOptions|Priority" msgstr "Priorité" msgid "SortOptions|Recent sign in" -msgstr "Authentifié récemment" +msgstr "Authentifié·e récemment" msgid "SortOptions|Start later" msgstr "Commence plus tard" @@ -1692,10 +1921,10 @@ msgid "Spam Logs" msgstr "Journaux des messages indésirables" msgid "Specify the following URL during the Runner setup:" -msgstr "Spécifiez l’URL suivante lors de la configuration du Runner :" +msgstr "Spécifiez l’URL suivante lors de la configuration de l'Exécuteur :" msgid "StarProject|Star" -msgstr "S'abonner" +msgstr "Mettre en favori" msgid "Starred projects" msgstr "Projets favoris" @@ -1704,7 +1933,13 @@ msgid "Start a %{new_merge_request} with these changes" msgstr "Créer une %{new_merge_request} avec ces changements" msgid "Start the Runner!" -msgstr "Démarrer le Runner !" +msgstr "Démarrer l'Exécuteur !" + +msgid "Subgroups" +msgstr "Sous-groupes" + +msgid "Subscribe" +msgstr "" msgid "Switch branch/tag" msgstr "Changer de branche / d'étiquette" @@ -1730,6 +1965,9 @@ msgid "Thanks! Don't show me this again" msgstr "Merci de ne plus afficher ce message" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." +msgstr "La Recherche Globale Avancée de GitLab est un outils qui vous fait gagner du temps. Au lieu de créer du code similaire et perdre du temps, vous pouvez maintenant chercher dans le code d'autres équipes pour vous aider sur votre projet." + +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgstr "" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." @@ -1742,22 +1980,31 @@ msgid "The fork relationship has been removed." msgstr "La relation de fourche a été supprimée." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." -msgstr "L'étape des incidents montre le temps nécessaire entre la création d'un incident et son assignation à un jalon, ou son ajout à une liste d'un tableau d'incidents. Débutez à créer des incidents pour voir des données pour cette étape." +msgstr "L'étape des tickets montre le temps nécessaire entre la création d'un ticket et son assignation à un jalon, ou son ajout à une liste d'un tableau de tickets. Commencez par créer des tickets pour voir des données pour cette étape." + +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "Nombre d’échecs avant que GitLab n’empêche tout accès au stockage. Ce nombre d’échecs peut être réinitialisé dans l’interface d’administration : %{link_to_health_page} ou en suivant le %{api_documentation_link}." msgid "The phase of the development lifecycle." msgstr "Les étapes du cycle de développement." msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user." -msgstr "Les pipelines programmés exécutent des pipelines dans le futur, de façon répétée, pour les branches et tags spécifiées. Ces pipelines programmés héritent d’un accès partiel au projet basé sur l’utilisateur qui leurs est associé." +msgstr "Les pipelines programmés exécutent des pipelines dans le futur, de façon répétée, pour les branches et tags spécifiées. Ces pipelines programmés héritent d’un accès partiel au projet basé sur l’utilisa·teur·trice qui leurs est associé·e." msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre première validation. Ce temps sera automatiquement ajouté quand vous pousserez votre première validation." msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." -msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un incident et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production." +msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un ticket et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production." msgid "The project can be accessed by any logged in user." -msgstr "Votre projet peut être accédé par n’importe quel utilisateur authentifié" +msgstr "Votre projet peut être accédé par n’importe quel utilisa·teur·trice authentifié·e." msgid "The project can be accessed without any authentication." msgstr "Votre projet peut être accédé sans aucune authentification." @@ -1774,6 +2021,12 @@ msgstr "L’étape de pré-production indique le temps entre la fusion de la DF msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "L’étape de test montre le temps que le CI de GitLab met pour exécuter chaque pipeline liés à la demande de fusion. Les données seront automatiquement ajoutées après que votre premier pipeline s’achèvera." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "Délai en secondes pendant lequel GitLab gardera les informations d’échec. Si aucun échec ne survient pendant ce délai, les informations de ce montage seront réinitialisées." + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "Temps en secondes pendant lequel GitLab essaiera d’accéder au stockage. Après ce délai, une erreur d’expiration d’attente sera déclenchée." + msgid "The time taken by each data entry gathered by that stage." msgstr "Le temps pris par chaque entrée récoltée durant cette étape." @@ -1783,29 +2036,32 @@ msgstr "La valeur située au point médian d’une série de valeur observée. C msgid "There are problems accessing Git storage: " msgstr "Il y a des difficultés à accéder aux données Git : " +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "Cette branche a changé depuis le début de l’édition. Souhaitez-vous créer une nouvelle branche ?" + msgid "This is a confidential issue." -msgstr "" +msgstr "Ce ticket est confidentiel." msgid "This is the author's first Merge Request to this project." -msgstr "" +msgstr "C’est la première demande de fusion de cet auteur pour ce projet." msgid "This issue is confidential and locked." -msgstr "" +msgstr "Ce ticket est confidentiel et verrouillé." msgid "This issue is locked." -msgstr "" +msgstr "Ce ticket est verrouillé." msgid "This means you can not push code until you create an empty repository or import existing one." -msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous ne créez pas un dépôt vide, ou importez une dépôt existant." +msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide, ou que vous n’avez pas importé un dépôt existant." msgid "This merge request is locked." -msgstr "" +msgstr "Cette demande de fusion est verrouillée." msgid "Time before an issue gets scheduled" -msgstr "Temps avant qu’un incident ne soit planifié" +msgstr "Temps avant qu’un ticket ne soit planifié" msgid "Time before an issue starts implementation" -msgstr "Temps avant que résolution ne débute" +msgstr "Temps avant que la résolution du ticket ne débute" msgid "Time between merge request creation and merge/close" msgstr "Temps entre la création d'une demande de fusion et sa fusion/clôture" @@ -1814,7 +2070,7 @@ msgid "Time until first merge request" msgstr "Temps jusqu’à la première demande de fusion" msgid "Timeago|%s days ago" -msgstr "Il y a %s jours" +msgstr "il y a %s jours" msgid "Timeago|%s days remaining" msgstr "Il reste %s jours" @@ -1844,7 +2100,7 @@ msgid "Timeago|%s weeks remaining" msgstr "Il reste %s semaines" msgid "Timeago|%s years ago" -msgstr "Il y a %s ans" +msgstr "il y a %s ans" msgid "Timeago|%s years remaining" msgstr "Il reste %s ans" @@ -1931,7 +2187,7 @@ msgid "Timeago|in 1 year" msgstr "Dans 1 an" msgid "Timeago|in a while" -msgstr "" +msgstr "il y a longtemps" msgid "Timeago|less than a minute ago" msgstr "il y a moins d'une minute" @@ -1956,7 +2212,7 @@ msgid "Total test time for all commits/merges" msgstr "Temps total de test pour toutes les validations/fusions" msgid "Track activity with Contribution Analytics." -msgstr "" +msgstr "Suivre l’activité avec Contribution Analytics." msgid "Unlock" msgstr "Déverrouiller" @@ -1965,22 +2221,25 @@ msgid "Unlocked" msgstr "Déverrouillé" msgid "Unstar" -msgstr "Se désabonner" +msgstr "Supprimer des favoris" -msgid "Upgrade your plan to activate Advanced Global Search." +msgid "Unsubscribe" msgstr "" +msgid "Upgrade your plan to activate Advanced Global Search." +msgstr "Mettez à jour votre abonnement pour activer la Recherche Globale Avancée." + msgid "Upgrade your plan to activate Contribution Analytics." -msgstr "" +msgstr "Mettez à jour votre abonnement pour activer Contribution Analytics." msgid "Upgrade your plan to activate Group Webhooks." -msgstr "" +msgstr "Mettez à jour votre abonnement pour activer les Webhooks de groupe." msgid "Upgrade your plan to activate Issue weight." -msgstr "" +msgstr "Mettez à niveau votre abonnement pour activer les poids de ticket." msgid "Upgrade your plan to improve Issue boards." -msgstr "" +msgstr "Mettez à niveau votre abonnement pour améliorer les tableaux de tickets." msgid "Upload New File" msgstr "Téléverser un nouveau fichier" @@ -2025,139 +2284,154 @@ msgid "We don't have enough data to show this stage." msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape." msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." -msgstr "" +msgstr "Les webhooks vous permettent d’appeler une URL si, par exemple, du nouveau code est poussé ou un nouveau ticket est créé. Vous pouvez configurer les webhooks pour écouter les événements spécifiques comme des poussées de code, des tickets ou des demandes de fusion. Les webhooks de groupes s’appliqueront à tous les projets dans un groupe, ce qui vous permet de normaliser la fonctionnalité du webhook dans votre groupe entier." msgid "Weight" msgstr "Poids" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "Si l’accès à un stockage échoue, GitLab empêchera l’accès au stockage pendant la durée spécifiée ici. Cela permettra au système de fichiers de récupérer. Les dépôts présents sur les secteurs en erreur seront temporairement indisponibles." + msgid "Wiki" msgstr "Wiki" msgid "WikiClone|Clone your wiki" -msgstr "" +msgstr "Clonez votre wiki" msgid "WikiClone|Git Access" -msgstr "" +msgstr "Accès git" msgid "WikiClone|Install Gollum" -msgstr "" +msgstr "Installer Gollum" msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" -msgstr "" +msgstr "Il est recommandé d’installer %{markdown} pour que les spécificités de GFM s’affichent en local :" msgid "WikiClone|Start Gollum and edit locally" -msgstr "" +msgstr "Démarrer Gollum et modifier localement" msgid "WikiEmptyPageError|You are not allowed to create wiki pages" -msgstr "" +msgstr "Vous n’êtes pas autorisé·e à créer des pages wiki" msgid "WikiHistoricalPage|This is an old version of this page." -msgstr "" +msgstr "Il s’agit d’une ancienne version de la page." msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." -msgstr "" +msgstr "Vous pouvez consulter le %{most_recent_link} ou parcourir l’%{history_link}." msgid "WikiHistoricalPage|history" -msgstr "" +msgstr "historique" msgid "WikiHistoricalPage|most recent version" -msgstr "" +msgstr "version la plus récente" msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" -msgstr "" +msgstr "D’autres exemples se trouvent dans la %{docs_link}" msgid "WikiMarkdownDocs|documentation" -msgstr "" +msgstr "documentation" msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" -msgstr "" +msgstr "Pour créer un lien vers une (nouvelle) page, il suffit de saisir %{link_example}" msgid "WikiNewPagePlaceholder|how-to-setup" -msgstr "" +msgstr "consignes-installation" msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." -msgstr "" +msgstr "Astuce : vous pouvez saisir le chemin d’accès complet du nouveau fichier. Nous créerons automatiquement les répertoires manquants." msgid "WikiNewPageTitle|New Wiki Page" -msgstr "" +msgstr "Nouvelle Page Wiki" msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" -msgstr "" +msgstr "Êtes-vous sûr·e de vouloir supprimer cette page ?" msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." -msgstr "" +msgstr "Quelqu’un a modifié la page en même temps que vous. Veuillez consulter %{page_link} et vérifiez que vos modifications ne suppriment pas involontairement les siennes." msgid "WikiPageConflictMessage|the page" -msgstr "" +msgstr "la page" msgid "WikiPageCreate|Create %{page_title}" -msgstr "" +msgstr "Créer %{page_title}" msgid "WikiPageEdit|Update %{page_title}" -msgstr "" +msgstr "Mettre à jour %{page_title}" msgid "WikiPage|Page slug" -msgstr "" +msgstr "Slug de la page" msgid "WikiPage|Write your content or drag files here..." -msgstr "" +msgstr "Écrivez du contenu ou faîtes glisser des fichiers ici..." msgid "Wiki|Create Page" -msgstr "" +msgstr "Créer une Page" msgid "Wiki|Create page" -msgstr "" +msgstr "Créer la page" msgid "Wiki|Edit Page" -msgstr "" +msgstr "Modifier cette Page" msgid "Wiki|Empty page" -msgstr "" +msgstr "Page vide" msgid "Wiki|More Pages" -msgstr "" +msgstr "Plus de Pages" msgid "Wiki|New page" -msgstr "" +msgstr "Nouvelle page" msgid "Wiki|Page history" -msgstr "" +msgstr "Historique de la page" msgid "Wiki|Page version" -msgstr "" +msgstr "Version de la page" msgid "Wiki|Pages" -msgstr "" +msgstr "Pages" msgid "Wiki|Wiki Pages" -msgstr "" +msgstr "Pages du Wiki" msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." -msgstr "" +msgstr "Avec Contribution Analytics vous pouvez avoir un aperçu de l’activité des tickets, demandes de fusion et des événements de poussée de votre organisation et de ses membres." msgid "Withdraw Access Request" msgstr "Retirer la demande d'accès" msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?" -msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr ?" +msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?" msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?" -msgstr "Vous êtes sur le point de supprimer %{project_name_with_namespace}. Les projets supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr ?" +msgstr "Vous êtes sur le point de supprimer %{project_name_with_namespace}. Les projets supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?" msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?" -msgstr "Vous allez supprimer la relation de fourche avec le projet source %{forked_from_project}. Êtes-vous VRAIMENT sûr." +msgstr "Vous allez supprimer la relation de fourche avec le projet source %{forked_from_project}. Êtes-vous ABSOLUMENT sûr·e ?" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" -msgstr "Vous allez transférer %{project_name_with_namespace} à un nouveau propriétaire. Êtes vous VRAIMENT sûr ?" +msgstr "Vous allez transférer %{project_name_with_namespace} à un nouveau propriétaire. Êtes vous ABSOLUMENT sûr·e ?" + +msgid "You are on a read-only GitLab instance." +msgstr "Vous êtes sur une instance GitLab en lecture seule." + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "Vous êtes sur une instance GitLab en lecture seule. Si vous souhaitez apporter des modifications, vous devez aller sur %{link_to_primary_node}." msgid "You can only add files when you are on a branch" msgstr "Vous ne pouvez ajouter de fichier que dans une branche" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "Vous ne pouvez pas écrire sur une instance GitLab Geo secondaire en lecture-seule. Veuillez utiliser le %{link_to_primary_node} à la place." + +msgid "You cannot write to this read-only GitLab instance." +msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture-seule." + msgid "You have reached your project limit" msgstr "Vous avez atteint votre limite de projet" msgid "You must sign in to star a project" -msgstr "Vous devez vous identifier pour vous abonner à un projet" +msgstr "Vous devez vous connecter pour mettre un projet en favori" msgid "You need permission." msgstr "Vous avez besoin d’une autorisation." @@ -2184,7 +2458,10 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss msgstr "Vous ne pourrez pas récupérer ou pousser de code par SSH tant que vous n’aurez pas %{add_ssh_key_link} dans votre profil" msgid "Your comment will not be visible to the public." -msgstr "" +msgstr "Votre commentaire ne sera pas visible publiquement." + +msgid "Your groups" +msgstr "Vos groupes" msgid "Your name" msgstr "Votre nom" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "parent" msgstr[1] "parents" +msgid "password" +msgstr "mot de passe" + +msgid "personal access token" +msgstr "jeton d’accès personnel" + msgid "to help your contributors communicate effectively!" msgstr "pour aider vos contributeurs à communiquer efficacement !" -msgid "personal access token" -msgstr "" +msgid "username" +msgstr "nom d’utilisateur" diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po index 5697c4e415c..4ac7676ca18 100644 --- a/locale/it/gitlab.po +++ b/locale/it/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:36-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:31-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -34,6 +34,11 @@ msgstr[1] "%s commit aggiuntivi sono stati omessi per evitare degradi di prestaz msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} ha committato %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "" @@ -110,9 +121,18 @@ msgstr "Aggiungi una chiave SSH al tuo profilo per eseguire pull o push tramite msgid "Add new directory" msgstr "Aggiungi una directory (cartella)" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -128,6 +148,9 @@ msgstr "Sei sicuro di voler cancellare questa pipeline programmata?" msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -235,6 +261,9 @@ msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "La branch <strong>%{branch_name}</strong> è stata creata. Per impostare un rilascio automatico scegli un template CI di Gitlab e committa le tue modifiche %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Cerca branches" @@ -445,15 +474,24 @@ msgstr "saltata" msgid "CiStatus|running" msgstr "in corso" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "Guida per contribuire" msgid "Contributors" msgstr "Collaboratori" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -684,9 +736,21 @@ msgstr "Crea cartella" msgid "Create empty bare repository" msgstr "Crea una repository vuota" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "Crea una richiesta di merge" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "Crea nuovo..." @@ -773,6 +837,9 @@ msgstr "Nome cartella" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "Ogni settimana (Di domenica alle 4 del mattino)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "Impossibile cambiare owner" msgid "Failed to remove the pipeline schedule" msgstr "Impossibile rimuovere la pipeline pianificata" +msgid "File name" +msgstr "" + msgid "Files" msgstr "" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "Intervallo di Pattern" @@ -1052,6 +1182,9 @@ msgstr "Leggi di più su" msgid "Learn more in the|pipeline schedules documentation" msgstr "documentazione sulla pianificazione delle pipelines" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "Abbandona il gruppo" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "Mediano" @@ -1105,6 +1244,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Nuovo Issue" @@ -1122,18 +1264,27 @@ msgstr "Nuova directory" msgid "New file" msgstr "Nuovo file" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "Nuovo Issue" msgid "New merge request" msgstr "Nuova richiesta di merge" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "Nuova pianficazione" msgid "New snippet" msgstr "Nuovo snippet" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "Nuovo tag" @@ -1212,6 +1363,12 @@ msgstr "Osserva" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Filtra" @@ -1353,9 +1510,54 @@ msgstr "con più stadi" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "Il Progetto '%{project_name}' in coda di eliminazione." @@ -1365,9 +1567,6 @@ msgstr "Il Progetto '%{project_name}' è stato creato con successo." msgid "Project '%{project_name}' was successfully updated." msgstr "Il Progetto '%{project_name}' è stato aggiornato con successo." -msgid "Project '%{project_name}' will be deleted." -msgstr "Il Progetto '%{project_name}' verrà eliminato" - msgid "Project access must be granted explicitly to each user." msgstr "L'accesso al progetto dev'esser fornito esplicitamente ad ogni utente" @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Vedi altro" @@ -1515,6 +1729,9 @@ msgstr "Ripristina questa richiesta di merge" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "Pianificazione pipelines" msgid "Search branches and tags" msgstr "Ricerca branches e tags" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "Seleziona formato d'archivio" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "inizia una %{new_merge_request} con queste modifiche" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "Cambia branch/tag" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "Lo stadio di programmazione mostra il tempo trascorso dal primo commit alla creazione di una richiesta di merge (MR). I dati saranno aggiunti una volta che avrai creato la prima richiesta di merge." @@ -1744,6 +1982,15 @@ msgstr "La relazione del fork è stata rimossa" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "Lo stadio di Issue mostra il tempo che impiega un issue ad esser correlato ad una Milestone, o ad esser aggiunto ad una tua Lavagna. Inizia la creazione di problemi per visualizzare i dati in questo stadio." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "Il ciclo vitale della fase di sviluppo." @@ -1774,6 +2021,12 @@ msgstr "Lo stadio di pre-rilascio mostra il tempo che trascorre da una MR (Richi msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "Lo stadio di test mostra il tempo che ogni Pipeline impiega per essere eseguita in ogni Richiesta di Merge correlata. L'informazione sarà disponibile automaticamente quando la tua prima Pipeline avrà finito d'esser eseguita." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "Il tempo aggregato relativo eventi/data entry raccolto in quello stadio." @@ -1783,6 +2036,9 @@ msgstr "Il valore falsato nel mezzo di una serie di dati osservati. ES: tra 3,5, msgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2150,9 +2412,21 @@ msgstr "Stai per rimuovere la relazione con il progetto sorgente %{forked_from_p msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Stai per trasferire %{project_name_with_namespace} ad un altro owner. Sei ASSOLUTAMENTE sicuro?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "Puoi aggiungere files solo quando sei in una branch" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "Hai raggiunto il tuo limite di progetto" @@ -2186,6 +2460,9 @@ msgstr "Non sarai in grado di effettuare push o pull tramite SSH fino a che %{ad msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "Il tuo nome" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "" msgstr[1] "" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po index 4b70f8dd9df..9045ae26c4a 100644 --- a/locale/ja/gitlab.po +++ b/locale/ja/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:31-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Japanese\n" "Language: ja_JP\n" @@ -31,6 +31,10 @@ msgstr[0] "パフォーマンス低下をé¿ã‘ã‚‹ãŸã‚ %s 個ã®ã‚³ãƒŸãƒƒãƒˆã‚ msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_timeago}ã«%{commit_author_link}ãŒã‚³ãƒŸãƒƒãƒˆã—ã¾ã—ãŸã€‚" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -50,6 +54,12 @@ msgstr[0] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 個ã®ãƒ‘イプライン" @@ -105,9 +115,18 @@ msgstr "SSHã§ãƒ—ルやプッシュã™ã‚‹å ´åˆã¯ã€ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«ã«SSHéµ msgid "Add new directory" msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’è¿½åŠ " +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -123,6 +142,9 @@ msgstr "ã“ã®ãƒ‘イプラインスケジュールを削除ã—ã¾ã™ã‹ï¼Ÿ" msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -156,18 +178,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -229,6 +254,9 @@ msgstr[0] "ブランãƒ" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "<strong>%{branch_name}</strong> ブランãƒãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚自動デプãƒã‚¤ã‚’è¨å®šã™ã‚‹ã«ã¯ã€GitLab CI Yaml テンプレートをé¸æŠžã—ã¦ã€å¤‰æ›´ã‚’コミットã—ã¦ãã ã•ã„。 %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "ブランãƒã‚’検索" @@ -439,15 +467,24 @@ msgstr "スã‚ップ済ã¿" msgid "CiStatus|running" msgstr "実行ä¸" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -490,27 +527,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -520,7 +563,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -532,18 +578,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -575,6 +615,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "コミット" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -656,6 +700,12 @@ msgstr "貢献者å‘ã‘ガイド" msgid "Contributors" msgstr "貢献者" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -677,9 +727,21 @@ msgstr "ディレクトリを作æˆ" msgid "Create empty bare repository" msgstr "空ã®bareレãƒã‚¸ãƒˆãƒªãƒ¼ã‚’作æˆ" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "マージリクエストを作æˆ" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "æ–°è¦ä½œæˆ" @@ -765,6 +827,9 @@ msgstr "ディレクトリå" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -837,12 +902,18 @@ msgstr "毎週 (日曜日ã®åˆå‰4:00)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "オーナーを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ" msgid "Failed to remove the pipeline schedule" msgstr "パイプラインスケジュールを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgid "File name" +msgstr "" + msgid "Files" msgstr "ファイル" @@ -886,9 +957,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -931,6 +1008,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -974,6 +1096,12 @@ msgid "Instance" msgid_plural "Instances" msgstr[0] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "é–“éš”ã®ãƒ‘ターン" @@ -1041,6 +1169,9 @@ msgstr "詳ã—ã見る:" msgid "Learn more in the|pipeline schedules documentation" msgstr "詳ã—ãã¯ãƒ‘イプラインスケジュールã®ãƒ‰ã‚ュメントをå‚ç…§" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "グループを離脱" @@ -1063,6 +1194,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "ä¸å¤®å€¤" @@ -1093,6 +1230,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "æ–°è¦èª²é¡Œ" @@ -1109,18 +1249,27 @@ msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" msgid "New file" msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "æ–°è¦èª²é¡Œ" msgid "New merge request" msgstr "æ–°è¦ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "æ–°è¦ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«" msgid "New snippet" msgstr "æ–°è¦ã‚¹ãƒ‹ãƒšãƒƒãƒˆ" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "æ–°è¦ã‚¿ã‚°" @@ -1199,6 +1348,12 @@ msgstr "ã™ã¹ã¦é€šçŸ¥" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "フィルター" @@ -1340,9 +1495,54 @@ msgstr "ステージã‚ã‚Š" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "'%{project_name}' プãƒã‚¸ã‚§ã‚¯ãƒˆã¯å‰Šé™¤å‡¦ç†å¾…ã¡ã§ã™ã€‚" @@ -1352,9 +1552,6 @@ msgstr "'%{project_name}' プãƒã‚¸ã‚§ã‚¯ãƒˆã¯æ£å¸¸ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚ msgid "Project '%{project_name}' was successfully updated." msgstr "'%{project_name}' プãƒã‚¸ã‚§ã‚¯ãƒˆã¯æ£å¸¸ã«æ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚" -msgid "Project '%{project_name}' will be deleted." -msgstr "'%{project_name}' プãƒã‚¸ã‚§ã‚¯ãƒˆã¯å‰Šé™¤ã•ã‚Œã¾ã™ã€‚" - msgid "Project access must be granted explicitly to each user." msgstr "ユーザーã”ã¨ã«ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚¢ã‚¯ã‚»ã‚¹ã®æ¨©é™ã‚’指定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。" @@ -1412,6 +1609,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1433,12 +1636,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "続ãã‚’èªã‚€" @@ -1502,6 +1714,9 @@ msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リãƒãƒ¼ãƒˆ" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1520,6 +1735,15 @@ msgstr "パイプラインスケジューリング" msgid "Search branches and tags" msgstr "ブランãƒã¾ãŸã¯ã‚¿ã‚°ã‚’検索" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "アーカイブã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’é¸æŠž" @@ -1566,13 +1790,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1692,6 +1919,12 @@ msgstr "ã“ã®å¤‰æ›´ã§ %{new_merge_request} を作æˆã™ã‚‹" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "ブランãƒãƒ»ã‚¿ã‚°åˆ‡ã‚Šæ›¿ãˆ" @@ -1717,6 +1950,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "コーディングステージã§ã¯ã€æœ€åˆã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒä½œæˆã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒä½œæˆã•ã‚ŒãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚" @@ -1729,6 +1965,15 @@ msgstr "フォークã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "課題ステージã§ã¯ã€èª²é¡ŒãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ã‹ã€èª²é¡Œãƒœãƒ¼ãƒ‰ã®ãƒªã‚¹ãƒˆã«è¿½åŠ ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒªã‚¹ãƒˆã«è¡¨ç¤ºã™ã‚‹ã«ã¯èª²é¡Œã‚’最åˆã«ä½œæˆã—ã¦ãã ã•ã„。" +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "開発ライフサイクルã®æ®µéšŽ" @@ -1759,6 +2004,12 @@ msgstr "ステージングステージã§ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "テスティングステージã§ã¯ã€GitLab CI ãŒé–¢é€£ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®å„パイプラインを実行ã™ã‚‹æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒ‘イプラインãŒå®Œäº†ã—ãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚" +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã«åŽé›†ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿æ¯Žã®æ™‚é–“" @@ -1768,6 +2019,9 @@ msgstr "得られãŸä¸€é€£ã®ãƒ‡ãƒ¼ã‚¿ã‚’å°ã•ã„é †ã«ä¸¦ã¹ãŸã¨ãã«ä¸å¤® msgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1950,6 +2204,9 @@ msgstr "" msgid "Unstar" msgstr "スターを外ã™" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2013,6 +2270,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2133,9 +2393,21 @@ msgstr "å…ƒã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆ (%{forked_from_project}) ã¨ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ã msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "%{project_name_with_namespace} プãƒã‚¸ã‚§ã‚¯ãƒˆã‚’別ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ç§»è²ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚’è¿½åŠ ã™ã‚‹ã«ã¯ã€ã©ã“ã‹ã®ãƒ–ランãƒã«ã„ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆæ•°ã®ä¸Šé™ã«é”ã—ã¦ã„ã¾ã™" @@ -2169,6 +2441,9 @@ msgstr "%{add_ssh_key_link} をプãƒãƒ•ã‚¡ã‚¤ãƒ«ã«è¿½åŠ ã—ã¦ã„ãªã„ã®ã§ã msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "åå‰" @@ -2192,9 +2467,15 @@ msgid "parent" msgid_plural "parents" msgstr[0] "親" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po index 5a6c8ef9c7a..ab74d4cbeae 100644 --- a/locale/ko/gitlab.po +++ b/locale/ko/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:31-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Korean\n" "Language: ko_KR\n" @@ -31,6 +31,10 @@ msgstr[0] "%s 추가 ì»¤ë°‹ì€ ì„±ëŠ¥ ì´ìŠˆë¥¼ 방지하기 위해 ìƒëžµë˜ì—ˆ msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_timeago} ì— %{commit_author_link} ë‹˜ì´ ì»¤ë°‹í•˜ì˜€ìŠµë‹ˆë‹¤. " +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -50,6 +54,12 @@ msgstr[0] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "설치 ë°©ë²•ì— ëŒ€í•œ ì •ë³´ë¥¼ 얻기 위해 %{link} 를 ì²´í¬ì•„웃하세요." +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d 파ì´í”„ë¼ì¸" @@ -105,9 +115,18 @@ msgstr "í”„ë¡œí•„ì— SSH 키를 추가하여 SSH를 통해 Pull 하거나 Pushí• msgid "Add new directory" msgstr "새 ë””ë ‰í† ë¦¬ 추가" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "ì „ì²´" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -123,6 +142,9 @@ msgstr "ì´ íŒŒì´í”„ë¼ì¸ ìŠ¤ì¼€ì¥´ì„ ì‚ì œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" msgid "Are you sure you want to discard your changes?" msgstr "변경 ë‚´ìš©ì„ ì·¨ì†Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "ë“±ë¡ í† í°ì„ 초기화 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" @@ -156,18 +178,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -229,6 +254,9 @@ msgstr[0] "브랜치" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "<strong>%{branch_name}</strong> 브랜치가 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤. ìžë™ ë°°í¬ë¥¼ ì„¤ì •í•˜ë ¤ë©´ GitLab CI Yaml í…œí”Œë¦¿ì„ ì„ íƒí•˜ê³ 변경 사í•ì„ ì 용하ì‹ì‹œì˜¤. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "브랜치 검색" @@ -439,15 +467,24 @@ msgstr "건너 뜀" msgid "CiStatus|running" msgstr "실행 중" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -490,27 +527,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -520,7 +563,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -532,18 +578,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -575,6 +615,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "커밋" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -656,6 +700,12 @@ msgstr "ê¸°ì—¬ì— ëŒ€í•œ 안내" msgid "Contributors" msgstr "기여해 ì£¼ì‹ ë¶„ë“¤" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -677,9 +727,21 @@ msgstr "ë””ë ‰í† ë¦¬ 만들기" msgid "Create empty bare repository" msgstr "빈 bare ì €ìž¥ì†Œ 만들기" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "머지 리퀘스트 만들기" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "새로 만들기 ..." @@ -765,6 +827,9 @@ msgstr "ë””ë ‰í† ë¦¬ ì´ë¦„" msgid "Discard changes" msgstr "변경 ë‚´ìš© 취소" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -837,12 +902,18 @@ msgstr "매주 (ì¼ìš”ì¼ ì˜¤ì „ 4ì‹œì—)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "ì†Œìœ ìžë¥¼ 변경하지 못했습니다" msgid "Failed to remove the pipeline schedule" msgstr "파ì´í”„ë¼ì¸ ìŠ¤ì¼€ì¤„ì„ ì œê±°í•˜ì§€ 못했습니다." +msgid "File name" +msgstr "" + msgid "Files" msgstr "파ì¼" @@ -886,9 +957,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -931,6 +1008,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "헬스 ì²´í¬" @@ -974,6 +1096,12 @@ msgid "Instance" msgid_plural "Instances" msgstr[0] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "주기 패턴" @@ -1041,6 +1169,9 @@ msgstr "ë” ìžì„¸ížˆ 알아보기" msgid "Learn more in the|pipeline schedules documentation" msgstr "파ì´í”„ë¼ì¸ 스케쥴 문서로부터 ë” ì•Œì•„ë³´ê¸°" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "그룹 ë– ë‚˜ê¸°" @@ -1063,6 +1194,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "중앙값" @@ -1093,6 +1230,9 @@ msgstr "여기" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "새 ì´ìŠˆ" @@ -1109,18 +1249,27 @@ msgstr "새 ë””ë ‰í† ë¦¬" msgid "New file" msgstr "새 파ì¼" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "새 ì´ìŠˆ" msgid "New merge request" msgstr "새 머지 리퀘스트" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "새 ì¼ì •" msgid "New snippet" msgstr "새 스니펫" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "새 태그 " @@ -1199,6 +1348,12 @@ msgstr "Watch" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "í•„í„°" @@ -1340,9 +1495,54 @@ msgstr "스테ì´ì§•" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "'%{project_name}'프로ì 트가 ì‚ì œ 처리 중입니다." @@ -1352,9 +1552,6 @@ msgstr "'%{project_name}'프로ì 트가 성공ì 으로 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤." msgid "Project '%{project_name}' was successfully updated." msgstr "'%{project_name}'프로ì 트가 성공ì 으로 ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤." -msgid "Project '%{project_name}' will be deleted." -msgstr "'%{project_name}'프로ì 트가 ì‚ì œë©ë‹ˆë‹¤." - msgid "Project access must be granted explicitly to each user." msgstr "프로ì 트 액세스는 ê° ì‚¬ìš©ìžì—게 명시ì 으로 부여ë˜ì–´ì•¼í•©ë‹ˆë‹¤." @@ -1412,6 +1609,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1433,12 +1636,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "푸쉬 ì´ë²¤íŠ¸" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "ë” ì½ê¸°" @@ -1502,6 +1714,9 @@ msgstr "ì´ ë¨¸ì§€ 리퀘스트 ë˜ëŒë¦¬ê¸°" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1520,6 +1735,15 @@ msgstr "파ì´í”„ë¼ì¸ 스케줄ë§" msgid "Search branches and tags" msgstr "브랜치 ë° íƒœê·¸ 검색" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "ì•„ì¹´ì´ë¸Œ í¬ë§· ì„ íƒ" @@ -1566,13 +1790,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1692,6 +1919,12 @@ msgstr "ì´ ë³€ê²½ 사í•ìœ¼ë¡œ %{new_merge_request} ì„ ì‹œìž‘í•˜ì‹ì‹œì˜¤." msgid "Start the Runner!" msgstr "Runner 시작!" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "스위치 브랜치/태그" @@ -1717,6 +1950,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "Coding Stage는 첫 번째 커밋ì—서부터 머지 리퀘스트 ìƒì„±ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ìƒì„±í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ ì—¬ê¸°ì— ì¶”ê°€ë©ë‹ˆë‹¤." @@ -1729,6 +1965,15 @@ msgstr "í¬í¬ 관계가 ì œê±°ë˜ì—ˆìŠµë‹ˆë‹¤." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "ì´ìŠˆ 단계ì—는 ì´ìŠˆë¥¼ 작성하여 마ì¼ìŠ¤í†¤ìœ¼ë¡œ ì§€ì •í•˜ëŠ” ë° ê±¸ë¦¬ëŠ” 시간 ë˜ëŠ” ì´ìŠˆ ë³´ë“œì˜ ëª©ë¡ì— ì´ìŠˆë¥¼ 추가하는 ì‹œê°„ì´ í‘œì‹œë©ë‹ˆë‹¤. ì´ ë‹¨ê³„ì˜ ë°ì´í„°ë¥¼ 보기 위해서는 ì´ìŠˆë¥¼ ë¨¼ì € 작성해야 합니다." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "개발 ìˆ˜ëª…ì£¼ê¸°ì˜ ë‹¨ê³„." @@ -1759,6 +2004,12 @@ msgstr "Staging 단계ì—서는 MR 머지과 프로ë•ì…˜ í™˜ê²½ì— ì½”ë“œ ë°°í msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "테스트 단계ì—서는 GitLab CIê°€ ê´€ë ¨ 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ìœ„í•´ ëª¨ë“ íŒŒì´í”„ë¼ì¸ì„ 실행하는 ë° ê±¸ë¦¬ëŠ” ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 파ì´í”„ë¼ì¸ ì‹¤í–‰ì´ ì™„ë£Œë˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "해당 단계ì—ì„œ 수집 í•œ ê° ë°ì´í„° ìž…ë ¥ì— ì†Œìš” ëœ ì‹œê°„" @@ -1768,6 +2019,9 @@ msgstr "ê°’ì€ ì¼ë ¨ì˜ 관측 ê°’ 중ì ì— ìžˆìŠµë‹ˆë‹¤. 예를 들어, 3, 5, msgid "There are problems accessing Git storage: " msgstr "git storageì— ì ‘ê·¼í•˜ëŠ”ë° ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. " +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1950,6 +2204,9 @@ msgstr "" msgid "Unstar" msgstr "별표 ì œê±°" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2013,6 +2270,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2133,9 +2393,21 @@ msgstr "í¬í¬ 관계를 소스 프로ì 트 %{forked_from_project}ì— ëŒ€í•´ ì msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "%{project_name_with_namespace}ì„ ë‹¤ë¥¸ ì†Œìœ ìžì—게 ì´ì „í•˜ë ¤ê³ í•©ë‹ˆë‹¤. \"ì •ë§ë¡œ\" 확실합니까?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "ë¸Œëžœì¹˜ì— ìžˆì„ ë•Œì—만 파ì¼ì„ 추가 í• ìˆ˜ 있습니다." +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "프로ì 트 ìˆ«ìž í•œë„ì— ë„달했습니다." @@ -2169,6 +2441,9 @@ msgstr "ë‹¹ì‹ ì˜ í”„ë¡œí•„ì— %{add_ssh_key_link} 를 하기 ì „ì—는 SSH를 í msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "ê·€í•˜ì˜ ì´ë¦„" @@ -2192,9 +2467,15 @@ msgid "parent" msgid_plural "parents" msgstr[0] "부모" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po index fc7bbc79899..7e33af9f747 100644 --- a/locale/nl_NL/gitlab.po +++ b/locale/nl_NL/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:31-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -34,6 +34,11 @@ msgstr[1] "%s andere commits zijn weggelaten om prestatieproblemen te voorkomen. msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -54,6 +59,12 @@ msgstr[1] "" msgid "(checkout the %{link} for information on how to install it)." msgstr "(bekijk de %{link} voor meer info over hoe je het kan installeren)." +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "" @@ -110,9 +121,18 @@ msgstr "" msgid "Add new directory" msgstr "Nieuwe map toevoegen" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "Alles" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "Uiterlijk" @@ -128,6 +148,9 @@ msgstr "" msgid "Are you sure you want to discard your changes?" msgstr "" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "" @@ -161,18 +184,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "Facturatie" @@ -235,6 +261,9 @@ msgstr[1] "" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "BranchSwitcherPlaceholder|Zoek branches" @@ -445,15 +474,24 @@ msgstr "overgeslagen" msgid "CiStatus|running" msgstr "" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -496,27 +534,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -526,7 +570,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -538,18 +585,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -582,6 +623,11 @@ msgid_plural "Commits" msgstr[0] "" msgstr[1] "" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" + msgid "Commit Message" msgstr "" @@ -663,6 +709,12 @@ msgstr "" msgid "Contributors" msgstr "" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -684,9 +736,21 @@ msgstr "Maak map aan" msgid "Create empty bare repository" msgstr "" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "" @@ -773,6 +837,9 @@ msgstr "" msgid "Discard changes" msgstr "" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -845,12 +912,18 @@ msgstr "" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "" msgid "Failed to remove the pipeline schedule" msgstr "" +msgid "File name" +msgstr "" + msgid "Files" msgstr "" @@ -895,9 +968,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -940,6 +1019,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "" @@ -984,6 +1108,12 @@ msgid_plural "Instances" msgstr[0] "" msgstr[1] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "" @@ -1052,6 +1182,9 @@ msgstr "" msgid "Learn more in the|pipeline schedules documentation" msgstr "" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "" @@ -1075,6 +1208,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "" @@ -1105,6 +1244,9 @@ msgstr "" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Nieuwe issue" @@ -1122,18 +1264,27 @@ msgstr "" msgid "New file" msgstr "" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "" msgid "New merge request" msgstr "" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "" msgid "New snippet" msgstr "" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "" @@ -1212,6 +1363,12 @@ msgstr "" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "" @@ -1353,9 +1510,54 @@ msgstr "" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "" @@ -1365,9 +1567,6 @@ msgstr "" msgid "Project '%{project_name}' was successfully updated." msgstr "" -msgid "Project '%{project_name}' will be deleted." -msgstr "" - msgid "Project access must be granted explicitly to each user." msgstr "" @@ -1425,6 +1624,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1446,12 +1651,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "" @@ -1515,6 +1729,9 @@ msgstr "" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1533,6 +1750,15 @@ msgstr "" msgid "Search branches and tags" msgstr "" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "" @@ -1580,13 +1806,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1706,6 +1935,12 @@ msgstr "" msgid "Start the Runner!" msgstr "" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "" @@ -1732,6 +1967,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "" @@ -1744,6 +1982,15 @@ msgstr "" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "" +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "" @@ -1774,6 +2021,12 @@ msgstr "" msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "" +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "" @@ -1783,6 +2036,9 @@ msgstr "" msgid "There are problems accessing Git storage: " msgstr "" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1967,6 +2223,9 @@ msgstr "" msgid "Unstar" msgstr "" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2030,6 +2289,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2150,9 +2412,21 @@ msgstr "" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "" @@ -2186,6 +2460,9 @@ msgstr "" msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "" msgstr[1] "" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po index e6ba0c8cf9a..473086886ac 100644 --- a/locale/pt_BR/gitlab.po +++ b/locale/pt_BR/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-04 13:27-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" @@ -18,13 +18,13 @@ msgstr "" msgid "%d commit" msgid_plural "%d commits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d commit" +msgstr[1] "%d commits" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d camada" +msgstr[1] "%d camadas" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -34,36 +34,47 @@ msgstr[1] "%s commits adicionais foram omitidos para prevenir problemas de perfo msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} fez commit %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "%{count} participante" +msgstr[1] "%{count} participantes" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" -msgstr "" +msgstr "%{number_commits_behind} commits atrás de %{default_branch}, %{number_commits_ahead} commits à frente" msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." -msgstr "" +msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab permitirá o acesso na próxima tentativa." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds." -msgstr "" +msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab irá bloquear o acesso por %{number_of_seconds} segundos." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved." -msgstr "" +msgstr "%{number_of_failures} de %{maximum_failures} falhas. O GitLab não tentará mais automaticamente. Redefina as informações de storage quando o problema for resolvido." msgid "%{storage_name}: failed storage access attempt on host:" msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%{storage_name}: falha na tentativa de acesso ao storage no host:" +msgstr[1] "%{storage_name}: %{failed_attempts} falhas de acesso ao storage:" msgid "(checkout the %{link} for information on how to install it)." -msgstr "" +msgstr "(veja o %{link} para informações de como instalar)." + +msgid "+ %{moreCount} more" +msgstr "%{moreCount} mais" + +msgid "- show less" +msgstr "- exibir menos" msgid "1 pipeline" msgid_plural "%d pipelines" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 pipeline" +msgstr[1] "%d pipelines" msgid "1st contribution!" -msgstr "" +msgstr "1ª contribuição!" msgid "2FA enabled" -msgstr "" +msgstr "Autenticação de 2 passos ativada" msgid "A collection of graphs regarding Continuous Integration" msgstr "Uma coleção de gráficos sobre Integração ContÃnua" @@ -72,16 +83,16 @@ msgid "About auto deploy" msgstr "Sobre o deploy automático" msgid "Abuse Reports" -msgstr "" +msgstr "Relatórios de abuso" msgid "Access Tokens" -msgstr "" +msgstr "Tokens de acesso" msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again." -msgstr "" +msgstr "Os acessos à storages com defeito foram temporariamente desabilitados para permitir a sua remontagem. Redefina as informações de armazenamento depois que o problema foi resolvido para permitir o acesso de novo." msgid "Account" -msgstr "" +msgstr "Conta" msgid "Active" msgstr "Ativo" @@ -90,7 +101,7 @@ msgid "Activity" msgstr "Atividade" msgid "Add" -msgstr "" +msgstr "Adicionar" msgid "Add Changelog" msgstr "Adicionar registro de mudanças" @@ -99,7 +110,7 @@ msgid "Add Contribution guide" msgstr "Adicionar Guia de contribuição" msgid "Add Group Webhooks and GitLab Enterprise Edition." -msgstr "" +msgstr "Adicione o grupo de Webhooks e GitLab Enterprise Edition." msgid "Add License" msgstr "Adicionar Licença" @@ -110,14 +121,23 @@ msgstr "Adicionar chave SSH ao seu perfil para fazer pull ou push via SSH." msgid "Add new directory" msgstr "Adicionar novo diretório" +msgid "AdminHealthPageLink|health page" +msgstr "página de saúde" + +msgid "Advanced settings" +msgstr "Configurações avançadas" + msgid "All" -msgstr "" +msgstr "Todos" + +msgid "An error occurred. Please try again." +msgstr "Ocorreu um erro. Tente novamente." msgid "Appearance" -msgstr "" +msgstr "Aparência" msgid "Applications" -msgstr "" +msgstr "Aplicações" msgid "Archived project! Repository is read-only" msgstr "Projeto arquivado! O repositório é somente leitura" @@ -126,115 +146,124 @@ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Tem certeza que deseja excluir este agendamento de pipeline?" msgid "Are you sure you want to discard your changes?" -msgstr "" +msgstr "Você tem certeza que deseja descartar suas alterações?" + +msgid "Are you sure you want to leave this group?" +msgstr "Tem certeza que quer sair desse grupo?" msgid "Are you sure you want to reset registration token?" -msgstr "" +msgstr "Você tem certeza que quer recriar o token de registro?" msgid "Are you sure you want to reset the health check token?" -msgstr "" +msgstr "Você tem certeza que quer reiniciar o token de status de saúde?" msgid "Are you sure?" -msgstr "" +msgstr "Você tem certeza?" msgid "Artifacts" -msgstr "" +msgstr "Artefatos" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}" msgid "Authentication Log" -msgstr "" +msgstr "Log de autenticação" msgid "Author" -msgstr "" +msgstr "Autor" msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." -msgstr "" +msgstr "Apps de revisão automática e Auto Deploy precisam de um nome de domÃnio e o %{kubernetes} para que funcione corretamente." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." -msgstr "" +msgstr "Apps de revisão automática e Auto Deploy precisam de um nome de domÃnio para que funcione corretamente." msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." -msgstr "" +msgstr "Apps de revisão automática e Auto Deploy precisam do %{kubernetes} para que funcione corretamente." msgid "AutoDevOps|Auto DevOps (Beta)" -msgstr "" - -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" +msgstr "Auto DevOps (Beta)" msgid "AutoDevOps|Auto DevOps documentation" -msgstr "" +msgstr "Documentação de auto DevOps" msgid "AutoDevOps|Enable in settings" -msgstr "" +msgstr "Habilitar nas configurações" + +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "Ele gerará a build, testará e fará deploy de sua aplicação automaticamente com base em uma configuração predefinida do CI/CD." msgid "AutoDevOps|Learn more in the %{link_to_documentation}" -msgstr "" +msgstr "Saiba mais em %{link_to_documentation}" + +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "Você pode ativar %{link_to_settings} para esse projeto." msgid "Billing" -msgstr "" +msgstr "Cobrança" msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." -msgstr "" +msgstr "Grupo %{group_name} está atualmente no plano %{plan_link}." msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "" +msgstr "Downgrade e upgrade automático para alguns planos ainda não está disponÃvel." msgid "BillingPlans|Current plan" -msgstr "" +msgstr "Plano atual" msgid "BillingPlans|Customer Support" -msgstr "" +msgstr "Suporte ao cliente" msgid "BillingPlans|Downgrade" -msgstr "" +msgstr "Downgrade" msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." -msgstr "" +msgstr "Aprenda mais sobre cada plano lendo nossa %{faq_link}." msgid "BillingPlans|Manage plan" -msgstr "" +msgstr "Gerenciar plano" msgid "BillingPlans|Please contact %{customer_support_link} in that case." -msgstr "" +msgstr "Por favor contacte o %{customer_support_link} para resolver seu caso." msgid "BillingPlans|See all %{plan_name} features" -msgstr "" +msgstr "Veja todas as funcionalidades do seu plano %{plan_name}" msgid "BillingPlans|This group uses the plan associated with its parent group." -msgstr "" +msgstr "Esse grupo utiliza o plano associado ao seu grupo pai." msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." -msgstr "" +msgstr "Para gerenciar o plano para esse grupo, visite a sessão de cobrança de %{parent_billing_page_link}." msgid "BillingPlans|Upgrade" -msgstr "" +msgstr "Atualizar" msgid "BillingPlans|You are currently on the %{plan_link} plan." -msgstr "" +msgstr "Vocês está utilizando o plano %{plan_link}." msgid "BillingPlans|frequently asked questions" -msgstr "" +msgstr "perguntas frequentes" msgid "BillingPlans|monthly" -msgstr "" +msgstr "mensalmente" msgid "BillingPlans|paid annually at %{price_per_year}" -msgstr "" +msgstr "pago %{price_per_year} anualmente" msgid "BillingPlans|per user" -msgstr "" +msgstr "por usuário" msgid "Branch" msgid_plural "Branches" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Branch" +msgstr[1] "Branches" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "O branch <strong>%{branch_name}</strong> foi criado. Para configurar o deploy automático, selecione um modelo de Yaml do GitLab CI e commit suas mudanças. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "Branch foi alterado" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Procurar por branches" @@ -242,91 +271,91 @@ msgid "BranchSwitcherTitle|Switch branch" msgstr "Mudar de branch" msgid "Branches" -msgstr "" +msgstr "Branches" msgid "Branches|Cant find HEAD commit for this branch" -msgstr "" +msgstr "Não foi possÃvel encontrar o commit HEAD para essa branch" msgid "Branches|Compare" -msgstr "" +msgstr "Comparar" msgid "Branches|Delete all branches that are merged into '%{default_branch}'" -msgstr "" +msgstr "Apagar todas as branches que foi feito merge em '%{default_branch}'" msgid "Branches|Delete branch" -msgstr "" +msgstr "Apagar branch" msgid "Branches|Delete merged branches" -msgstr "" +msgstr "Apagar branches que foram feito merge" msgid "Branches|Delete protected branch" -msgstr "" +msgstr "Apagar branch protegida" msgid "Branches|Delete protected branch '%{branch_name}'?" -msgstr "" +msgstr "Apagar branch protegida '%{branch_name}'?" msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" -msgstr "" +msgstr "Apagar a branch '%{branch_name}' não pode ser desfeito. Você tem certeza?" msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" -msgstr "" +msgstr "Apagar branches que foram feito merge não pode ser desfeito. Você tem certeza?" msgid "Branches|Filter by branch name" -msgstr "" +msgstr "Filtrar por nome de branch" msgid "Branches|Merged into %{default_branch}" -msgstr "" +msgstr "Merge feito na branch '%{default_branch}'" msgid "Branches|New branch" -msgstr "" +msgstr "Nova branch" msgid "Branches|No branches to show" -msgstr "" +msgstr "Nenhuma branch para mostrar" msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." -msgstr "" +msgstr "Uma vez que você confirmar e pressionar %{delete_protected_branch}, não pode ser desfeito ou recuperado." msgid "Branches|Only a project master or owner can delete a protected branch" -msgstr "" +msgstr "Somente alguém master ou dono do projeto poderá apagar branches protegidas" msgid "Branches|Protected branches can be managed in %{project_settings_link}" -msgstr "" +msgstr "Ramos protegidos podem ser gerenciados em %{project_settings_link}" msgid "Branches|Sort by" -msgstr "" +msgstr "Ordernar por" msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." -msgstr "" +msgstr "A branch não pode ser atualizada automaticamente porque diverge do seu upstream." msgid "Branches|The default branch cannot be deleted" -msgstr "" +msgstr "A branch padrão não pode ser apagada" msgid "Branches|This branch hasn’t been merged into %{default_branch}." -msgstr "" +msgstr "Essa branch não teve o merge realizado na '%{default_branch}'." msgid "Branches|To avoid data loss, consider merging this branch before deleting it." -msgstr "" +msgstr "Para evitar perda de dados, considere fazer um merge dessa branch antes de apagá-la." msgid "Branches|To confirm, type %{branch_name_confirmation}:" -msgstr "" +msgstr "Para confirmar, digite %{branch_name_confirmation}:" msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." -msgstr "" +msgstr "Para descartar as mudanças locais e sobrescrever a branch com a versão de upstream, apague-o aqui e escolha 'Atualizar agora', acima." msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." -msgstr "" +msgstr "Você irá apagar irreparavelmente a branch protegida '%{branch_name}'." msgid "Branches|diverged from upstream" -msgstr "" +msgstr "divergiu do upstream" msgid "Branches|merged" -msgstr "" +msgstr "merge realizado" msgid "Branches|project settings" -msgstr "" +msgstr "configurações do projeto" msgid "Branches|protected" -msgstr "" +msgstr "protegido" msgid "Browse Directory" msgstr "Navegar no Diretório" @@ -344,22 +373,22 @@ msgid "ByAuthor|by" msgstr "por" msgid "CI / CD" -msgstr "" +msgstr "CI / CD" msgid "CI configuration" msgstr "Configuração da IC" msgid "CICD|Jobs" -msgstr "" +msgstr "Jobs" msgid "Cancel" msgstr "Cancelar" msgid "Cancel edit" -msgstr "" +msgstr "Cancelar edição" msgid "Change Weight" -msgstr "" +msgstr "Mudar peso" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Pick para um branch" @@ -380,7 +409,7 @@ msgid "Charts" msgstr "Gráficos" msgid "Chat" -msgstr "" +msgstr "Bate-papo" msgid "Cherry-pick this commit" msgstr "Cherry-pick esse commit" @@ -389,7 +418,7 @@ msgid "Cherry-pick this merge request" msgstr "Cherry-pick esse merge request" msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all." -msgstr "" +msgstr "Escolha quais os grupos que você deseja replicar para este nó secundário. Deixe em branco para replicar todos." msgid "CiStatusLabel|canceled" msgstr "cancelado" @@ -445,145 +474,162 @@ msgstr "ignorado" msgid "CiStatus|running" msgstr "executando" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "interruptor da api" + msgid "Clone repository" -msgstr "" +msgstr "Clonar repositório" msgid "Close" -msgstr "" +msgstr "Fechar" + +msgid "Cluster" +msgstr "Cluster" msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" -msgstr "" +msgstr "Um %{link_to_container_project} deve ter sido criado com essa conta" + +msgid "ClusterIntegration|Cluster details" +msgstr "Detalhes do cluster" msgid "ClusterIntegration|Cluster integration" -msgstr "" +msgstr "Integração do cluster" msgid "ClusterIntegration|Cluster integration is disabled for this project." -msgstr "" +msgstr "Integração do cluster está desabilitada para esse projeto." msgid "ClusterIntegration|Cluster integration is enabled for this project." -msgstr "" +msgstr "Integração do cluster está ativada nesse projeto." msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "Integração do cluster está ativada para esse projeto. Desabilitar a integração não afetará seu cluster, mas desligará temporariamente a conexão do Gitlab com ele." msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." -msgstr "" +msgstr "O cluster está sendo criado no Google Container Engine..." msgid "ClusterIntegration|Cluster name" -msgstr "" +msgstr "Nome do cluster" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" -msgstr "" +msgstr "O cluster foi criado com sucesso no Google Container Engine" msgid "ClusterIntegration|Copy cluster name" -msgstr "" +msgstr "Copiar nome do cluster" msgid "ClusterIntegration|Create cluster" -msgstr "" +msgstr "Criar cluster" msgid "ClusterIntegration|Create new cluster on Google Container Engine" -msgstr "" +msgstr "Criar novo cluster no Google Container Engine" msgid "ClusterIntegration|Enable cluster integration" -msgstr "" +msgstr "Ativar integração com o cluster" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "ID do projeto no Google Cloud Platform" msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Google Container Engine project" -msgstr "" - -msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Projeto no Google Container Engine" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" +msgstr "Leia mais sobre %{link_to_documentation}" -msgid "ClusterIntegration|See machine types" -msgstr "" +msgid "ClusterIntegration|Machine type" +msgstr "Tipo de máquina" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" -msgstr "" +msgstr "Confira se sua conta %{link_to_requirements} para criar clusters" + +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "Gerenciar integração de cluster com o projeto no GitLab" msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" -msgstr "" +msgstr "Gerencie seu cluster visitando %{link_gke}" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "Número de nós" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "Por favor, tenha certeza que sua conta no Google cumpre com os requisitos:" msgid "ClusterIntegration|Project namespace (optional, unique)" -msgstr "" +msgstr "Namespace do projeto (opcional, único)" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "Ler nossa %{link_to_help_page} na integração com cluster." msgid "ClusterIntegration|Remove cluster integration" -msgstr "" +msgstr "Remover integração com cluster" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "Remover integração" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." -msgstr "" +msgstr "Remover integração com o cluster irá apagar a configuração de cluster que você adicionou à esse projeto. Não excluirá seu projeto." -msgid "ClusterIntegration|Save changes" -msgstr "" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "Ver e editar os detalhes para seu cluster" + +msgid "ClusterIntegration|See machine types" +msgstr "Ver tipos de máquina" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "Ver seus projetos" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "Ver zonas" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" - -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" +msgstr "Alguma coisa deu errado do nosso lado." -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" +msgstr "Algo deu errado ao criar seu cluster no Google Container Engine" msgid "ClusterIntegration|Toggle Cluster" -msgstr "" - -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" +msgstr "Alternar cluster" msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "Com um cluster associado à esse projeto, você pode usar revisão de apps, fazer deploy de suas aplicações, rodar suas pipelines e muito mais de um jeito simples." msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" -msgstr "" +msgstr "Sua conta precisa ter %{link_to_container_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "Zona" msgid "ClusterIntegration|access to Google Container Engine" -msgstr "" +msgstr "Acesso ao Google Container Engine" msgid "ClusterIntegration|cluster" -msgstr "" +msgstr "cluster" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "ajuda" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "atende aos requisitos" msgid "ClusterIntegration|properly configured" -msgstr "" +msgstr "configurado corretamente" msgid "Comments" -msgstr "" +msgstr "Comentários" msgid "Commit" msgid_plural "Commits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Commit" +msgstr[1] "Commits" + +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "Commit %d arquivo" +msgstr[1] "Commit %d arquivos" msgid "Commit Message" -msgstr "" +msgstr "Mensagem de Commit" msgid "Commit duration in minutes for last 30 commits" msgstr "Duração do commit em minutos para os últimos 30 commits" @@ -598,7 +644,7 @@ msgid "CommitMessage|Add %{file_name}" msgstr "Adicionar %{file_name}" msgid "Commits" -msgstr "" +msgstr "Commits" msgid "Commits feed" msgstr "Feed de commits" @@ -613,49 +659,49 @@ msgid "Compare" msgstr "Comparar" msgid "Container Registry" -msgstr "" +msgstr "Container Registry" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "Criado" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" -msgstr "" +msgstr "Primeiro faça login no Container Registry do Gitlab usando seu nome de usuário e senha. Se você tiver %{link_2fa}, será necessário usar um %{link_token}:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "Gitlab suporta até três nÃveis de nomes de imagens. Os exemplos a seguir são de imagens válidas para seu projeto:" msgid "ContainerRegistry|How to use the Container Registry" -msgstr "" +msgstr "Como usar o Container Registry" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "Leia mais sobre" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "Sem tags no Container Registry para essa imagem." msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "Uma vez que você autenticar, será possÃvel criar e fazer upload de uma imagem usando os comandos comuns de %{build} e %{push}" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "Apagar repositório" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "Apagar tag" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "Tamanho" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "Tag" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "ID da Tag" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "Use nomes de imagem diferentes" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." -msgstr "" +msgstr "Com o Container Registry do Docker integrado ao Gitlab, todo projeto pode ter seu próprio espaço para guardar suas imagens." msgid "Contribution guide" msgstr "Guia de contribuição" @@ -663,8 +709,14 @@ msgstr "Guia de contribuição" msgid "Contributors" msgstr "Contribuidores" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "Controle a concorrência máxima de LFS/preenchimento de anexos para o nó secundário" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "Controle a concorrência máxima de preenchimento de repositórios para o nó secundário" + msgid "Copy SSH public key to clipboard" -msgstr "" +msgstr "Copiar chave SSH pública para área de transferência" msgid "Copy URL to clipboard" msgstr "Copiar URL para área de transferência" @@ -684,9 +736,21 @@ msgstr "Criar diretório" msgid "Create empty bare repository" msgstr "Criar repositório bruto vazio" +msgid "Create file" +msgstr "Criar arquivo" + msgid "Create merge request" msgstr "Criar merge request" +msgid "Create new branch" +msgstr "Criar novo branch" + +msgid "Create new directory" +msgstr "Criar nova pasta" + +msgid "Create new file" +msgstr "Criar novo arquivo" + msgid "Create new..." msgstr "Criar novo..." @@ -739,10 +803,10 @@ msgid "CycleAnalyticsStage|Test" msgstr "Teste" msgid "DashboardProjects|All" -msgstr "" +msgstr "Todos" msgid "DashboardProjects|Personal" -msgstr "" +msgstr "Pessoal" msgid "Define a custom pattern with cron syntax" msgstr "Defina um padrão personalizado utilizando a sintaxe do cron" @@ -756,25 +820,28 @@ msgstr[0] "Implantação" msgstr[1] "Implantações" msgid "Deploy Keys" -msgstr "" +msgstr "Chaves para deploy" msgid "Description" msgstr "Descrição" msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." -msgstr "" +msgstr "Modelos de descrição permitem que você defina modelos de contextos especÃficos para issue e descrição de merge requests para seu projeto." msgid "Details" -msgstr "" +msgstr "Detalhes" msgid "Directory name" msgstr "Nome do diretório" msgid "Discard changes" -msgstr "" +msgstr "Descartar alterações" + +msgid "Dismiss Cycle Analytics introduction box" +msgstr "Ignorar introdução do Cycle Analytics" msgid "Dismiss Merge Request promotion" -msgstr "" +msgstr "Ignorar anúncio do merge request" msgid "Don't show again" msgstr "Não exibir novamente" @@ -813,25 +880,25 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Alterar Agendamento do Pipeline %{id}" msgid "Emails" -msgstr "" +msgstr "Emails" msgid "EventFilterBy|Filter by all" -msgstr "" +msgstr "EventFilterBy|Filtrar por tudo" msgid "EventFilterBy|Filter by comments" -msgstr "" +msgstr "EventFilterBy|Filtrar por comentários" msgid "EventFilterBy|Filter by issue events" -msgstr "" +msgstr "EventFilterBy|Filtrar por eventos de issue" msgid "EventFilterBy|Filter by merge events" -msgstr "" +msgstr "EventFilterBy|Filtrar por eventos de merge" msgid "EventFilterBy|Filter by push events" -msgstr "" +msgstr "EventFilterBy|Filtrar por eventos de push" msgid "EventFilterBy|Filter by team" -msgstr "" +msgstr "EventFilterBy|Filtrar por equipe" msgid "Every day (at 4:00am)" msgstr "Todos os dias (à s 4:00)" @@ -843,7 +910,10 @@ msgid "Every week (Sundays at 4:00am)" msgstr "Toda semana (domingos à s 4:00)" msgid "Explore projects" -msgstr "" +msgstr "Explorar projetos" + +msgid "Explore public groups" +msgstr "Explorar grupos públicos" msgid "Failed to change the owner" msgstr "Erro ao alterar o proprietário" @@ -851,6 +921,9 @@ msgstr "Erro ao alterar o proprietário" msgid "Failed to remove the pipeline schedule" msgstr "Erro ao excluir o agendamento do pipeline" +msgid "File name" +msgstr "Nome do arquivo" + msgid "Files" msgstr "Arquivos" @@ -871,17 +944,17 @@ msgstr "publicado por" msgid "Fork" msgid_plural "Forks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Fork" +msgstr[1] "Forks" msgid "ForkedFromProjectPath|Forked from" msgstr "Fork criado a partir de" msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" -msgstr "" +msgstr "Fork a partir de %{project_name} (apagado)" msgid "Format" -msgstr "" +msgstr "Formato" msgid "From issue creation until deploy to production" msgstr "Da abertura de tarefas até a implantação para a produção" @@ -890,22 +963,28 @@ msgid "From merge request merge until deploy to production" msgstr "Do merge request até a implantação em produção" msgid "GPG Keys" -msgstr "" +msgstr "Chaves GPG" msgid "Geo Nodes" -msgstr "" +msgstr "Nós de geo" + +msgid "Geo|File sync capacity" +msgstr "Capacidade de sincronização de arquivo" msgid "Geo|Groups to replicate" -msgstr "" +msgstr "Grupos para replicar" + +msgid "Geo|Repository sync capacity" +msgstr "Capacidade de sincronização de repositório" msgid "Geo|Select groups to replicate." -msgstr "" +msgstr "Selecione grupos para replicar." msgid "Git storage health information has been reset" -msgstr "" +msgstr "Informações sobre o status de saúde do storage Git foram reiniciadas" msgid "GitLab Runner section" -msgstr "" +msgstr "Seção GitLab Runner" msgid "Go to your fork" msgstr "Ir para seu fork" @@ -914,52 +993,97 @@ msgid "GoToYourFork|Fork" msgstr "Fork" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "Autenticação do Google não está %{link_to_documentation}. Peça ao administrador do Gitlab se você deseja usar esse serviço." msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" -msgstr "" +msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos" msgid "GroupSettings|Share with group lock" -msgstr "" +msgstr "Travar compartilhamento de grupo" msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." -msgstr "" +msgstr "Essa configuração é aplicada no grupo %{ancestor_group} e foi sobrescrita nesse subgrupo." msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Essa configuração é aplicada no grupo %{ancestor_group}. Para compartilhar projetos desse grupo com outro grupo, peça ao dono para alterar a configuração ou %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Essa configuração foi aplicada no grupo %{ancestor_group}. Você pode sobrescrevê-la ou %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." -msgstr "" +msgstr "Essa configuração será aplicada à todos os subgrupos a menos que sejam sobrescritas pelo dono do grupo. Grupos que já tem acesso ao projeto continuarão a acessá-los até que sejam removidos manualmente." msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" -msgstr "" +msgstr "não pode ser desativado quando a configuração \"Travar compartilhamento de grupo\" está ativada, a não ser pelo dono do grupo pai" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" -msgstr "" +msgstr "retirar a trava de compartilhamento de grupo de %{ancestor_group_name}" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "Um grupo é uma coleção de vários projetos." + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "Se você organizar seus projetos num grupo, será como uma pasta." + +msgid "GroupsEmptyState|No groups found" +msgstr "Nenhum grupo encontrado" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "Você pode gerenciar permissões de membros e acesso do seu grupo para cada projeto no grupo." + +msgid "GroupsTreeRole|as" +msgstr "como" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "Você tem certeza que deseja sair do grupo \"${this.group.fullName}\"?" + +msgid "GroupsTree|Create a project in this group." +msgstr "Criar um projeto nesse grupo." + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "Criar um subgrupo nesse grupo." + +msgid "GroupsTree|Edit group" +msgstr "Editar grupo" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "Falha ao deixar o grupo. Por favor, verifique se você é o único dono." + +msgid "GroupsTree|Filter by name..." +msgstr "Filtrar por nome..." + +msgid "GroupsTree|Leave this group" +msgstr "Deixar o grupo" + +msgid "GroupsTree|Loading groups" +msgstr "Carregando grupos" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "Desculpe, nenhum grupo corresponde à sua pesquisa" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "Desculpe, nenhum grupo ou projeto correspondem à sua pesquisa" msgid "Health Check" -msgstr "" +msgstr "Status de Saúde" msgid "Health information can be retrieved from the following endpoints. More information is available" -msgstr "" +msgstr "Informações do status de saúde podem ser obtidas nos seguintes locais. Mais informação está disponÃvel" msgid "HealthCheck|Access token is" -msgstr "" +msgstr "O token de acesso é" msgid "HealthCheck|Healthy" -msgstr "" +msgstr "Saudável" msgid "HealthCheck|No Health Problems Detected" -msgstr "" +msgstr "Nenhum problema de saúde detectado" msgid "HealthCheck|Unhealthy" -msgstr "" +msgstr "Não saudável" msgid "History" -msgstr "" +msgstr "Histórico" msgid "Housekeeping successfully started" msgstr "Manutenção iniciada com sucesso" @@ -968,21 +1092,27 @@ msgid "Import repository" msgstr "Importar repositório" msgid "Improve Issue boards with GitLab Enterprise Edition." -msgstr "" +msgstr "Melhorar issue boards com o GitLab Enterprise Edition." msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." -msgstr "" +msgstr "Melhore gestão das issues com os pesos no GitLab Enterprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." -msgstr "" +msgstr "Encontre o que precisa mais facilmente com a pesquisa global avançada com GitLab Enterprise Edition." msgid "Install a Runner compatible with GitLab CI" -msgstr "" +msgstr "Instalar um Runner compatÃvel com o GitLab CI" msgid "Instance" msgid_plural "Instances" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Instância" +msgstr[1] "Instâncias" + +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "Interno - O grupo e projetos internos podem ser visualizados por qualquer usuário autenticado." + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "Interno - O projeto pode ser acessado por qualquer usuário autenticado." msgid "Interval Pattern" msgstr "Padrão de intervalo" @@ -991,22 +1121,22 @@ msgid "Introducing Cycle Analytics" msgstr "Apresentando a Análise de Ciclo" msgid "Issue board focus mode" -msgstr "" +msgstr "Modo de foco no issue board" msgid "Issue boards with milestones" -msgstr "" +msgstr "Issue board com milestone" msgid "Issue events" -msgstr "" +msgstr "Eventos de issue" msgid "IssueBoards|Board" -msgstr "" +msgstr "Board" msgid "IssueBoards|Boards" -msgstr "" +msgstr "Boards" msgid "Issues" -msgstr "" +msgstr "Issues" msgid "LFSStatus|Disabled" msgstr "Desabilitado" @@ -1015,7 +1145,7 @@ msgid "LFSStatus|Enabled" msgstr "Habilitado" msgid "Labels" -msgstr "" +msgstr "Etiquetas" msgid "Last %d day" msgid_plural "Last %d days" @@ -1029,22 +1159,22 @@ msgid "Last commit" msgstr "Último commit" msgid "Last edited %{date}" -msgstr "" +msgstr "Última edição em %{date}" msgid "Last edited by %{name}" -msgstr "" +msgstr "Última edição por %{name}" msgid "Last update" -msgstr "" +msgstr "Última atualização" msgid "Last updated" -msgstr "" +msgstr "Último atualizado" msgid "LastPushEvent|You pushed to" -msgstr "" +msgstr "Você fez o push para" msgid "LastPushEvent|at" -msgstr "" +msgstr "em" msgid "Learn more in the" msgstr "Saiba mais em" @@ -1052,6 +1182,9 @@ msgstr "Saiba mais em" msgid "Learn more in the|pipeline schedules documentation" msgstr "documentação de agendamento de pipeline" +msgid "Leave" +msgstr "Sair" + msgid "Leave group" msgstr "Sair do grupo" @@ -1059,7 +1192,7 @@ msgid "Leave project" msgstr "Sair do projeto" msgid "License" -msgstr "" +msgstr "Licença" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -1067,43 +1200,52 @@ msgstr[0] "Limitado a mostrar %d evento, no máximo" msgstr[1] "Limitado a mostrar %d eventos, no máximo" msgid "Lock" -msgstr "" +msgstr "Bloquear" msgid "Locked" -msgstr "" +msgstr "Bloqueado" msgid "Locked Files" -msgstr "" +msgstr "Arquivos bloqueados" + +msgid "Login" +msgstr "Entrar" + +msgid "Maximum git storage failures" +msgstr "Máximo de falhas do git storage" msgid "Median" msgstr "Mediana" msgid "Members" -msgstr "" +msgstr "Membros" msgid "Merge Requests" -msgstr "" +msgstr "Merge Requests" msgid "Merge events" -msgstr "" +msgstr "Eventos de merge" msgid "Merge request" -msgstr "" +msgstr "Merge requests" msgid "Messages" -msgstr "" +msgstr "Mensagens" msgid "MissingSSHKeyWarningLink|add an SSH key" msgstr "adicione uma chave SSH" msgid "Monitoring" -msgstr "" +msgstr "Monitoramento" msgid "More information is available|here" -msgstr "" +msgstr "Mais informações estão disponÃveis|aqui" msgid "Multiple issue boards" -msgstr "" +msgstr "Múltiplos issue boards" + +msgid "New Cluster" +msgstr "Novo cluster" msgid "New Issue" msgid_plural "New Issues" @@ -1122,23 +1264,32 @@ msgstr "Novo diretório" msgid "New file" msgstr "Novo arquivo" +msgid "New group" +msgstr "Novo grupo" + msgid "New issue" msgstr "Nova issue" msgid "New merge request" msgstr "Novo merge request" +msgid "New project" +msgstr "Novo projeto" + msgid "New schedule" msgstr "Novo agendamento" msgid "New snippet" msgstr "Novo snippet" +msgid "New subgroup" +msgstr "Novo subgrupo" + msgid "New tag" msgstr "Nova tag" msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" +msgstr "Nenhuma imagem gravada para esse projeto. Adiciona uma com as instruções a seguir." msgid "No repository" msgstr "Nenhum repositório" @@ -1147,7 +1298,7 @@ msgid "No schedules" msgstr "Nenhum agendamento" msgid "None" -msgstr "" +msgstr "Nenhum" msgid "Not available" msgstr "Não disponÃvel" @@ -1210,49 +1361,55 @@ msgid "NotificationLevel|Watch" msgstr "Observar" msgid "Notifications" +msgstr "Notificações" + +msgid "Number of access attempts" +msgstr "Número de tentativas de acesso" + +msgid "Number of failures before backing off" msgstr "" msgid "OfSearchInADropdown|Filter" msgstr "Filtrar" msgid "Only project members can comment." -msgstr "" +msgstr "Somente membros do projeto podem comentar." msgid "OpenedNDaysAgo|Opened" msgstr "Aberto" msgid "Opens in a new window" -msgstr "" +msgstr "Abrir em nova janela" msgid "Options" msgstr "Opções" msgid "Overview" -msgstr "" +msgstr "Visão geral" msgid "Owner" msgstr "Proprietário" msgid "Pagination|Last »" -msgstr "" +msgstr "Último >>" msgid "Pagination|Next" -msgstr "" +msgstr "Próximo" msgid "Pagination|Prev" -msgstr "" +msgstr "Anterior" msgid "Pagination|« First" -msgstr "" +msgstr "<< Primeiro" msgid "Password" -msgstr "" +msgstr "Senha" msgid "People without permission will never get a notification and won\\'t be able to comment." -msgstr "" +msgstr "Pessoas sem permissão nunca receberão uma notificação e não serão capazes de comentar." msgid "Pipeline" -msgstr "" +msgstr "Pipeline" msgid "Pipeline Health" msgstr "Saúde da Pipeline" @@ -1264,7 +1421,7 @@ msgid "Pipeline Schedules" msgstr "Agendamentos da Pipeline" msgid "Pipeline quota" -msgstr "" +msgstr "Cota de pipeline" msgid "PipelineCharts|Failed:" msgstr "Falhou:" @@ -1324,19 +1481,19 @@ msgid "PipelineSheduleIntervalPattern|Custom" msgstr "Personalizado" msgid "Pipelines" -msgstr "" +msgstr "Pipelines" msgid "Pipelines charts" msgstr "Gráficos de pipelines" msgid "Pipelines for last month" -msgstr "" +msgstr "Pipelines para o último mês" msgid "Pipelines for last week" -msgstr "" +msgstr "Pipelines para a última semana" msgid "Pipelines for last year" -msgstr "" +msgstr "Pipelines para o último ano" msgid "Pipeline|all" msgstr "todos" @@ -1351,10 +1508,55 @@ msgid "Pipeline|with stages" msgstr "com etapas" msgid "Preferences" -msgstr "" +msgstr "Preferências" + +msgid "Private - Project access must be granted explicitly to each user." +msgstr "Privado - O acesso ao projeto deve ser concedido explicitamente para cada usuário." + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "Privado - O grupo e seus projetos só podem ser vistos por seus membros." msgid "Profile" -msgstr "" +msgstr "Perfil" + +msgid "Profiles|Account scheduled for removal." +msgstr "Conta agendada para remoção." + +msgid "Profiles|Delete Account" +msgstr "Excluir conta" + +msgid "Profiles|Delete account" +msgstr "Excluir conta" + +msgid "Profiles|Delete your account?" +msgstr "Deseja apagar sua conta?" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "Apagando conta tem os seguintes efeitos:" + +msgid "Profiles|Invalid password" +msgstr "Senha inválida" + +msgid "Profiles|Invalid username" +msgstr "Nome de usuário inválido" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "Escreva %{confirmationValue} para confirmar:" + +msgid "Profiles|You don't have access to delete this user." +msgstr "Você não tem permissão para apagar esse usuário." + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "Você precisa delegar outro usuário para ser dono ou apagar esses grupos antes de excluir sua conta." + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "Sua conta é atualmente proprietária dos seguintes grupos:" + +msgid "Profiles|your account" +msgstr "sua conta" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "O projeto '%{project_name}' está sendo excluÃdo." msgid "Project '%{project_name}' queued for deletion." msgstr "Projeto'%{project_name}' marcado para exclusão." @@ -1365,14 +1567,11 @@ msgstr "Projeto '%{project_name}' criado com sucesso." msgid "Project '%{project_name}' was successfully updated." msgstr "Projeto '%{project_name}' atualizado com sucesso." -msgid "Project '%{project_name}' will be deleted." -msgstr "Projeto '%{project_name}' será excluÃdo." - msgid "Project access must be granted explicitly to each user." msgstr "Acesso ao projeto deve ser concedido explicitamente para cada usuário." msgid "Project details" -msgstr "" +msgstr "Detalhes do projeto" msgid "Project export could not be deleted." msgstr "A exportação do projeto não pôde ser excluÃda." @@ -1387,7 +1586,7 @@ msgid "Project export started. A download link will be sent by email." msgstr "Exportação do projeto iniciada. Um link para baixá-la será enviado por email." msgid "ProjectActivityRSS|Subscribe" -msgstr "" +msgstr "Inscreva-se" msgid "ProjectFeature|Disabled" msgstr "Desabilitado" @@ -1411,46 +1610,61 @@ msgid "ProjectNetworkGraph|Graph" msgstr "Ãrvore" msgid "ProjectSettings|Contact an admin to change this setting." -msgstr "" +msgstr "Fale com um administrador para mudar essa configuração." msgid "ProjectSettings|Only signed commits can be pushed to this repository." -msgstr "" +msgstr "Esse repositório só aceita push de commits assinados." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." -msgstr "" +msgstr "Essa configuração está aplicada à nivel de servidor e pode ser sobrescrita por um adminstrador." msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." -msgstr "" +msgstr "Essa configuração está aplicada à nivel de servidor mas pode ser sobrescrita para esse projeto." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." -msgstr "" +msgstr "Essa configuração será aplicada à todos os projetos, a não ser que sejam sobrescritos pelo administrador." + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "Nesse repositório, usuários só podem fazer push de commits verificados pelos seus e-mails." + +msgid "Projects" +msgstr "Projetos" msgid "ProjectsDropdown|Frequently visited" -msgstr "" +msgstr "Visitados frequentemente" msgid "ProjectsDropdown|Loading projects" -msgstr "" +msgstr "Carregando projetos" msgid "ProjectsDropdown|Projects you visit often will appear here" -msgstr "" +msgstr "Projetos que você visita frequentemente aparecerão aqui" msgid "ProjectsDropdown|Search your projects" -msgstr "" +msgstr "Procure seus projetos" msgid "ProjectsDropdown|Something went wrong on our end." -msgstr "" +msgstr "Algo deu errado do nosso lado." msgid "ProjectsDropdown|Sorry, no projects matched your search" -msgstr "" +msgstr "Desculpe, nenhum projeto corresponde a sua pesquisa" msgid "ProjectsDropdown|This feature requires browser localStorage support" -msgstr "" +msgstr "Esta funcionalidade necessita de suporte à localStorage do navegador" + +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "Público - O grupo e seus projetos podem ser visualizados por todos sem autenticação." + +msgid "Public - The project can be accessed without any authentication." +msgstr "Público - O projeto pode ser acessado sem nenhuma autenticação." msgid "Push Rules" -msgstr "" +msgstr "Regras de push" msgid "Push events" -msgstr "" +msgstr "Eventos de push" + +msgid "PushRule|Committer restriction" +msgstr "Restrição de commit" msgid "Read more" msgstr "Leia mais" @@ -1465,7 +1679,7 @@ msgid "RefSwitcher|Tags" msgstr "Tags" msgid "Registry" -msgstr "" +msgstr "Registry" msgid "Related Commits" msgstr "Commits Relacionados" @@ -1492,19 +1706,19 @@ msgid "Remove project" msgstr "Remover projeto" msgid "Repository" -msgstr "" +msgstr "Repositório" msgid "Request Access" msgstr "Solicitar acesso" msgid "Reset git storage health information" -msgstr "" +msgstr "Reiniciar informações de status do storage Git" msgid "Reset health check access token" -msgstr "" +msgstr "Recriar o token de status de saúde" msgid "Reset runners registration token" -msgstr "" +msgstr "Recriar o token de registro de runners" msgid "Revert this commit" msgstr "Reverter este commit" @@ -1513,10 +1727,13 @@ msgid "Revert this merge request" msgstr "Reverter esse merge request" msgid "SSH Keys" -msgstr "" +msgstr "Chaves SSH" + +msgid "Save" +msgstr "Salvar" msgid "Save changes" -msgstr "" +msgstr "Salvar alterações" msgid "Save pipeline schedule" msgstr "Salvar agendamento da pipeline" @@ -1525,7 +1742,7 @@ msgid "Schedule a new pipeline" msgstr "Agendar nova pipeline" msgid "Schedules" -msgstr "" +msgstr "Agendamentos" msgid "Scheduling Pipelines" msgstr "Agendando pipelines" @@ -1533,6 +1750,15 @@ msgstr "Agendando pipelines" msgid "Search branches and tags" msgstr "Procurar branch e tags" +msgid "Seconds before reseting failure information" +msgstr "Segundos antes de redefinir as informações de falha" + +msgid "Seconds to wait after a storage failure" +msgstr "Segundos a esperar após uma falha de armazenamento" + +msgid "Seconds to wait for a storage access attempt" +msgstr "Segundo de espera para tentativa de acesso ao storage" + msgid "Select Archive Format" msgstr "Selecionar Formato do Arquivo" @@ -1543,7 +1769,7 @@ msgid "Select target branch" msgstr "Selecionar branch de destino" msgid "Service Templates" -msgstr "" +msgstr "Modelos de serviço" msgid "Set a password on your account to pull or push via %{protocol}." msgstr "Defina uma senha para sua conta para aceitar ou entregar código via %{protocol}." @@ -1561,13 +1787,13 @@ msgid "SetPasswordToCloneLink|set a password" msgstr "defina uma senha" msgid "Settings" -msgstr "" +msgstr "Configurações" msgid "Show parent pages" -msgstr "" +msgstr "Mostrar páginas acima" msgid "Show parent subgroups" -msgstr "" +msgstr "Mostrar subgrupos acima" msgid "Showing %d event" msgid_plural "Showing %d events" @@ -1575,161 +1801,173 @@ msgstr[0] "Mostrando %d evento" msgstr[1] "Mostrando %d eventos" msgid "Snippets" -msgstr "" +msgstr "Snippets" msgid "Something went wrong on our end." -msgstr "" +msgstr "Algo deu errado do nosso lado." + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "Algo deu errado ao tentar mudar o estado de bloqueio de ${this.issuableDisplayName(this.issuableType)}" msgid "Something went wrong while fetching the projects." -msgstr "" +msgstr "Algo deu errado ao recuperar os projetos." msgid "Something went wrong while fetching the registry list." -msgstr "" +msgstr "Algo deu errado ao recuperar a lista de registro." -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "" +msgid "Sort by" +msgstr "Ordenar por" msgid "SortOptions|Access level, ascending" -msgstr "" +msgstr "NÃvel de acesso, ascendente" msgid "SortOptions|Access level, descending" -msgstr "" +msgstr "NÃvel de acesso, decrescente" msgid "SortOptions|Created date" -msgstr "" +msgstr "Data de criação" msgid "SortOptions|Due date" -msgstr "" +msgstr "Data de vencimento" msgid "SortOptions|Due later" -msgstr "" +msgstr "Data de vencimento mais longe" msgid "SortOptions|Due soon" -msgstr "" +msgstr "Data de vencimento mais próxima" msgid "SortOptions|Label priority" -msgstr "" +msgstr "Prioridade de label" msgid "SortOptions|Largest group" -msgstr "" +msgstr "Maior grupo" msgid "SortOptions|Largest repository" -msgstr "" +msgstr "Maior repositório" msgid "SortOptions|Last created" -msgstr "" +msgstr "Últimos criados" msgid "SortOptions|Last joined" -msgstr "" +msgstr "Últimos associados" msgid "SortOptions|Last updated" -msgstr "" +msgstr "Últimos atualizados" msgid "SortOptions|Least popular" -msgstr "" +msgstr "Menos populares" msgid "SortOptions|Less weight" -msgstr "" +msgstr "Menor peso" msgid "SortOptions|Milestone" -msgstr "" +msgstr "Milestone" msgid "SortOptions|Milestone due later" -msgstr "" +msgstr "Milestone de fim mais longo" msgid "SortOptions|Milestone due soon" -msgstr "" +msgstr "Milestone de fim mais próximo" msgid "SortOptions|More weight" -msgstr "" +msgstr "Mais peso" msgid "SortOptions|Most popular" -msgstr "" +msgstr "Mais populares" msgid "SortOptions|Name" -msgstr "" +msgstr "Nome" msgid "SortOptions|Name, ascending" -msgstr "" +msgstr "Nome, ascendente" msgid "SortOptions|Name, descending" -msgstr "" +msgstr "Nome, decrescente" msgid "SortOptions|Oldest created" -msgstr "" +msgstr "Criação mais antiga" msgid "SortOptions|Oldest joined" -msgstr "" +msgstr "Primeiros associados" msgid "SortOptions|Oldest sign in" -msgstr "" +msgstr "Assinados mais antigos" msgid "SortOptions|Oldest updated" -msgstr "" +msgstr "Atualização mais antiga" msgid "SortOptions|Popularity" -msgstr "" +msgstr "Popularidade" msgid "SortOptions|Priority" -msgstr "" +msgstr "Prioridade" msgid "SortOptions|Recent sign in" -msgstr "" +msgstr "Assinados mais novos" msgid "SortOptions|Start later" -msgstr "" +msgstr "Iniciar mais tarde" msgid "SortOptions|Start soon" -msgstr "" +msgstr "Iniciar mais próximo" msgid "SortOptions|Weight" -msgstr "" +msgstr "Peso" msgid "Source code" msgstr "Código-fonte" msgid "Spam Logs" -msgstr "" +msgstr "Logs de spam" msgid "Specify the following URL during the Runner setup:" -msgstr "" +msgstr "Especifique a seguinte URL durante a configuração do Runner:" msgid "StarProject|Star" msgstr "Marcar" msgid "Starred projects" -msgstr "" +msgstr "Projetos favoritos" msgid "Start a %{new_merge_request} with these changes" msgstr "Iniciar um %{new_merge_request} a partir dessas alterações" msgid "Start the Runner!" -msgstr "" +msgstr "Inicie o Runner!" + +msgid "Subgroups" +msgstr "Subgrupos" + +msgid "Subscribe" +msgstr "Assine" msgid "Switch branch/tag" msgstr "Trocar branch/tag" msgid "System Hooks" -msgstr "" +msgstr "Hooks do sistema" msgid "Tag" msgid_plural "Tags" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tag" +msgstr[1] "Tags" msgid "Tags" -msgstr "" +msgstr "Tags" msgid "Target Branch" msgstr "Branch de destino" msgid "Team" -msgstr "" +msgstr "Equipe" msgid "Thanks! Don't show me this again" -msgstr "" +msgstr "Obrigado! Não mostrar novamente" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." +msgstr "A pesquisa global avançado no GitLab é um serviço poderoso de pesquisa que poupa seu tempo. Ao invés de criar código duplicado e perder seu tempo, você pode agora pesquisar por código de outros times que podem ajudar no seu próprio projeto." + +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgstr "" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." @@ -1744,6 +1982,15 @@ msgstr "O relacionamento como fork foi removido." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "A etapa de planejamento mostra o tempo que se leva desde a criação de uma issue até sua atribuição à um milestone, ou sua adição a uma lista no seu Issue Board. Comece a criar issues para ver dados para esta etapa." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "O número de tentativas que gitlab fará para acessar um storage." + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "O número de falhas até o GitLab começar a desabilitar temporariamente o acesso a um nó de storage em um host" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "O número de falhas para que o GitLab desabilite o acesso ao storage. O número de falhas pode ser redefinido na interface do administrador: %{link_to_health_page} ou %{api_documentation_link}." + msgid "The phase of the development lifecycle." msgstr "A fase do ciclo de vida do desenvolvimento." @@ -1774,6 +2021,12 @@ msgstr "A etapa de homologação mostra o tempo entre o aceite da solicitação msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "A etapa de testes mostra o tempo que o GitLab CI leva para executar cada pipeline para a solicitação de incorporação associada. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "Tempo em segundos para o GitLab manter as informações de falha. Se nenhuma falha ocorrer durante este tempo, a informação sobre o ponto de montagem será redefinida." + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "Tempo em segundos que o GitLab tentará acessar o storage. Depois desse tempo, um erro de tempo excedido será disparado." + msgid "The time taken by each data entry gathered by that stage." msgstr "O tempo necessário por cada entrada de dados reunida por essa etapa." @@ -1781,25 +2034,28 @@ msgid "The value lying at the midpoint of a series of observed values. E.g., bet msgstr "O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6." msgid "There are problems accessing Git storage: " -msgstr "" +msgstr "Há problemas para acessar o storage Git: " + +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "Esse branch mudou desde quando você começou sua edição. Você quer criar um novo branch?" msgid "This is a confidential issue." -msgstr "" +msgstr "Essa issue é confidencial." msgid "This is the author's first Merge Request to this project." -msgstr "" +msgstr "Esse é o autor do primeiro merge request desse projeto." msgid "This issue is confidential and locked." -msgstr "" +msgstr "Essa issue é confidencial e está bloqueada." msgid "This issue is locked." -msgstr "" +msgstr "Essa issue está bloqueada." msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "Isto significa que você não pode entregar código até que crie um repositório vazio ou importe um existente." msgid "This merge request is locked." -msgstr "" +msgstr "Esse merge request está bloqueado." msgid "Time before an issue gets scheduled" msgstr "Tempo até que uma issue seja agendada" @@ -1931,7 +2187,7 @@ msgid "Timeago|in 1 year" msgstr "em 1 ano" msgid "Timeago|in a while" -msgstr "" +msgstr "há algum tempo" msgid "Timeago|less than a minute ago" msgstr "há menos de um minuto" @@ -1956,31 +2212,34 @@ msgid "Total test time for all commits/merges" msgstr "Tempo de teste total para todos os commits/merges" msgid "Track activity with Contribution Analytics." -msgstr "" +msgstr "Acompanhar atividade com o Contribution Analytics." msgid "Unlock" -msgstr "" +msgstr "Desbloquear" msgid "Unlocked" -msgstr "" +msgstr "Desbloqueado" msgid "Unstar" msgstr "Desmarcar" +msgid "Unsubscribe" +msgstr "Desassinar" + msgid "Upgrade your plan to activate Advanced Global Search." -msgstr "" +msgstr "Atualize seu plano para ativar a pesquisa global avançada." msgid "Upgrade your plan to activate Contribution Analytics." -msgstr "" +msgstr "Atualize seu plano para ativar o Contribution Analytics." msgid "Upgrade your plan to activate Group Webhooks." -msgstr "" +msgstr "Atualize seu plano para ativar Webhooks de grupo." msgid "Upgrade your plan to activate Issue weight." -msgstr "" +msgstr "Atualize seu plano para ativar peso nas issues." msgid "Upgrade your plan to improve Issue boards." -msgstr "" +msgstr "Atualize seu plano para melhorar os issue boards." msgid "Upload New File" msgstr "Enviar Novo Arquivo" @@ -1992,19 +2251,19 @@ msgid "UploadLink|click to upload" msgstr "clique para fazer upload" msgid "Use the following registration token during setup:" -msgstr "" +msgstr "Use o seguinte token de registro durante a configuração:" msgid "Use your global notification setting" msgstr "Utilizar configuração de notificação global" msgid "View file @ " -msgstr "" +msgstr "Ver arquivo @ " msgid "View open merge request" msgstr "Ver merge request aberto" msgid "View replaced file @ " -msgstr "" +msgstr "Ver arquivo substituÃdo @ " msgid "VisibilityLevel|Internal" msgstr "Interno" @@ -2025,115 +2284,118 @@ msgid "We don't have enough data to show this stage." msgstr "Esta etapa não possui dados suficientes para exibição." msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." -msgstr "" +msgstr "Webhooks permitem que você acione uma URL se, por exemplo, um novo código for feito push ou uma nova issue criada. Você pode configurar os webhooks para escutar eventos especÃficos como push, issue ou merge request. Webhooks de grupo aplicarão para todos os projetos no grupo, permitindo você padronizar o funcionamento em todo o grupo." msgid "Weight" -msgstr "" +msgstr "Peso" + +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "Falha ao acessar o storage. Gitlab impedirá o acesso ao storage pelo tempo especificado aqui. Isso permite que o sistema de arquivos se recupere. Repositórios que estiverem em nós com falha ficarão temporariamente indisponÃveis" msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "WikiClone|Clone your wiki" -msgstr "" +msgstr "Clonar sua wiki" msgid "WikiClone|Git Access" -msgstr "" +msgstr "Acesso Git" msgid "WikiClone|Install Gollum" -msgstr "" +msgstr "Instalar Gollum" msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" -msgstr "" +msgstr "É recomendado instalar %{markdown} para que as funções GFM sejam renderizadas localmente:" msgid "WikiClone|Start Gollum and edit locally" -msgstr "" +msgstr "Inicie o Gollum e edite localmente" msgid "WikiEmptyPageError|You are not allowed to create wiki pages" -msgstr "" +msgstr "Você não tem permissão para criar páginas web" msgid "WikiHistoricalPage|This is an old version of this page." -msgstr "" +msgstr "Essa é uma versão antiga dessa página." msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." -msgstr "" +msgstr "Você pode ver o %{most_recent_link} ou navegar o %{history_link}." msgid "WikiHistoricalPage|history" -msgstr "" +msgstr "histórico" msgid "WikiHistoricalPage|most recent version" -msgstr "" +msgstr "versão mais recente" msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" -msgstr "" +msgstr "Mais exemplos em %{docs_link}" msgid "WikiMarkdownDocs|documentation" -msgstr "" +msgstr "documentação" msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" -msgstr "" +msgstr "Para criar um link para uma (nova) página, é so digitar %{link_example}" msgid "WikiNewPagePlaceholder|how-to-setup" -msgstr "" +msgstr "como instalar" msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." -msgstr "" +msgstr "Dica: Você pode especificar o caminho completo para o novo arquivo. Nós vamos criar automaticamente quaisquer diretórios ainda não existentes." msgid "WikiNewPageTitle|New Wiki Page" -msgstr "" +msgstr "Nova página Wiki" msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" -msgstr "" +msgstr "Quer mesmo apagar essa página?" msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." -msgstr "" +msgstr "Alguém editou essa página ao mesmo tempo que você. Por favor olhe %{page_link} e tenha certeza de que suas mudanças não removerão as mudanças deles." msgid "WikiPageConflictMessage|the page" -msgstr "" +msgstr "a página" msgid "WikiPageCreate|Create %{page_title}" -msgstr "" +msgstr "Criar %{page_title}" msgid "WikiPageEdit|Update %{page_title}" -msgstr "" +msgstr "Atualizar %{page_title}" msgid "WikiPage|Page slug" -msgstr "" +msgstr "Nome amigável da página" msgid "WikiPage|Write your content or drag files here..." -msgstr "" +msgstr "Escreve seu conteudo ou arraste arquivos aqui..." msgid "Wiki|Create Page" -msgstr "" +msgstr "Criar página" msgid "Wiki|Create page" -msgstr "" +msgstr "Criar página" msgid "Wiki|Edit Page" -msgstr "" +msgstr "Ediar página" msgid "Wiki|Empty page" -msgstr "" +msgstr "Página vazia" msgid "Wiki|More Pages" -msgstr "" +msgstr "Mais páginas" msgid "Wiki|New page" -msgstr "" +msgstr "Nova página" msgid "Wiki|Page history" -msgstr "" +msgstr "Histórico da página" msgid "Wiki|Page version" -msgstr "" +msgstr "Versão da página" msgid "Wiki|Pages" -msgstr "" +msgstr "Páginas" msgid "Wiki|Wiki Pages" -msgstr "" +msgstr "Páginas Wiki" msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." -msgstr "" +msgstr "Com o contribution analytics você pode ter uma visão geral da atividade em issue, merge request e evento de push para sua organização e seus membros." msgid "Withdraw Access Request" msgstr "Remover Requisição de Acesso" @@ -2145,14 +2407,26 @@ msgid "You are going to remove %{project_name_with_namespace}. Removed project C msgstr "Você irá remover %{project_name_with_namespace}. O projeto removido NÃO PODE ser restaurado! Tem certeza ABSOLUTA?" msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?" -msgstr "" +msgstr "Você está prestes a remover a relação de fork do projeto original %{forked_from_project}. Você tem CERTEZA disso?" msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Você irá transferir %{project_name_with_namespace} para outro proprietário. Tem certeza ABSOLUTA?" +msgid "You are on a read-only GitLab instance." +msgstr "Você está em uma instância somente-leitura do GitLab." + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "Você está em uma instância somente-leitura do GitLab. Se você quiser fazer qualquer alteração visite %{link_to_primary_node}." + msgid "You can only add files when you are on a branch" msgstr "Você somente pode adicionar arquivos quando estiver em um branch" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "Você não pode escrever numa instância secundária de somente leitura do GitLab Geo. Por favor use %{link_to_primary_node}." + +msgid "You cannot write to this read-only GitLab instance." +msgstr "Você não pode escrever nesta instância somente-leitura do GitLab." + msgid "You have reached your project limit" msgstr "Você atingiu o limite de seu projeto" @@ -2184,16 +2458,19 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss msgstr "Você não conseguirá fazer pull ou push no projeto via SSH até que adicione %{add_ssh_key_link} ao seu perfil" msgid "Your comment will not be visible to the public." -msgstr "" +msgstr "Seu comentário não estará visÃvel ao público." + +msgid "Your groups" +msgstr "Seus grupos" msgid "Your name" msgstr "Seu nome" msgid "Your projects" -msgstr "" +msgstr "Seus projetos" msgid "commit" -msgstr "" +msgstr "commit" msgid "day" msgid_plural "days" @@ -2211,9 +2488,15 @@ msgid_plural "parents" msgstr[0] "pai" msgstr[1] "pais" -msgid "to help your contributors communicate effectively!" -msgstr "" +msgid "password" +msgstr "senha" msgid "personal access token" -msgstr "" +msgstr "token de acesso pessoal" + +msgid "to help your contributors communicate effectively!" +msgstr "para ajudar seus contribuintes à se comunicar de maneira eficaz!" + +msgid "username" +msgstr "nome do usuário" diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po index 7e1f23178b9..2f612f46799 100644 --- a/locale/ru/gitlab.po +++ b/locale/ru/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-05 14:39-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -19,24 +19,30 @@ msgstr "" msgid "%d commit" msgid_plural "%d commits" msgstr[0] "%d коммит" -msgstr[1] "%d коммитов" +msgstr[1] "%d коммита" msgstr[2] "%d коммитов" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d Ñлой" +msgstr[1] "%d ÑлоÑ" +msgstr[2] "%d Ñлоёв" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." msgstr[0] "%s добавленный коммит был иÑключен Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." -msgstr[1] "%s добавленные коммиты были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." -msgstr[2] "%s добавленные коммиты были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[1] "%s добавленных коммита были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." +msgstr[2] "%s добавленных коммитов были иÑключены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью." msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} добавил коммит %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "%{count} учаÑтник" +msgstr[1] "%{count} учаÑтника" +msgstr[2] "%{count} учаÑтников" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "на %{number_commits_behind} коммитов позади %{default_branch}, на %{number_commits_ahead} коммитов впереди" @@ -58,20 +64,26 @@ msgstr[2] "%{storage_name}: %{failed_attempts} - неудачные попытк msgid "(checkout the %{link} for information on how to install it)." msgstr "(перейдите по ÑÑылке %{link} Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ об уÑтановке)." +msgid "+ %{moreCount} more" +msgstr "+ ещё %{moreCount}" + +msgid "- show less" +msgstr "- Ñвернуть" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "1 ÑÐ±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" -msgstr[1] "%d Ñборочных линий" +msgstr[1] "%d Ñборочных линии" msgstr[2] "%d Ñборочных линий" msgid "1st contribution!" msgstr "Первый вклад!" msgid "2FA enabled" -msgstr "" +msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°ÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°" msgid "A collection of graphs regarding Continuous Integration" -msgstr "Графики отноÑительно непрерывной интеграции (Ci)" +msgstr "Графики непрерывной интеграции (CI)" msgid "About auto deploy" msgstr "Об автоматичеÑком развёртывании" @@ -115,9 +127,18 @@ msgstr "Добавьте ключ SSH в Ñвой профиль, чтобы Ð¾Ñ msgid "Add new directory" msgstr "Добавить новый каталог" +msgid "AdminHealthPageLink|health page" +msgstr "Ñтраница работоÑпоÑобноÑти" + +msgid "Advanced settings" +msgstr "РаÑширенные наÑтройки" + msgid "All" msgstr "Ð’Ñе" +msgid "An error occurred. Please try again." +msgstr "Произошла ошибка. ПожалуйÑта, попробуйте Ñнова." + msgid "Appearance" msgstr "Оформление" @@ -131,13 +152,16 @@ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñто раÑпиÑание Ñборочной линии?" msgid "Are you sure you want to discard your changes?" -msgstr "Ð’Ñ‹ уверены, что Ð’Ñ‹ хотите отменить Ваши изменениÑ?" +msgstr "Ð’Ñ‹ уверены, что хотите отменить ваши изменениÑ?" + +msgid "Are you sure you want to leave this group?" +msgstr "Ð’Ñ‹ уверены, что хотите покинуть Ñту группу?" msgid "Are you sure you want to reset registration token?" -msgstr "" +msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот региÑтрационный токен?" msgid "Are you sure you want to reset the health check token?" -msgstr "" +msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот токен проверки работоÑпоÑобноÑти?" msgid "Are you sure?" msgstr "Ð’Ñ‹ уверены?" @@ -166,59 +190,62 @@ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ревью и msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "Включить в наÑтройках" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "Ð”Ð»Ñ Ñтого проекта может быть активирован автоматичеÑкий DevOps. Он будет автоматичеÑки Ñобирать, теÑтировать и разворачивать ваши Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове предопределенной конфигурации CI/CD." + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" -msgstr "" +msgstr "Подробнее по ÑÑылке %{link_to_documentation}" + +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "Ð’Ñ‹ можете активировать %{link_to_settings} Ð´Ð»Ñ Ñтого проекта." msgid "Billing" -msgstr "" +msgstr "Тариф" msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." -msgstr "" +msgstr "%{group_name} иÑпользует тарифный план %{plan_link}." msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "" +msgstr "ÐвтоматичеÑкое повышение или понижение недоÑтупно Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… тарифных планов в наÑтоÑщее времÑ." msgid "BillingPlans|Current plan" -msgstr "" +msgstr "Текущий тарифный план" msgid "BillingPlans|Customer Support" -msgstr "" +msgstr "Поддержка Клиентов" msgid "BillingPlans|Downgrade" -msgstr "" +msgstr "Понижение" msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}." -msgstr "" +msgstr "Узнайте больше о каждом тарифном плане прочитав наш %{faq_link}." msgid "BillingPlans|Manage plan" -msgstr "" +msgstr "Управление тарифным планом" msgid "BillingPlans|Please contact %{customer_support_link} in that case." -msgstr "" +msgstr "ПожалуйÑта, в Ñтом Ñлучае обратитеÑÑŒ в %{customer_support_link}." msgid "BillingPlans|See all %{plan_name} features" -msgstr "" +msgstr "ПоÑмотреть возможноÑти %{plan_name} полноÑтью" msgid "BillingPlans|This group uses the plan associated with its parent group." -msgstr "" +msgstr "Ðта группа иÑпользует тарифный план ÑвÑзанный Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой группой." msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." -msgstr "" +msgstr "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ñ€Ð¸Ñ„Ð½Ñ‹Ð¼ планом Ñтой группы поÑетите раздел тарификации %{parent_billing_page_link}." msgid "BillingPlans|Upgrade" -msgstr "" +msgstr "Повышение" msgid "BillingPlans|You are currently on the %{plan_link} plan." -msgstr "" +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ иÑпользуете тарифный план %{plan_link}." msgid "BillingPlans|frequently asked questions" msgstr "ЧаÑто задаваемые вопроÑÑ‹" @@ -227,7 +254,7 @@ msgid "BillingPlans|monthly" msgstr "ежемеÑÑчно" msgid "BillingPlans|paid annually at %{price_per_year}" -msgstr "" +msgstr "оплачиваетÑÑ ÐµÐ¶ÐµÐ³Ð¾Ð´Ð½Ð¾ в размере %{price_per_year}" msgid "BillingPlans|per user" msgstr "за пользователÑ" @@ -239,7 +266,10 @@ msgstr[1] "Ветки" msgstr[2] "Ветки" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" -msgstr "Ветка <strong>%{branch_name}</strong> Ñоздана. Ð”Ð»Ñ Ð½Ð°Ñтройки автоматичеÑкого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ Yaml-шаблон Ð´Ð»Ñ GitLab CI и зафикÑируйте Ñвои изменениÑ. %{link_to_autodeploy_doc}" +msgstr "Ветка <strong>%{branch_name}</strong> Ñоздана. Ð”Ð»Ñ Ð½Ð°Ñтройки автоматичеÑкого Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±ÐµÑ€Ð¸Ñ‚Ðµ YAML-шаблон Ð´Ð»Ñ GitLab CI и зафикÑируйте Ñвои изменениÑ. %{link_to_autodeploy_doc}" + +msgid "Branch has changed" +msgstr "Ветка была изменена" msgid "BranchSwitcherPlaceholder|Search branches" msgstr "ПоиÑк веток" @@ -365,7 +395,7 @@ msgid "Cancel edit" msgstr "Отменить редактирование" msgid "Change Weight" -msgstr "" +msgstr "Изменить ВеÑ" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Выбрать в ветке" @@ -392,10 +422,10 @@ msgid "Cherry-pick this commit" msgstr "Подобрать в Ñтом коммите" msgid "Cherry-pick this merge request" -msgstr "Побрать в Ñтом запроÑе на ÑлиÑние" +msgstr "Подобрать Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all." -msgstr "" +msgstr "Выберите группы, которые хотите Ñкопировать на вторичный узел. ОÑтавьте пуÑтым Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ðµ вÑего." msgid "CiStatusLabel|canceled" msgstr "отменено" @@ -451,134 +481,146 @@ msgstr "пропущено" msgid "CiStatus|running" msgstr "выполнÑетÑÑ" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "CircuitBreaker API" + msgid "Clone repository" -msgstr "" +msgstr "Клонировать репозиторий" msgid "Close" msgstr "Закрыть" +msgid "Cluster" +msgstr "КлаÑтер" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" -msgstr "" +msgstr "%{link_to_container_project} должен быть Ñоздан под Ñтой учетной запиÑью" + +msgid "ClusterIntegration|Cluster details" +msgstr "Параметры клаÑтера" msgid "ClusterIntegration|Cluster integration" -msgstr "" +msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтеров" msgid "ClusterIntegration|Cluster integration is disabled for this project." -msgstr "" +msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтеров отключена Ð´Ð»Ñ Ñтого проекта." msgid "ClusterIntegration|Cluster integration is enabled for this project." -msgstr "" +msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтеров включена Ð´Ð»Ñ Ñтого проекта." msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "Ð”Ð»Ñ Ñтого проекта включена Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтеров. Отключение интеграции не повлиÑет на клаÑтер, но Ñоединение Ñ GitLab будет временно отключено." msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." -msgstr "" +msgstr "СоздаетÑÑ ÐºÐ»Ð°Ñтер в Google Container Engine..." msgid "ClusterIntegration|Cluster name" -msgstr "" +msgstr "Ðазвание клаÑтера" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" -msgstr "" +msgstr "КлаÑтер был уÑпешно Ñоздан в Google Container Engine" msgid "ClusterIntegration|Copy cluster name" -msgstr "" +msgstr "Копировать название клаÑтера" msgid "ClusterIntegration|Create cluster" -msgstr "" +msgstr "Создать клаÑтер" msgid "ClusterIntegration|Create new cluster on Google Container Engine" -msgstr "" +msgstr "Создать новый клаÑтер в Google Container Engine" msgid "ClusterIntegration|Enable cluster integration" -msgstr "" +msgstr "Включить интеграцию Ñ ÐºÐ»Ð°Ñтерами" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "Идентификатор проекта в Google Cloud Platform" msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Google Container Engine project" -msgstr "" - -msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Проект Google Container Engine" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" +msgstr "Узнайте больше на %{link_to_documentation}" -msgid "ClusterIntegration|See machine types" -msgstr "" +msgid "ClusterIntegration|Machine type" +msgstr "Тип машины" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" -msgstr "" +msgstr "УбедитеÑÑŒ, что ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ %{link_to_requirements} Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ñтеров" + +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "Управление интеграцией клаÑтера на вашем проекте Gitlab" msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" -msgstr "" +msgstr "УправлÑйте клаÑтером, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð¿Ð¾ ÑÑылке %{link_gke}" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "КоличеÑтво узлов" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "ПожалуйÑта, убедитеÑÑŒ, что ваш аккаунт Google отвечает Ñледующим требованиÑм:" msgid "ClusterIntegration|Project namespace (optional, unique)" -msgstr "" +msgstr "ПроÑтранÑтво имен проекта (необÑзательное, уникальное)" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "Прочтите нашу документацию %{link_to_help_page} по интеграции клаÑтера." msgid "ClusterIntegration|Remove cluster integration" -msgstr "" +msgstr "Удалить интеграцию Ñ ÐºÐ»Ð°Ñтером" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "Удалить интеграцию" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." -msgstr "" +msgstr "При удалении интеграции Ñ ÐºÐ»Ð°Ñтером будет удалена ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтера, которую вы добавили в Ñтот проект. Данное дейÑтвие не удалит Ñам проект." -msgid "ClusterIntegration|Save changes" -msgstr "" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "ПроÑмотреть и отредактировать параметры Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ клаÑтера" + +msgid "ClusterIntegration|See machine types" +msgstr "См. типы машин" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "См. ваши проекты" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "См. зоны" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" +msgstr " У Ð½Ð°Ñ Ñ‡Ñ‚Ð¾-то пошло не так." -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" +msgstr "Что-то пошло не так во Ð²Ñ€ÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ñтера в Google Container Engine" msgid "ClusterIntegration|Toggle Cluster" -msgstr "" - -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" +msgstr "Переключить КлаÑтер" msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "ЕÑли привÑзать клаÑтер к Ñтому проекту, вы Ñ Ð»Ñ‘Ð³ÐºÐ¾Ñтью Ñможете иÑпользовать Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€ÐµÐ²ÑŒÑŽ, развертывать ваши приложениÑ, запуÑкать Ñборочные линии и многое другое." msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" -msgstr "" +msgstr "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна иметь %{link_to_container_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "Зона" msgid "ClusterIntegration|access to Google Container Engine" -msgstr "" +msgstr "доÑтуп к Google Container Engine" msgid "ClusterIntegration|cluster" -msgstr "" +msgstr "клаÑтер" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "Ñтраница Ñправки" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "отвечает требованиÑм" msgid "ClusterIntegration|properly configured" -msgstr "" +msgstr "правильно наÑтроен" msgid "Comments" msgstr "Комментарии" @@ -589,8 +631,14 @@ msgstr[0] "Коммит" msgstr[1] "Коммиты" msgstr[2] "Коммиты" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "ЗафикÑировать %d файл" +msgstr[1] "ЗафикÑировать %d файла" +msgstr[2] "ЗафикÑировать %d файлов" + msgid "Commit Message" -msgstr "" +msgstr "ОпиÑание Коммита" msgid "Commit duration in minutes for last 30 commits" msgstr "ПродолжительноÑÑ‚ÑŒ поÑледних 30 коммитов в минутах" @@ -602,7 +650,7 @@ msgid "CommitBoxTitle|Commit" msgstr "Коммит" msgid "CommitMessage|Add %{file_name}" -msgstr "Добавлен %{file_name}" +msgstr "Добавить %{file_name}" msgid "Commits" msgstr "Коммиты" @@ -620,49 +668,49 @@ msgid "Compare" msgstr "Сравнить" msgid "Container Registry" -msgstr "" +msgstr "РееÑÑ‚Ñ€ Контейнеров" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "Создан" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" -msgstr "" +msgstr "Сначала авторизуйтеÑÑŒ в рееÑтре контейнеров GitLab, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñвои Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ %{link_2fa}, вам необходимо иÑпользовать %{link_token}:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "GitLab поддерживает до трех уровней имён образов. Следующие примеры имён образов подходÑÑ‚ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ проекта:" msgid "ContainerRegistry|How to use the Container Registry" -msgstr "" +msgstr "Как иÑпользовать РееÑÑ‚Ñ€ Контейнеров" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "Узнайте больше" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "Ð’ рееÑтре контейнеров нет тегов Ð´Ð»Ñ Ñтого образа." msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "ПоÑле того, как вы вошли в ÑиÑтему, вы можете Ñоздать или загрузить образ контейнера, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð±Ñ‰Ð¸Ðµ команды %{build} и %{push}" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "Удалить репозиторий" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "Удалить тег" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "Размер" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "Тег" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "Идентификатор Тега" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "ИÑпользовать различные имена образов" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." -msgstr "" +msgstr "Когда рееÑÑ‚Ñ€ контейнеров Docker интегрирован Ñ GitLab, каждый проект может иметь Ñвое ÑобÑтвенное проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ Docker образов." msgid "Contribution guide" msgstr "РуководÑтво учаÑтника" @@ -670,6 +718,12 @@ msgstr "РуководÑтво учаÑтника" msgid "Contributors" msgstr "УчаÑтники" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "Контролировать макÑимальное количеÑтво потоков фоновой загрузки LFS/вложений Ð´Ð»Ñ Ñтого вторичного узла" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "Контролировать макÑимальное количеÑтво потоков фоновой загрузки хранилища Ð´Ð»Ñ Ñтого вторичного узла" + msgid "Copy SSH public key to clipboard" msgstr "Скопировать публичный ключ SSH в буфер обмена" @@ -691,9 +745,21 @@ msgstr "Создать каталог" msgid "Create empty bare repository" msgstr "Создать пуÑтой репозиторий" +msgid "Create file" +msgstr "Создать файл" + msgid "Create merge request" msgstr "Создать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgid "Create new branch" +msgstr "Создать новую ветку" + +msgid "Create new directory" +msgstr "Создать новый каталог" + +msgid "Create new file" +msgstr "Создать новый файл" + msgid "Create new..." msgstr "Ðовый" @@ -713,7 +779,7 @@ msgid "Cron syntax" msgstr "СинтакÑÐ¸Ñ Cron" msgid "Custom notification events" -msgstr " ÐаÑтраиваемые ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобытиÑÑ…" +msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ð°Ñтраиваемых уведомлений" msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}." msgstr "ÐаÑтраиваемые уровни уведомлений аналогичны уровню уведомлений в ÑоответÑтвии Ñ ÑƒÑ‡Ð°Ñтием. С наÑтраиваемыми уровнÑми уведомлений вы также будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ выбранных ÑобытиÑÑ…. Чтобы узнать больше, поÑмотрите %{notification_link}." @@ -746,10 +812,10 @@ msgid "CycleAnalyticsStage|Test" msgstr "ТеÑтирование" msgid "DashboardProjects|All" -msgstr "" +msgstr "Ð’Ñе" msgid "DashboardProjects|Personal" -msgstr "" +msgstr "Личные" msgid "Define a custom pattern with cron syntax" msgstr "Определить наÑтраиваемый шаблон Ñ ÑинтакÑиÑом cron" @@ -781,8 +847,11 @@ msgstr "Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°" msgid "Discard changes" msgstr "Отменить изменениÑ" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "Отключить блок Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ðналитику Цикла" + msgid "Dismiss Merge Request promotion" -msgstr "" +msgstr "Отключить анонÑÑ‹ Ð´Ð»Ñ Ð—Ð°Ð¿Ñ€Ð¾Ñов на СлиÑние" msgid "Don't show again" msgstr "Ðе показывать Ñнова" @@ -848,17 +917,23 @@ msgid "Every month (on the 1st at 4:00am)" msgstr "ЕжемеÑÑчно (каждое 1-е чиÑло в 4:00)" msgid "Every week (Sundays at 4:00am)" -msgstr "Еженедельно (по воÑкреÑениÑми в 4:00)" +msgstr "Еженедельно (по воÑкреÑениÑм в 4:00)" msgid "Explore projects" msgstr "Обзор проектов" +msgid "Explore public groups" +msgstr "ИÑÑледовать публичные группы" + msgid "Failed to change the owner" msgstr "Ðе удалоÑÑŒ изменить владельца" msgid "Failed to remove the pipeline schedule" msgstr "Ðе удалоÑÑŒ удалить раÑпиÑание Ñборочной линии" +msgid "File name" +msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" + msgid "Files" msgstr "Файлы" @@ -875,7 +950,7 @@ msgid "FirstPushedBy|First" msgstr "Первый" msgid "FirstPushedBy|pushed by" -msgstr "" +msgstr "отправлено автором" msgid "Fork" msgid_plural "Forks" @@ -890,7 +965,7 @@ msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)" msgstr "Ответвление от %{project_name} (удалено)" msgid "Format" -msgstr "" +msgstr "Формат" msgid "From issue creation until deploy to production" msgstr "От ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ в рабочей Ñреде" @@ -902,13 +977,19 @@ msgid "GPG Keys" msgstr "GPG Ключи" msgid "Geo Nodes" -msgstr "" +msgstr "ГеографичеÑкие Узлы" + +msgid "Geo|File sync capacity" +msgstr "Объем хранилища Ð´Ð»Ñ Ñинхронизации файлов" msgid "Geo|Groups to replicate" -msgstr "" +msgstr "Группы Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸" + +msgid "Geo|Repository sync capacity" +msgstr "Объем хранилища Ð´Ð»Ñ Ñинхронизации репозиториÑ" msgid "Geo|Select groups to replicate." -msgstr "" +msgstr "Выберите группы Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸." msgid "Git storage health information has been reset" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑтабильноÑти Git хранилища была Ñброшена" @@ -923,31 +1004,76 @@ msgid "GoToYourFork|Fork" msgstr "Ответвление" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Google не %{link_to_documentation}. ПопроÑите Ñвоего админиÑтратора GitLab, еÑли вы хотите воÑпользоватьÑÑ Ñтим ÑервиÑом." msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" -msgstr "" +msgstr "Запретить публикацию проектов из %{group} в других группах" msgid "GroupSettings|Share with group lock" -msgstr "" +msgstr "Опубликовать Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ блокировкой" msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." -msgstr "" +msgstr "Ðта наÑтройка применена в %{ancestor_group} и была переопределена в Ñтой подгруппе." msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Ðта наÑтройка применена в %{ancestor_group}. Чтобы поделитьÑÑ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°Ð¼Ð¸ из Ñтой группы Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ группами, запроÑите у владельца переопределить Ñту наÑтройку или %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Ðта наÑтройка применена в %{ancestor_group}. Ð’Ñ‹ можете переопределить Ñту наÑтройку или %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." -msgstr "" +msgstr "Ðта наÑтройка будет применена Ð´Ð»Ñ Ð²Ñех подгрупп еÑли не будет переопределена владельцем группы. Группы которые уже имеют доÑтуп к проекту, будут иметь его и дальше пока не будут удалены вручную." msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" -msgstr "" +msgstr "не может быть отменена до тех пор пока группа \"ПоделитьÑÑ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ блокировкой\" включена, за иÑключением владельца группы родителÑ" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" -msgstr "" +msgstr "удалить возможноÑÑ‚ÑŒ поделитьÑÑ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ блокировкой из %{ancestor_group_name}" + +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "Группа - Ñто набор из неÑкольких проектов." + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "При размещении проектов в группе, группа выполнÑет функции папки." + +msgid "GroupsEmptyState|No groups found" +msgstr "Группы не найдены" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "Ð’Ñ‹ можете управлÑÑ‚ÑŒ правами и доÑтупом учаÑтников вашей группы к каждому проекту в группе." + +msgid "GroupsTreeRole|as" +msgstr "как" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "Ð’Ñ‹ уверены, что вы хотите покинуть группу \"${this.group.fullName}\"?" + +msgid "GroupsTree|Create a project in this group." +msgstr "Создать проект в Ñтой группе." + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "Создать подгруппу в Ñтой группе." + +msgid "GroupsTree|Edit group" +msgstr "Редактировать группу" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "Ðе удалоÑÑŒ покинуть группу. ПожалуйÑта, убедитеÑÑŒ, что вы не единÑтвенный владелец." + +msgid "GroupsTree|Filter by name..." +msgstr "Фильтр по имени..." + +msgid "GroupsTree|Leave this group" +msgstr "Покинуть Ñту группу" + +msgid "GroupsTree|Loading groups" +msgstr "Загрузка групп" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "К Ñожалению, по вашему запроÑу групп не найдено" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "К Ñожалению, по вашему запроÑу групп или проектов не найдено" msgid "Health Check" msgstr "Проверка работоÑпоÑобноÑти" @@ -968,7 +1094,7 @@ msgid "HealthCheck|Unhealthy" msgstr "ÐеÑтабильный" msgid "History" -msgstr "" +msgstr "ИÑториÑ" msgid "Housekeeping successfully started" msgstr "ОчиÑтка уÑпешно запущена" @@ -980,7 +1106,7 @@ msgid "Improve Issue boards with GitLab Enterprise Edition." msgstr "Улучшить доÑки обÑуждений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ верÑии GitLab Enterprise Edition." msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." -msgstr "" +msgstr "Улучшить управление обÑуждениÑми Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐµÑа обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ помощи GitLab Enterprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgstr "Улучшить поиÑк при помощи РаÑширенного Глобального ПоиÑка в верÑии GitLab Enterprise Edition." @@ -994,6 +1120,12 @@ msgstr[0] "ÐкземплÑÑ€" msgstr[1] "ÐкземплÑры" msgstr[2] "ÐкземплÑры" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "Внутренний - Группу и включённые в неё проекты может видеть любой зарегиÑтрированный пользователь." + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "Внутренний - Проект доÑтупен любому зарегиÑтрированному пользователю." + msgid "Interval Pattern" msgstr "Шаблон интервала" @@ -1040,16 +1172,16 @@ msgid "Last commit" msgstr "ПоÑледний коммит" msgid "Last edited %{date}" -msgstr "" +msgstr "Дата поÑледнего изменениÑ: %{date}" msgid "Last edited by %{name}" -msgstr "" +msgstr "Ðвтор поÑледнего изменениÑ: %{name}" msgid "Last update" -msgstr "" +msgstr "ПоÑледнее обновление" msgid "Last updated" -msgstr "" +msgstr "ПоÑледний раз обновлено" msgid "LastPushEvent|You pushed to" msgstr "Ð’Ñ‹ отправили в" @@ -1063,6 +1195,9 @@ msgstr "Узнайте больше в" msgid "Learn more in the|pipeline schedules documentation" msgstr "Подробнее в|документации по раÑпиÑаниÑм Ñборочных линий" +msgid "Leave" +msgstr "Покинуть" + msgid "Leave group" msgstr "Покинуть группу" @@ -1074,21 +1209,27 @@ msgstr "ЛицензиÑ" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Показывать %d Ñобытие макÑимум" +msgstr[1] "Показывать %d ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¼Ð°ÐºÑимум" +msgstr[2] "Показывать %d Ñобытий макÑимум" msgid "Lock" -msgstr "" +msgstr "Блокировка" msgid "Locked" -msgstr "" +msgstr "Заблокировано" msgid "Locked Files" msgstr "Заблокированные Файлы" +msgid "Login" +msgstr "Войти" + +msgid "Maximum git storage failures" +msgstr "МакÑимальное количеÑтво Ñбоев хранилища git" + msgid "Median" -msgstr "" +msgstr "Среднее" msgid "Members" msgstr "УчаÑтники" @@ -1117,11 +1258,14 @@ msgstr "Больше информации доÑтупно|тут" msgid "Multiple issue boards" msgstr "Сводные доÑки задач" +msgid "New Cluster" +msgstr "Ðовый КлаÑтер" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Ðовое ОбÑуждение" -msgstr[1] "Ðовые ОбращениÑ" -msgstr[2] "Ðовые ОбращениÑ" +msgstr[1] "Ðовых ОбÑуждениÑ" +msgstr[2] "Ðовых ОбÑуждений" msgid "New Pipeline Schedule" msgstr "Ðовое РаÑпиÑание Сборочной Линии" @@ -1135,23 +1279,32 @@ msgstr "Ðовый каталог" msgid "New file" msgstr "Ðовый файл" +msgid "New group" +msgstr "ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" + msgid "New issue" msgstr "Ðовое обÑуждение" msgid "New merge request" msgstr "Ðовый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgid "New project" +msgstr "Ðовый проект" + msgid "New schedule" msgstr "Ðовое раÑпиÑание" msgid "New snippet" -msgstr "" +msgstr "Ðовый фрагмент" + +msgid "New subgroup" +msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð³Ñ€ÑƒÐ¿Ð¿Ð°" msgid "New tag" msgstr "Ðовый тег" msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" +msgstr "Ðет образов контейнеров Ð´Ð»Ñ Ñтого проекта. Добавьте образ, ÑÐ»ÐµÐ´ÑƒÑ Ð¸Ð½ÑтрукциÑм выше." msgid "No repository" msgstr "Ðет репозиториÑ" @@ -1160,7 +1313,7 @@ msgid "No schedules" msgstr "Ðет раÑпиÑаний" msgid "None" -msgstr "" +msgstr "ПуÑто" msgid "Not available" msgstr "ÐедоÑтупно" @@ -1181,7 +1334,7 @@ msgid "NotificationEvent|Failed pipeline" msgstr "Ðеудача в Ñборочной линии" msgid "NotificationEvent|Merge merge request" -msgstr "" +msgstr "Влит Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "NotificationEvent|New issue" msgstr "Ðовое обÑуждение" @@ -1196,7 +1349,7 @@ msgid "NotificationEvent|Reassign issue" msgstr "Переназначить обÑуждение" msgid "NotificationEvent|Reassign merge request" -msgstr "Переназначить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" +msgstr "Переназначен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "NotificationEvent|Reopen issue" msgstr "Переоткрыть обÑуждение" @@ -1225,17 +1378,23 @@ msgstr "ОтÑлеживать" msgid "Notifications" msgstr "УведомлениÑ" +msgid "Number of access attempts" +msgstr "КоличеÑтво попыток доÑтупа" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Фильтр" msgid "Only project members can comment." -msgstr "" +msgstr "Только учаÑтники проекта могут оÑтавлÑÑ‚ÑŒ комментарии." msgid "OpenedNDaysAgo|Opened" msgstr "Открыто" msgid "Opens in a new window" -msgstr "" +msgstr "ОткроетÑÑ Ð² новом окне" msgid "Options" msgstr "ÐаÑтройки" @@ -1247,28 +1406,28 @@ msgid "Owner" msgstr "Владелец" msgid "Pagination|Last »" -msgstr "" +msgstr "ПоÑледнÑÑ Â»" msgid "Pagination|Next" -msgstr "" +msgstr "СледующаÑ" msgid "Pagination|Prev" -msgstr "" +msgstr "ПредыдущаÑ" msgid "Pagination|« First" -msgstr "" +msgstr "« ПерваÑ" msgid "Password" msgstr "Пароль" msgid "People without permission will never get a notification and won\\'t be able to comment." -msgstr "" +msgstr "Люди без разрешений не получат уведомление и не Ñмогут комментировать." msgid "Pipeline" msgstr "Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ" msgid "Pipeline Health" -msgstr "Жизненный цикл конвейера" +msgstr "РаботоÑпоÑобноÑÑ‚ÑŒ Сборочной Линии" msgid "Pipeline Schedule" msgstr "РаÑпиÑание Сборочной Линии" @@ -1366,9 +1525,54 @@ msgstr "Ñо ÑтадиÑми" msgid "Preferences" msgstr "ПредпочтениÑ" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "Приватный - ДоÑтуп к проекту должен предоÑтавлÑÑ‚ÑŒÑÑ Ñвно каждому пользователю." + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "ÐŸÑ€Ð¸Ð²Ð°Ñ‚Ð½Ð°Ñ - Группу и включённые в неё проекты могут видеть только члены группы." + msgid "Profile" msgstr "Профиль" +msgid "Profiles|Account scheduled for removal." +msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ запланирована к удалению." + +msgid "Profiles|Delete Account" +msgstr "Удалить Учетную запиÑÑŒ" + +msgid "Profiles|Delete account" +msgstr "Удалить учетную запиÑÑŒ" + +msgid "Profiles|Delete your account?" +msgstr "Удалить Ñвою учетную запиÑÑŒ?" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "Удаление учетной запиÑи приведет к Ñледующим поÑледÑтвиÑм:" + +msgid "Profiles|Invalid password" +msgstr "Ðеверный пароль" + +msgid "Profiles|Invalid username" +msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "Введите значение %{confirmationValue} Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:" + +msgid "Profiles|You don't have access to delete this user." +msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на удаление Ñтого пользователÑ." + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "Перед удалением учётной запиÑи, вам необходимо передать право Ð²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ удалить Ñти группы." + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ ÑвлÑетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñледующих групп:" + +msgid "Profiles|your account" +msgstr "ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "Проект '%{project_name}' находитÑÑ Ð² процеÑÑе удалениÑ." + msgid "Project '%{project_name}' queued for deletion." msgstr "Проект '%{project_name}' добавлен в очередь на удаление." @@ -1378,9 +1582,6 @@ msgstr "Проект '%{project_name}' уÑпешно Ñоздан." msgid "Project '%{project_name}' was successfully updated." msgstr "Проект '%{project_name}' уÑпешно обновлен." -msgid "Project '%{project_name}' will be deleted." -msgstr "Проект '%{project_name}' удален." - msgid "Project access must be granted explicitly to each user." msgstr "ДоÑтуп к проекту должен предоÑтавлÑÑ‚ÑŒÑÑ Ñвно каждому пользователю." @@ -1424,22 +1625,28 @@ msgid "ProjectNetworkGraph|Graph" msgstr "Граф" msgid "ProjectSettings|Contact an admin to change this setting." -msgstr "" +msgstr "ОбратитеÑÑŒ к админиÑтратору Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтой наÑтройки." msgid "ProjectSettings|Only signed commits can be pushed to this repository." -msgstr "" +msgstr "Только подпиÑанные коммиты могут быть помещены в Ñтот репозиторий." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." -msgstr "" +msgstr "Ðта наÑтройка применÑетÑÑ Ð½Ð° уровне Ñервера и может быть переопределена админиÑтратором." msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." -msgstr "" +msgstr "Ðта наÑтройка применÑетÑÑ Ð½Ð° уровне Ñервера, но была переопределена Ð´Ð»Ñ Ñтого проекта." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "Ðта наÑтройка будет применена Ð´Ð»Ñ Ð²Ñех проектов, еÑли иное поведение не переопределено админиÑтратором." + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgstr "" +msgid "Projects" +msgstr "Проекты" + msgid "ProjectsDropdown|Frequently visited" -msgstr "" +msgstr "ЧаÑто поÑещаемые" msgid "ProjectsDropdown|Loading projects" msgstr "Загрузка проектов" @@ -1451,7 +1658,7 @@ msgid "ProjectsDropdown|Search your projects" msgstr "ПоиÑк по вашим проектам" msgid "ProjectsDropdown|Something went wrong on our end." -msgstr "" +msgstr "У Ð½Ð°Ñ Ñ‡Ñ‚Ð¾-то пошло не так." msgid "ProjectsDropdown|Sorry, no projects matched your search" msgstr "К Ñожалению, по вашему запроÑу проекты не найдены" @@ -1459,12 +1666,21 @@ msgstr "К Ñожалению, по вашему запроÑу проекты Ð msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Ðта функциональноÑÑ‚ÑŒ требует поддержки localStorage в вашем браузере" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "Публичный - Группу и включённые в неё проекты могут видеть вÑе, без какой-либо проверки подлинноÑти." + +msgid "Public - The project can be accessed without any authentication." +msgstr "Публичный - ДоÑтуп к проекту возможен без какой-либо проверки подлинноÑти." + msgid "Push Rules" -msgstr "" +msgstr "Правила Отправки" msgid "Push events" msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "Подробнее" @@ -1478,7 +1694,7 @@ msgid "RefSwitcher|Tags" msgstr "Теги" msgid "Registry" -msgstr "" +msgstr "РееÑÑ‚Ñ€" msgid "Related Commits" msgstr "СвÑзанные коммиты" @@ -1493,10 +1709,10 @@ msgid "Related Jobs" msgstr "СвÑзанные задачи" msgid "Related Merge Requests" -msgstr "СвÑзанные запроÑÑ‹ на ÑлиÑние" +msgstr "СвÑзанные ЗапроÑÑ‹ на СлиÑние" msgid "Related Merged Requests" -msgstr "СвÑзанные объединенные запроÑÑ‹" +msgstr "СвÑзанные Влитые ЗапроÑÑ‹" msgid "Remind later" msgstr "Ðапомнить позже" @@ -1520,7 +1736,7 @@ msgid "Reset runners registration token" msgstr "СброÑить ключ региÑтрации Gitlab Runners" msgid "Revert this commit" -msgstr "Отменить Ñто изменение" +msgstr "Отменить Ñто коммит" msgid "Revert this merge request" msgstr "Отменить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" @@ -1528,8 +1744,11 @@ msgstr "Отменить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "SSH Keys" msgstr "SSH Ключи" +msgid "Save" +msgstr "Сохранить" + msgid "Save changes" -msgstr "" +msgstr "Сохранить изменениÑ" msgid "Save pipeline schedule" msgstr "Сохранить раÑпиÑание Ñборочной лини" @@ -1538,7 +1757,7 @@ msgid "Schedule a new pipeline" msgstr "РаÑпиÑание новой Ñборочной линии" msgid "Schedules" -msgstr "" +msgstr "РаÑпиÑаниÑ" msgid "Scheduling Pipelines" msgstr "Планирование Сборочных Линий" @@ -1546,6 +1765,15 @@ msgstr "Планирование Сборочных Линий" msgid "Search branches and tags" msgstr "Ðайти ветки и теги" +msgid "Seconds before reseting failure information" +msgstr "Секунд до очиÑтки информации о ÑбоÑÑ…" + +msgid "Seconds to wait after a storage failure" +msgstr "Секунд задержки поÑле ÑÐ±Ð¾Ñ Ð² хранилище" + +msgid "Seconds to wait for a storage access attempt" +msgstr "Секунд задержки между попытками доÑтупа к хранилищу" + msgid "Select Archive Format" msgstr "Выбрать формат архива" @@ -1571,16 +1799,16 @@ msgid "Set up auto deploy" msgstr "ÐаÑтройка автоматичеÑкого развертываниÑ" msgid "SetPasswordToCloneLink|set a password" -msgstr "уÑтановить пароль" +msgstr "уÑтановите пароль" msgid "Settings" msgstr "ÐаÑтройки" msgid "Show parent pages" -msgstr "" +msgstr "Показать родительÑкие Ñтраницы" msgid "Show parent subgroups" -msgstr "" +msgstr "Показать родительÑкие подгруппы" msgid "Showing %d event" msgid_plural "Showing %d events" @@ -1592,16 +1820,19 @@ msgid "Snippets" msgstr "Сниппеты" msgid "Something went wrong on our end." -msgstr "" +msgstr "У Ð½Ð°Ñ Ñ‡Ñ‚Ð¾-то пошло не так." + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "Что-то пошло не так при попытке Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑоÑтоÑÐ½Ð¸Ñ Ñтого ${this.issuableDisplayName(this.issuableType)}" msgid "Something went wrong while fetching the projects." -msgstr "" +msgstr "Что-то пошло не так при получении проектов." msgid "Something went wrong while fetching the registry list." -msgstr "" +msgstr "Что-то пошло не так при получении ÑпиÑка рееÑтров." -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "" +msgid "Sort by" +msgstr "Сортировать по" msgid "SortOptions|Access level, ascending" msgstr "Уровень доÑтупа, по возраÑтанию" @@ -1679,7 +1910,7 @@ msgid "SortOptions|Oldest sign in" msgstr "Старейшие из заходивших" msgid "SortOptions|Oldest updated" -msgstr "" +msgstr "Старейших из обновленных" msgid "SortOptions|Popularity" msgstr "ПопулÑронÑÑ‚ÑŒ" @@ -1712,7 +1943,7 @@ msgid "StarProject|Star" msgstr "Отметить" msgid "Starred projects" -msgstr "" +msgstr "Отмеченные проекты" msgid "Start a %{new_merge_request} with these changes" msgstr "Ðачать %{new_merge_request} Ñ Ñтих изменений" @@ -1720,11 +1951,17 @@ msgstr "Ðачать %{new_merge_request} Ñ Ñтих изменений" msgid "Start the Runner!" msgstr "ЗапуÑтить GitLab Runner!" +msgid "Subgroups" +msgstr "Подгруппы" + +msgid "Subscribe" +msgstr "ПодпиÑатьÑÑ" + msgid "Switch branch/tag" msgstr "Переключить ветка/тег" msgid "System Hooks" -msgstr "" +msgstr "СиÑтемные Обработчики" msgid "Tag" msgid_plural "Tags" @@ -1742,13 +1979,16 @@ msgid "Team" msgstr "Команда" msgid "Thanks! Don't show me this again" -msgstr "" +msgstr "СпаÑибо! Больше не показывайте мне Ñто Ñообщение" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." -msgstr "" +msgstr "РаÑширенный глобальный поиÑк в GitLab - Ñто Ñерьезный инÑтрумент который Ñокращает ваше времÑ. ВмеÑто ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÑƒÐ±Ð»Ð¸Ñ€ÑƒÑŽÑ‰ÐµÐ³Ð¾ кода и траты времени, вы можете иÑкать код внутри других команд, который поможет вам в вашем проекте." + +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "Порог ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¡ircuitBreaker должен быть меньше, чем порог ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑбоÑ" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." -msgstr "Ðа Ñтапе напиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° показывает Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ коммита до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. Данные автоматичеÑки добавÑÑ‚ÑÑ Ð¿Ð¾Ñле того, как вы Ñоздать Ñвой первый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние." +msgstr "Ðтап напиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° показывает Ð²Ñ€ÐµÐ¼Ñ Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ коммита до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. Данные автоматичеÑки добавÑÑ‚ÑÑ Ñюда поÑле того, как вы Ñоздать Ñвой первый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние." msgid "The collection of events added to the data gathered for that stage." msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñобытий добавленных в данные Ñобранные Ð´Ð»Ñ Ñтого Ñтапа." @@ -1759,6 +1999,15 @@ msgstr "СвÑзь Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ удалена." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "Ð¡Ñ‚Ð°Ð´Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ времÑ, которое потребуетÑÑ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ñуждению вехи, или Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° вашу доÑку задач. Ðачните Ñоздавать обÑуждениÑ, чтобы увидеть ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтой Ñтадии." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "КоличеÑтво попыток, которые GitLab будет предпринимать Ð´Ð»Ñ Ð´Ð¾Ñтупа к хранилищу." + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "КоличеÑтво ошибок, поÑле которого GitLab начнёт временно отключать доÑтуп к шарду хранилища на хоÑте" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "КоличеÑтво Ñбоев, поÑле которого Gitlab полноÑтью прекратит доÑтуп к хранилищу. Изменение Ñчётчика \"количеÑтво Ñбоев\" может быть произведено через админиÑтративный интерфейÑ: %{link_to_health_page} или при помощи API %{api_documentation_link}." + msgid "The phase of the development lifecycle." msgstr "Фаза жизненного цикла разработки." @@ -1766,7 +2015,7 @@ msgid "The pipelines schedule runs pipelines in the future, repeatedly, for spec msgstr "РаÑпиÑание Ñборочных линий регулÑрно запуÑкает Ñборочные линии Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… ветвей или тегов. Запланированные Ñборочные линии наÑледуют Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° доÑтуп к проекту на оÑнове ÑвÑзанного Ñ Ð½Ð¸Ð¼Ð¸ пользователÑ." msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." -msgstr "Ðа Ñтапе Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ предыдущего шага до Ð¿Ñ€Ð¾Ñ‚Ð°Ð»ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ коммита. ДобавлÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, как только проталкиваете Ñвой первый коммит." +msgstr "Ðтап Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ предыдущего шага до отправки первого коммита. ДобавлÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, как только отправите Ñвой первый коммит." msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." msgstr "ПроизводÑтвенный Ñтап показывает общее Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñозданием обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸ развертыванием кода в продуктивной Ñреде. Данные будут автоматичеÑки добавлены поÑле полного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ¸." @@ -1789,6 +2038,12 @@ msgstr "Ðтап поÑтановки показывает Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "Ðтап теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ времÑ, которое GitLab CI занимает Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка каждой Ñборочной линии Ð´Ð»Ñ ÑоответÑтвующего запроÑа на ÑлиÑние. Данные будут автоматичеÑки добавлены поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ вашей первой Ñборочной линии." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого GitLab будет хранить информацию о ÑбоÑÑ…. ЕÑли в течение Ñтого времени не было Ñбоев, Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ монтировании очищаетÑÑ." + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах в течении которого GitLab будет пытатьÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к хранилищу. ПоÑле Ñтого времени будет зафикÑирована ошибка Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ожиданиÑ." + msgid "The time taken by each data entry gathered by that stage." msgstr "ВремÑ, затраченное каждым Ñлементом, Ñобранным на Ñтом Ñтапе." @@ -1798,11 +2053,14 @@ msgstr "Среднее значение в Ñ€Ñду. Пример: между 3, msgid "There are problems accessing Git storage: " msgstr "Проблемы Ñ Ð´Ð¾Ñтупом к Git хранилищу: " +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "Ðта ветка была изменена, пока вы её редактировали. Ð’Ñ‹ хотите Ñоздать новую ветку?" + msgid "This is a confidential issue." msgstr "Ðто конфиденциальное обÑуждение." msgid "This is the author's first Merge Request to this project." -msgstr "" +msgstr "Ðто первый Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние от автора в Ñтот проект." msgid "This issue is confidential and locked." msgstr "Ðто обÑуждение конфиденциально и заблокировано." @@ -1814,7 +2072,7 @@ msgid "This means you can not push code until you create an empty repository or msgstr "Ðто означает, что вы не можете отправить код, пока не Ñоздадите пуÑтой репозиторий или не импортируете ÑущеÑтвующий." msgid "This merge request is locked." -msgstr "" +msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние заблокирован." msgid "Time before an issue gets scheduled" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾ начала Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² планировщик" @@ -1946,7 +2204,7 @@ msgid "Timeago|in 1 year" msgstr "через год" msgid "Timeago|in a while" -msgstr "" +msgstr "через некоторое времÑ" msgid "Timeago|less than a minute ago" msgstr "менее чем минуту назад" @@ -1973,25 +2231,28 @@ msgid "Total test time for all commits/merges" msgstr "Общее Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸ÐºÑаций/ÑлиÑний" msgid "Track activity with Contribution Analytics." -msgstr "" +msgstr "ОтÑлеживать активноÑÑ‚ÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ðналитики УчаÑтников." msgid "Unlock" -msgstr "" +msgstr "Разблокировать" msgid "Unlocked" -msgstr "" +msgstr "Разблокировано" msgid "Unstar" msgstr "СнÑÑ‚ÑŒ отметку" +msgid "Unsubscribe" +msgstr "ОтпиÑатьÑÑ" + msgid "Upgrade your plan to activate Advanced Global Search." -msgstr "" +msgstr "ПовыÑьте ваш тарифный план, чтобы активировать Улучшенный Глобальный ПоиÑк." msgid "Upgrade your plan to activate Contribution Analytics." -msgstr "" +msgstr "ПовыÑьте ваш тарифный план, чтобы активировать Ðналитики УчаÑтников." msgid "Upgrade your plan to activate Group Webhooks." -msgstr "" +msgstr "ПовыÑьте ваш тарифный план, чтобы активировать Групповые Веб-Обработчики." msgid "Upgrade your plan to activate Issue weight." msgstr "Обновите ваш тарифный план Ð´Ð»Ñ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑа у обÑуждений." @@ -2015,13 +2276,13 @@ msgid "Use your global notification setting" msgstr "ИÑпользуютÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¹ наÑтройки уведомлений" msgid "View file @ " -msgstr "" +msgstr "ПроÑмотр файла @ " msgid "View open merge request" msgstr "ПроÑмотреть открытый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние" msgid "View replaced file @ " -msgstr "" +msgstr "ПроÑмотр заменённого файла @ " msgid "VisibilityLevel|Internal" msgstr "Ограниченный" @@ -2045,34 +2306,37 @@ msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed o msgstr "Веб-обработчики позволÑÑŽÑ‚ вам вызывать Ð°Ð´Ñ€ÐµÑ URL еÑли, например, отправлен новый код или Ñоздано новое обÑуждение. Ð’Ñ‹ можете наÑтроить веб-обработчики так, чтобы они реагировали на определённые ÑобытиÑ, такие как отправки кода, обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ запроÑÑ‹ на ÑлиÑние. Групповые веб-обработчики применÑÑŽÑ‚ÑÑ ÐºÐ¾ вÑем проектам в группе и позволÑÑŽÑ‚ вам Ñтандартизовать функциональноÑÑ‚ÑŒ веб-обработчиков Ð´Ð»Ñ Ð²Ñей вашей группы." msgid "Weight" -msgstr "" +msgstr "ВеÑ" + +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "Когда доÑтуп к хранилищу получить не удалоÑÑŒ, GitLab приоÑтановит доÑтуп к хранилищу на времÑ, указанное здеÑÑŒ. Ðто позволит файловой ÑиÑтеме воÑÑтановитьÑÑ. Репозитории на Ñбойных \"шардах\" будут временно недоÑтупны" msgid "Wiki" msgstr "Wiki" msgid "WikiClone|Clone your wiki" -msgstr "" +msgstr "Клонировать wiki" msgid "WikiClone|Git Access" -msgstr "" +msgstr "ДоÑтуп через Git" msgid "WikiClone|Install Gollum" -msgstr "" +msgstr "УÑтановка Gollum" msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" -msgstr "" +msgstr "РекомендуетÑÑ ÑƒÑтановить %{markdown}, чтобы возможноÑти GFM отображалиÑÑŒ локально:" msgid "WikiClone|Start Gollum and edit locally" -msgstr "" +msgstr "ЗапуÑтите Gollum и редактируете локально" msgid "WikiEmptyPageError|You are not allowed to create wiki pages" -msgstr "" +msgstr "Ð’Ñ‹ не можете Ñоздавать вики-Ñтраницы" msgid "WikiHistoricalPage|This is an old version of this page." -msgstr "" +msgstr "Ðто уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтой Ñтраницы." msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." -msgstr "" +msgstr "Ð’Ñ‹ можете увидеть %{most_recent_link} либо проÑмотреть %{history_link}." msgid "WikiHistoricalPage|history" msgstr "иÑториÑ" @@ -2114,7 +2378,7 @@ msgid "WikiPageEdit|Update %{page_title}" msgstr "Обновить %{page_title}" msgid "WikiPage|Page slug" -msgstr "" +msgstr "СемантичеÑкий Url Ð´Ð»Ñ Ñтраницы" msgid "WikiPage|Write your content or drag files here..." msgstr "Ðапишите ваше Ñодержимое или перетащите Ñюда файлы..." @@ -2150,7 +2414,7 @@ msgid "Wiki|Wiki Pages" msgstr "Вики Страницы" msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." -msgstr "" +msgstr "С аналитикой учаÑтников вы можете изучать активноÑÑ‚ÑŒ в обÑуждениÑÑ…, запроÑах на ÑлиÑние и Ñобытий отправки кода Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ организации и её учаÑтников." msgid "Withdraw Access Request" msgstr "Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа" @@ -2167,9 +2431,21 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить ÑвÑзь ответвлен msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ передать проект %{project_name_with_namespace} другому владельцу. Ð’Ñ‹ ÐБСОЛЮТÐО уверены?" +msgid "You are on a read-only GitLab instance." +msgstr "Ð’Ñ‹ находитеÑÑŒ на ÑкземплÑре \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab." + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "Ð’Ñ‹ находитеÑÑŒ на ÑкземплÑре \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab. ЕÑли вы хотите произвеÑти любые изменениÑ, вы должны перейти на \"оÑновной\" ÑкземплÑÑ€ по ÑÑылке %{link_to_primary_node}." + msgid "You can only add files when you are on a branch" msgstr "Ð’Ñ‹ можете добавлÑÑ‚ÑŒ только файлы, когда находитеÑÑŒ в ветке" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "Ð’Ñ‹ не можете запиÑывать на подчиненные ÑкземплÑры \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab Geo. ИÑпользуйте вмеÑто Ñтого %{link_to_primary_node}." + +msgid "You cannot write to this read-only GitLab instance." +msgstr "Ð’Ñ‹ не можете запиÑывать на Ñтот ÑкземплÑÑ€ \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab." + msgid "You have reached your project limit" msgstr "Ð’Ñ‹ доÑтигли Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² вашем проекте" @@ -2195,13 +2471,16 @@ msgid "You will receive notifications only for comments in which you were @menti msgstr "Ð’Ñ‹ будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ², в которых вы были @упомÑнуты" msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account" -msgstr "Ð’Ñ‹ не Ñможете получать и отправлÑÑ‚ÑŒ код проекта через %{protocol} пока %{set_password_link} в ваш аккаунт" +msgstr "Ð’Ñ‹ не Ñможете получать и отправлÑÑ‚ÑŒ код в данный проект через %{protocol} пока не %{set_password_link} в вашей учетной запиÑи" msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile" msgstr "Ð’Ñ‹ не Ñможете получать и отправлÑÑ‚ÑŒ код проекта через SSH пока %{add_ssh_key_link} в ваш профиль." msgid "Your comment will not be visible to the public." -msgstr "" +msgstr "Ваш комментарий не будет виден вÑем." + +msgid "Your groups" +msgstr "Ваши группы" msgid "Your name" msgstr "Ваше имÑ" @@ -2210,7 +2489,7 @@ msgid "Your projects" msgstr "Ваши проекты" msgid "commit" -msgstr "" +msgstr "коммит" msgid "day" msgid_plural "days" @@ -2230,9 +2509,15 @@ msgstr[0] "иÑточник" msgstr[1] "иÑточники" msgstr[2] "иÑточники" -msgid "to help your contributors communicate effectively!" -msgstr "" +msgid "password" +msgstr "пароль" msgid "personal access token" -msgstr "" +msgstr "токен Ð´Ð»Ñ Ð¿ÐµÑ€Ñонального доÑтупа" + +msgid "to help your contributors communicate effectively!" +msgstr "чтобы помочь вашим учаÑтникам взаимодейÑтвовать Ñффективнее!" + +msgid "username" +msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po index 62f4d4cbf2e..cf51f8ec689 100644 --- a/locale/uk/gitlab.po +++ b/locale/uk/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:37-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-05 08:38-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -24,9 +24,9 @@ msgstr[2] "%d коммітів" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%d шар" +msgstr[1] "%d шари" +msgstr[2] "%d шарів" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -37,6 +37,12 @@ msgstr[2] "%s доданих коммітів були виключені Ð´Ð»Ñ msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} комміт %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "на %{number_commits_behind} коммітів позаду %{default_branch}, на %{number_commits_ahead} коммітів попереду" @@ -58,6 +64,12 @@ msgstr[2] "%{storage_name}: %{failed_attempts} невдалих Ñпроб Ð´Ð¾Ñ msgid "(checkout the %{link} for information on how to install it)." msgstr "(перейдіть за поÑиланнÑм %{link} Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— ÑтоÑовно вÑтановленнÑ)." +msgid "+ %{moreCount} more" +msgstr "+ ще %{moreCount}" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "1 конвеєр" @@ -68,7 +80,7 @@ msgid "1st contribution!" msgstr "Перший внеÑок!" msgid "2FA enabled" -msgstr "" +msgstr "Двоетапна Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð°" msgid "A collection of graphs regarding Continuous Integration" msgstr "Це набір графічних елементів Ð´Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÑ€ÐµÑ€Ð²Ð½Ð¾Ñ— інтеграції" @@ -113,11 +125,20 @@ msgid "Add an SSH key to your profile to pull or push via SSH." msgstr "Додати SSH ключа в Ñвій профіль, щоб мати можливіÑÑ‚ÑŒ завантажити чи надіÑлати зміни через SSH." msgid "Add new directory" -msgstr "" +msgstr "Додати новий каталог" + +msgid "AdminHealthPageLink|health page" +msgstr "Ñторінка ÑтатуÑу" + +msgid "Advanced settings" +msgstr "Додаткові параметри" msgid "All" msgstr "Ð’ÑÑ–" +msgid "An error occurred. Please try again." +msgstr "СталаÑÑŒ помилка. Спробуйте ще раз." + msgid "Appearance" msgstr "Зовнішній виглÑд" @@ -133,6 +154,9 @@ msgstr "Ви впевнені, що хочете видалити цей розРmsgid "Are you sure you want to discard your changes?" msgstr "Ви впевнені, що бажаєте ÑкаÑувати ваші зміни?" +msgid "Are you sure you want to leave this group?" +msgstr "Ви впевнені що хочете залишити цю групу?" + msgid "Are you sure you want to reset registration token?" msgstr "Ви впевнені, що бажаєте Ñкинути реєÑтраційний токен?" @@ -155,29 +179,32 @@ msgid "Author" msgstr "Ðвтор" msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхідно вказати доменне Ñ–Ð¼â€™Ñ Ñ‚Ð° %{kubernetes}." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхідно вказати доменне ім’Ñ." msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи Auto Review Apps та Auto Deploy необхіден %{kubernetes}." msgid "AutoDevOps|Auto DevOps (Beta)" -msgstr "" - -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "Auto DevOps може бути активований Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту. Він буде автоматично Ñтворювати, теÑтувати Ñ– розгортати ваш додаток на оÑнові налаштованої конфігурації CI / CD." +msgstr "Auto DevOps (бета)" msgid "AutoDevOps|Auto DevOps documentation" -msgstr "" +msgstr "Auto DevOps документаціÑ" msgid "AutoDevOps|Enable in settings" msgstr "Включити в налаштуваннÑÑ…" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "AutoDevOps буде автоматично збирати, теÑтувати та розгортати вашу програму на оÑнові визначеної CI/CD конфігурації." + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ в %{link_to_documentation}" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "Ви можете активувати %{link_to_settings} Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." + msgid "Billing" msgstr "Білінг" @@ -185,7 +212,7 @@ msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan." msgstr "%{group_name} зараз має план %{plan_link}." msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available." -msgstr "" +msgstr "Ðвтоматичні Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ деÑких планів зараз не доÑтупні." msgid "BillingPlans|Current plan" msgstr "Поточний план" @@ -221,7 +248,7 @@ msgid "BillingPlans|You are currently on the %{plan_link} plan." msgstr "Зараз ви викориÑтовуєте план %{plan_link}." msgid "BillingPlans|frequently asked questions" -msgstr "" +msgstr "ЧаÑÑ‚Ñ– питаннÑ" msgid "BillingPlans|monthly" msgstr "щоміÑÑцÑ" @@ -241,6 +268,9 @@ msgstr[2] "Гілок" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "Гілка <strong>%{branch_name}</strong> Ñтворена. Ð”Ð»Ñ Ð½Ð°Ñтройки автоматичного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð²Ð¸Ð±ÐµÑ€Ñ–Ñ‚ÑŒ GitLab CI Yaml-шаблон Ñ– закоммітьте зміни. %{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "Гілка змінилаÑÑŒ" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "Пошук гілок" @@ -272,28 +302,28 @@ msgid "Branches|Delete protected branch '%{branch_name}'?" msgstr "Видалити захищену гілку \"%{branch_name}\"?" msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" -msgstr "" +msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð³Ñ–Ð»ÐºÐ¸ '%{branch_name}' неможливо буде ÑкаÑувати. Ви впевнені?" msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" -msgstr "" +msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ð¸Ñ… гілок неможливо буде ÑкаÑувати. Ви впевнені?" msgid "Branches|Filter by branch name" -msgstr "" +msgstr "Фільтрувати за назвою гілки" msgid "Branches|Merged into %{default_branch}" -msgstr "" +msgstr "Злито в %{default_branch}" msgid "Branches|New branch" -msgstr "" +msgstr "Ðова гілка" msgid "Branches|No branches to show" -msgstr "" +msgstr "Ðемає гілок Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ" msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." msgstr "Як тільки ви підтвердите Ñ– натиÑнете %{delete_protected_branch}, дані будуть втрачені, Ñ– Ñ—Ñ… не можливо буде відновити." msgid "Branches|Only a project master or owner can delete a protected branch" -msgstr "" +msgstr "Тільки керівник або влаÑник проекту може видалити захищену гілку" msgid "Branches|Protected branches can be managed in %{project_settings_link}" msgstr "УправлÑти захищеними гілками можливо в %{project_settings_link}" @@ -302,13 +332,13 @@ msgid "Branches|Sort by" msgstr "Сортувати за" msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart." -msgstr "" +msgstr "Гілка не може бути оновлена автоматично, тому що вона має розбіжноÑÑ‚Ñ– із upstream." msgid "Branches|The default branch cannot be deleted" msgstr "Гілка \"за замовчуваннÑм\" не може бути видалена" msgid "Branches|This branch hasn’t been merged into %{default_branch}." -msgstr "" +msgstr "Ð¦Ñ Ð³Ñ–Ð»ÐºÐ° не була злита в %{default_branch}." msgid "Branches|To avoid data loss, consider merging this branch before deleting it." msgstr "Щоб уникнути втрати даних, розглÑньте можливіÑÑ‚ÑŒ Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ†Ñ–Ñ”Ñ— гілки перед Ñ—Ñ— видаленнÑм." @@ -317,16 +347,16 @@ msgid "Branches|To confirm, type %{branch_name_confirmation}:" msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ, введіть %{branch_name_confirmation}:" msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." -msgstr "" +msgstr "Щоб відхилити локальні зміни Ñ– перезапиÑати гілку верÑією з upstream, видаліть Ñ—Ñ— тут Ñ– виберіть \"Оновити зараз\" вище." msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." -msgstr "" +msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ захищену гілку %{branch_name}." msgid "Branches|diverged from upstream" -msgstr "" +msgstr "розходитьÑÑ Ð· upstream" msgid "Branches|merged" -msgstr "" +msgstr "злита" msgid "Branches|project settings" msgstr "ÐаÑтройки проекту" @@ -356,7 +386,7 @@ msgid "CI configuration" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI" msgid "CICD|Jobs" -msgstr "" +msgstr "ЗавданнÑ" msgid "Cancel" msgstr "СкаÑувати" @@ -365,7 +395,7 @@ msgid "Cancel edit" msgstr "Відмінити правку" msgid "Change Weight" -msgstr "" +msgstr "Вага зміни" msgid "ChangeTypeActionLabel|Pick into branch" msgstr "Вибрати в гілці" @@ -395,7 +425,7 @@ msgid "Cherry-pick this merge request" msgstr "Cherry-pick в цьому запиті на злиттÑ" msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all." -msgstr "" +msgstr "Виберіть, Ñкі групи ви хочете реплікувати на цю вторинну ноду. Залиште порожнім, щоб реплікувати вÑе." msgid "CiStatusLabel|canceled" msgstr "ÑкаÑовано" @@ -451,134 +481,146 @@ msgstr "пропущено" msgid "CiStatus|running" msgstr "виконуєтьÑÑ" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "circuitbreaker api" + msgid "Clone repository" -msgstr "" +msgstr "Клонувати репозиторій" msgid "Close" msgstr "Закрити" +msgid "Cluster" +msgstr "КлаÑтер" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" -msgstr "" +msgstr "%{link_to_container_project} напевно було Ñтворено під цим обліковим запиÑом" + +msgid "ClusterIntegration|Cluster details" +msgstr "Параметри клаÑтера" msgid "ClusterIntegration|Cluster integration" -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· клаÑтером" msgid "ClusterIntegration|Cluster integration is disabled for this project." -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· клаÑтером вимкнена Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." msgid "ClusterIntegration|Cluster integration is enabled for this project." -msgstr "" +msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· клаÑтером увімкнена Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "Ð”Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту увімкнена Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· клаÑтером. Ð’Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— не вплине на клаÑтер, але з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ GitLab з ним буде тимчаÑово розірване." msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." -msgstr "" +msgstr "СтворюєтьÑÑ ÐºÐ»Ð°Ñтер в Google Container Engine..." msgid "ClusterIntegration|Cluster name" -msgstr "" +msgstr "Ім'Ñ ÐºÐ»Ð°Ñтера" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" -msgstr "" +msgstr "КлаÑтер був уÑпішно Ñтворений в Google Container Engine" msgid "ClusterIntegration|Copy cluster name" -msgstr "" +msgstr "Копіювати назву клаÑтера" msgid "ClusterIntegration|Create cluster" -msgstr "" +msgstr "Створити клаÑтер" msgid "ClusterIntegration|Create new cluster on Google Container Engine" -msgstr "" +msgstr "Створити новий клаÑтер в Google Container Engine" msgid "ClusterIntegration|Enable cluster integration" -msgstr "" +msgstr "Увімкнути інтеграцію із клаÑтерами" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "Ідентифікатор проекту в Google Cloud Platform" msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Google Container Engine project" -msgstr "" - -msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Проект Google Container Engine" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" +msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про %{link_to_documentation}" -msgid "ClusterIntegration|See machine types" -msgstr "" +msgid "ClusterIntegration|Machine type" +msgstr "Тип машини" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" -msgstr "" +msgstr "ПереконайтеÑÑ, що ваш обліковий Ð·Ð°Ð¿Ð¸Ñ %{link_to_requirements} Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтерів" + +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ”ÑŽ із клаÑтером у вашому Gitlab-проекті." msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" -msgstr "" +msgstr "Ð”Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñвоїм клаÑтером перейдіть на %{link_gke}" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "КількіÑÑ‚ÑŒ вузлів" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "Будь-лаÑка впевнітьÑÑ, що ваш Google-аккаунт задовольнÑÑ” наÑтупним вимогам:" msgid "ClusterIntegration|Project namespace (optional, unique)" -msgstr "" +msgstr "Namespace проекту (не обов’Ñзковий, унікальний)" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "Прочитайте нашу документацію %{link_to_help_page} по інтеграції із клаÑтером." msgid "ClusterIntegration|Remove cluster integration" -msgstr "" +msgstr "Видалити інтеграцію з клаÑтером" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "Видалити інтеграцію" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." -msgstr "" +msgstr "При видаленні інтеграції з клаÑтером буде видалена ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ»Ð°Ñтера, Ñку ви додали в цей проект. Дана Ð´Ñ–Ñ Ð½Ðµ видалить Ñам проект." -msgid "ClusterIntegration|Save changes" -msgstr "" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "ПереглÑнути та редагувати параметри вашого клаÑтера" + +msgid "ClusterIntegration|See machine types" +msgstr "ПереглÑнути типи машин" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "ПереглÑнути ваші проекти" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "ПереглÑнути зони" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" - -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" +msgstr "ЩоÑÑŒ пішло не так з нашого боку." -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" +msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтера в Google Container Engine" msgid "ClusterIntegration|Toggle Cluster" -msgstr "" - -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" +msgstr "Переключити КлаÑтер" msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "За допомогою підключеного до цього проекту клаÑтера, ви можете викориÑтовувати Review Apps, розгортати ваші проекти, запуÑкати конвеєри збірки та багато іншого." msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" -msgstr "" +msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати %{link_to_container_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "Зона" msgid "ClusterIntegration|access to Google Container Engine" -msgstr "" +msgstr "доÑтуп до Google Container Engine" msgid "ClusterIntegration|cluster" -msgstr "" +msgstr "клаÑтер" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "Ñторінка допомоги" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "задовольнÑÑ” вимогам" msgid "ClusterIntegration|properly configured" -msgstr "" +msgstr "правильно налаштований" msgid "Comments" msgstr "Коментарі" @@ -589,8 +631,14 @@ msgstr[0] "Комміт" msgstr[1] "Комміта" msgstr[2] "Коммітів" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + msgid "Commit Message" -msgstr "" +msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼Ñ–Ñ‚Ñƒ" msgid "Commit duration in minutes for last 30 commits" msgstr "ТриваліÑÑ‚ÑŒ оÑтанніх 30 коммітів у хвилинах" @@ -620,49 +668,49 @@ msgid "Compare" msgstr "ПорівнÑти" msgid "Container Registry" -msgstr "" +msgstr "РеєÑÑ‚Ñ€ Контейнерів" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "Створений" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" -msgstr "" +msgstr "Спочатку увійдіть до реєÑтру контейнерів GitLab, викориÑтовуючи логін та пароль. Якщо у Ð²Ð°Ñ %{link_2fa}, треба викориÑтовувати %{link_token}:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "GitLab підтримує до 3 рівнів імен образів. ÐаÑтупні приклади образів Ñ” правильними Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ проекту:" msgid "ContainerRegistry|How to use the Container Registry" -msgstr "" +msgstr "Як викориÑтовувати РеєÑÑ‚Ñ€ Контейнерів" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "Ð’ РеєÑтрі Контейнерів немає тегів Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ образу." msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "ПіÑÐ»Ñ Ð²Ñ…Ð¾Ð´Ñƒ ви можете Ñтворювати та завантажувати образи контейнерів, викориÑтовуючи звичайні %{build} та %{push} команди" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "Видалити репозиторій" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "Видалити тег" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "Розмір" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "Тег" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "Тег ID" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "ВикориÑтовуйте різні імена образів" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." -msgstr "" +msgstr "За допомогою вбудованого в GitLab реєÑтру Docker контейнерів кожен проект може мати влаÑне міÑце Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Docker образів." msgid "Contribution guide" msgstr "Керівництво контриб’юторів" @@ -670,6 +718,12 @@ msgstr "Керівництво контриб’юторів" msgid "Contributors" msgstr "Контриб’ютори" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "Задати макÑимальну кількіÑÑ‚ÑŒ потоків Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ LFS/вкладень Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вторинного вузла" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "Задати макÑимальну кількіÑÑ‚ÑŒ потоків Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вторинного вузла" + msgid "Copy SSH public key to clipboard" msgstr "Скопіюйте відкритий SSH-ключ в буфер обміну" @@ -691,9 +745,21 @@ msgstr "Створити каталог" msgid "Create empty bare repository" msgstr "Створити порожній репозиторій" +msgid "Create file" +msgstr "Створити файл" + msgid "Create merge request" msgstr "Створити запит на злиттÑ" +msgid "Create new branch" +msgstr "Створити нову гілку" + +msgid "Create new directory" +msgstr "Створити новий каталог" + +msgid "Create new file" +msgstr "Створити новий файл" + msgid "Create new..." msgstr "Створити..." @@ -781,6 +847,9 @@ msgstr "Ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ" msgid "Discard changes" msgstr "СкаÑувати зміни" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "Відмінити блок вÑтупу до Ðналитики Циклу" + msgid "Dismiss Merge Request promotion" msgstr "Ðе показувати промоушн запитів на злиттÑ" @@ -824,22 +893,22 @@ msgid "Emails" msgstr "ÐдреÑи електронної пошти" msgid "EventFilterBy|Filter by all" -msgstr "Ð’ÑÑ–" +msgstr "Фільтрувати по вÑім" msgid "EventFilterBy|Filter by comments" -msgstr "Коментарю" +msgstr "Фільтрувати по коментарÑм" msgid "EventFilterBy|Filter by issue events" -msgstr "Проблеми" +msgstr "Фільтрувати по проблемах" msgid "EventFilterBy|Filter by merge events" -msgstr "Запити на злиттÑ" +msgstr "Фільтрувати по запитам на злиттÑ" msgid "EventFilterBy|Filter by push events" -msgstr "По відправленні комміту" +msgstr "Фільтрувати по push-подіÑÑ…" msgid "EventFilterBy|Filter by team" -msgstr "За командою" +msgstr "Фільтрувати по команді" msgid "Every day (at 4:00am)" msgstr "Кожен день (в 4:00 ранку)" @@ -853,12 +922,18 @@ msgstr "Ð©Ð¾Ñ‚Ð¸Ð¶Ð½Ñ (в неділю о 4:00 ранку)" msgid "Explore projects" msgstr "ОглÑд проектів" +msgid "Explore public groups" +msgstr "ПереглÑнути публічні групи" + msgid "Failed to change the owner" msgstr "Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ влаÑника" msgid "Failed to remove the pipeline schedule" msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ розклад Конвеєра" +msgid "File name" +msgstr "Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" + msgid "Files" msgstr "Файли" @@ -904,9 +979,15 @@ msgstr "GPG ключі" msgid "Geo Nodes" msgstr "Гео-Вузли" +msgid "Geo|File sync capacity" +msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації файлів" + msgid "Geo|Groups to replicate" msgstr "Групи Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—" +msgid "Geo|Repository sync capacity" +msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації репозиторіїв" + msgid "Geo|Select groups to replicate." msgstr "Виберіть групи Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—." @@ -923,7 +1004,7 @@ msgid "GoToYourFork|Fork" msgstr "Форк" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Google не %{link_to_documentation}. ПопроÑÑ–Ñ‚ÑŒ Ñвого адмініÑтратора GitLab, Ñкщо ви хочете ÑкориÑтатиÑÑ Ñ†Ð¸Ð¼ ÑервіÑом." msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "Заборонити Ñпільний доÑтуп до проекту в рамках %{group} з іншими групами" @@ -932,13 +1013,13 @@ msgid "GroupSettings|Share with group lock" msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу з іншими групами" msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." -msgstr "" +msgstr "Цей параметр заÑтоÑовано до %{ancestor_group} Ñ– його було перевизначено в цій підгрупі." msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Щоб поділитиÑÑ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°Ð¼Ð¸ з цієї групи з іншою групою, попроÑÑ–Ñ‚ÑŒ влаÑника перевизначити параметр або %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." -msgstr "" +msgstr "Цей параметр заÑтоÑовано до %{ancestor_group}. Ви можете перевизначити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… підгруп, Ñкщо тільки не буде перевизначено влаÑником групи. Групи, Ñкі вже мають доÑтуп до проекту, будуть мати доÑтуп, Ñкщо вони не будуть вилучені вручну." @@ -949,6 +1030,51 @@ msgstr "не може бути ÑкаÑовано поки \"Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "Видалити Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу з іншими групами з %{ancestor_group_name}" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "Група — набір із декількох проектів." + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð² у групі Ñхоже на Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² папці." + +msgid "GroupsEmptyState|No groups found" +msgstr "Групи не знайдені" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "Ви можете керувати правами доÑтупу членів групи мати доÑтуп до кожного проекту в ній." + +msgid "GroupsTreeRole|as" +msgstr "Ñк" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "Ви впевнені, що хочете залишити групу \"${this.group.fullName}\"?" + +msgid "GroupsTree|Create a project in this group." +msgstr "Створити проект у групі." + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "Створити підгрупи у цій групі." + +msgid "GroupsTree|Edit group" +msgstr "Редагувати групу" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ñ‚Ð¸ групу. Будь-лаÑка впевнітьÑÑ, що ви не єдитий влаÑник." + +msgid "GroupsTree|Filter by name..." +msgstr "Фільтрувати за іменем…" + +msgid "GroupsTree|Leave this group" +msgstr "Залишити цю группу" + +msgid "GroupsTree|Loading groups" +msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "Ðа жаль жодна группа не задовольнÑÑ” параметрам вашого запиту" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "Ðа жаль жодна группа чи проект не задовольнÑÑ” параметрам вашого запиту" + msgid "Health Check" msgstr "Перевірки працездатноÑÑ‚Ñ–" @@ -994,6 +1120,12 @@ msgstr[0] "ІнÑтанÑ" msgstr[1] "ІнÑтанÑа" msgstr[2] "ІнÑтанÑів" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ â€” будь-Ñкий автентифікований кориÑтувач має доÑтуп до цієї групи та уÑÑ–Ñ… Ñ—Ñ— внутрішніх проектів." + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "Внутрішній — будь-Ñкий автентифікований кориÑтувач має доÑтуп до цього проекту." + msgid "Interval Pattern" msgstr "Шаблон інтервалу" @@ -1007,7 +1139,7 @@ msgid "Issue boards with milestones" msgstr "Дошка обговорень із етапами" msgid "Issue events" -msgstr "Події проблем" +msgstr "Проблеми" msgid "IssueBoards|Board" msgstr "Дошка" @@ -1049,7 +1181,7 @@ msgid "Last update" msgstr "ОÑтаннє оновленнÑ" msgid "Last updated" -msgstr "" +msgstr "ВоÑтаннє оновленно" msgid "LastPushEvent|You pushed to" msgstr "Ви надіÑлали зміни до" @@ -1063,6 +1195,9 @@ msgstr "ДізнайтеÑÑŒ більше" msgid "Learn more in the|pipeline schedules documentation" msgstr "Детальніше в документації по розкладами конвеєрів" +msgid "Leave" +msgstr "Вийти" + msgid "Leave group" msgstr "Залишити групу" @@ -1087,6 +1222,12 @@ msgstr "Заблоковано" msgid "Locked Files" msgstr "Заблоковані файли" +msgid "Login" +msgstr "Вхід" + +msgid "Maximum git storage failures" +msgstr "МакÑимальна кількіÑÑ‚ÑŒ невдач в Ñховищі даних git" + msgid "Median" msgstr "Медіана" @@ -1094,10 +1235,10 @@ msgid "Members" msgstr "КориÑтувачі" msgid "Merge Requests" -msgstr "Запит на злиттÑ" +msgstr "Запити на злиттÑ" msgid "Merge events" -msgstr "Події запит на злиттÑ" +msgstr "Запити на злиттÑ" msgid "Merge request" msgstr "Запит на злиттÑ" @@ -1117,6 +1258,9 @@ msgstr "тут" msgid "Multiple issue boards" msgstr "Зведені дошки обговореннÑ" +msgid "New Cluster" +msgstr "Ðовий клаÑтер" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Ðова проблема" @@ -1135,23 +1279,32 @@ msgstr "Ðовий каталог" msgid "New file" msgstr "Ðовий файл" +msgid "New group" +msgstr "Ðова група" + msgid "New issue" msgstr "Ðова проблема" msgid "New merge request" msgstr "Ðовий запит на злиттÑ" +msgid "New project" +msgstr "Ðовий проект" + msgid "New schedule" msgstr "Ðовий Розклад" msgid "New snippet" msgstr "Ðовий Ñніппет" +msgid "New subgroup" +msgstr "Ðова підгрупа" + msgid "New tag" msgstr "Ðовий тег" msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" +msgstr "Ð’ цьому проекті немає жодного образа контейнера. Додайте його за інÑтрукціÑми вище." msgid "No repository" msgstr "Ðемає репозеторіÑ" @@ -1225,6 +1378,12 @@ msgstr "ВідÑтежувати" msgid "Notifications" msgstr "СповіщеннÑ" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "Фільтр" @@ -1277,7 +1436,7 @@ msgid "Pipeline Schedules" msgstr "Розклади Конвеєрів" msgid "Pipeline quota" -msgstr "" +msgstr "Квота на конвеєри" msgid "PipelineCharts|Failed:" msgstr "Ðе вдалоÑÑ:" @@ -1366,9 +1525,54 @@ msgstr "зі ÑтадіÑми" msgid "Preferences" msgstr "ÐалаштуваннÑ" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "Приватний — доÑтуп до проекту повинен надаватиÑÑ ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñƒ кориÑтувачеві." + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "Приватна — цю групу та Ñ—Ñ— проекти можуть бачити тільки Ñ—Ñ— кориÑтувачі." + msgid "Profile" msgstr "Профіль" +msgid "Profiles|Account scheduled for removal." +msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¾Ð²Ð°Ð½Ð¸Ð¹ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ." + +msgid "Profiles|Delete Account" +msgstr "Видалити обліковий запиÑ" + +msgid "Profiles|Delete account" +msgstr "Видалити обліковий запиÑ" + +msgid "Profiles|Delete your account?" +msgstr "Видалити ваш обліковий запиÑ?" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ запиÑу неÑе наÑтупні наÑлідки:" + +msgid "Profiles|Invalid password" +msgstr "Ðеправильний пароль" + +msgid "Profiles|Invalid username" +msgstr "Ðеправильне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "Введіть ваш %{confirmationValue} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:" + +msgid "Profiles|You don't have access to delete this user." +msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” доÑтупу Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ кориÑтувача." + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "Вам необхідно змінити влаÑника або видалити ці групи перед тим Ñк видалити ваш обліковий запиÑ." + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ” влаÑником в цих групах:" + +msgid "Profiles|your account" +msgstr "ваш обліковий запиÑ" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "Проект '%{project_name}' перебуває в процеÑÑ– видаленнÑ." + msgid "Project '%{project_name}' queued for deletion." msgstr "Проект '%{project_name}' доданий в чергу на видаленнÑ." @@ -1378,9 +1582,6 @@ msgstr "Проект '%{project_name}' уÑпішно Ñтворений." msgid "Project '%{project_name}' was successfully updated." msgstr "Проект '%{project_name}' уÑпішно оновлено." -msgid "Project '%{project_name}' will be deleted." -msgstr "Проект '%{project_name}' видалений." - msgid "Project access must be granted explicitly to each user." msgstr "ДоÑтуп до проекту повинен надаватиÑÑ ÐºÐ¾Ð¶Ð½Ð¾Ð¼Ñƒ кориÑтувачеві." @@ -1424,7 +1625,7 @@ msgid "ProjectNetworkGraph|Graph" msgstr "ІÑторіÑ" msgid "ProjectSettings|Contact an admin to change this setting." -msgstr "" +msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб змінити це налаштуваннÑ." msgid "ProjectSettings|Only signed commits can be pushed to this repository." msgstr "Тільки підпиÑані комміти можуть бути надіÑлані в цей репозиторій." @@ -1436,10 +1637,16 @@ msgid "ProjectSettings|This setting is applied on the server level but has been msgstr "Цей параметр заÑтоÑовуєтьÑÑ Ð½Ð° рівні Ñервера, але його було перевизначено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." +msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… проектів, Ñкщо адмініÑтратор не змінить його." + +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgstr "" +msgid "Projects" +msgstr "Проекти" + msgid "ProjectsDropdown|Frequently visited" -msgstr "" +msgstr "ЧаÑто відвідувані" msgid "ProjectsDropdown|Loading projects" msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð²" @@ -1459,11 +1666,20 @@ msgstr "Ðа жаль, по вашоу запиту проектів не зна msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” підтримки localStorage вашим браузером" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "Публічна — група та вÑÑ– публічні проекти можуть переглÑдатиÑÑ Ð±ÐµÐ· автентифікації." + +msgid "Public - The project can be accessed without any authentication." +msgstr "Публічний — проект может переглÑдатиÑÑ Ð±ÐµÐ· автентифікації." + msgid "Push Rules" msgstr "Push-правила" msgid "Push events" -msgstr "Push події" +msgstr "Push-події" + +msgid "PushRule|Committer restriction" +msgstr "" msgid "Read more" msgstr "Докладніше" @@ -1528,6 +1744,9 @@ msgstr "СкаÑувати цей запит на злиттÑ" msgid "SSH Keys" msgstr "Ключі SSH" +msgid "Save" +msgstr "Зберегти" + msgid "Save changes" msgstr "Зберегти зміни" @@ -1546,6 +1765,15 @@ msgstr "ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²" msgid "Search branches and tags" msgstr "Пошук гілок та тегів" +msgid "Seconds before reseting failure information" +msgstr "КількіÑÑ‚ÑŒ Ñекунд до ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про збої" + +msgid "Seconds to wait after a storage failure" +msgstr "Скільки Ñекунд очікувати піÑÐ»Ñ Ð·Ð±Ð¾ÑŽ в Ñховищі даних" + +msgid "Seconds to wait for a storage access attempt" +msgstr "КількіÑÑ‚ÑŒ Ñекунд Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ повторною Ñпробою доÑтупу до Ñховища даних" + msgid "Select Archive Format" msgstr "Виберіть формат архіву" @@ -1592,16 +1820,19 @@ msgid "Snippets" msgstr "Фрагменти" msgid "Something went wrong on our end." -msgstr "" +msgstr "ЩоÑÑŒ пішло не так з нашого боку" + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "ЩоÑÑŒ пішло не так, намагаючиÑÑŒ змінити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ${this.issuableDisplayName(this.issuableType)}" msgid "Something went wrong while fetching the projects." -msgstr "" +msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð²" msgid "Something went wrong while fetching the registry list." -msgstr "" +msgstr "ЩоÑÑŒ пішло не так при отриманні ÑпиÑку із реєÑтру." -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "ЩоÑÑŒ пішло не так, намагаючиÑÑŒ змінити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" +msgstr "Сортувати за" msgid "SortOptions|Access level, ascending" msgstr "Рівень доÑтупу, в порÑдку зроÑтаннÑ" @@ -1720,6 +1951,12 @@ msgstr "Почати %{new_merge_request} з цих змін" msgid "Start the Runner!" msgstr "ЗапуÑÑ‚Ñ–Ñ‚ÑŒ Runner!" +msgid "Subgroups" +msgstr "Підгрупи" + +msgid "Subscribe" +msgstr "ПідпиÑатиÑÑ" + msgid "Switch branch/tag" msgstr "тег" @@ -1747,6 +1984,9 @@ msgstr "ДÑкую! Більше не показувати це повідомл msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "Розширений глобальний пошук в GitLab - це потужний інÑтрумент Ñкий заощаджує ваш чаÑ. ЗаміÑÑ‚ÑŒ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ Ñ– витрати чаÑу, ви можете шукати код вÑередині інших команд, Ñкий може допомогти у вашому проекті." +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "Ðа Ñтадії напиÑÐ°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ, показує Ñ‡Ð°Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ комміту до ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на об'єднаннÑ. Дані будуть автоматично додані піÑÐ»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ першого запиту на об'єднаннÑ." @@ -1759,6 +1999,15 @@ msgstr "Зв'Ñзок форка видалена." msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "Етап випуÑку показує, Ñкільки чаÑу потрібно від ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ до приÑÐ²Ð¾Ñ”Ð½Ð½Ñ Ð²Ð¸Ð¿ÑƒÑку, або Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ в вашу дошку проблем. Почніть Ñтворювати проблеми, щоб переглÑдати дані Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ етапу." +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "КількіÑÑ‚ÑŒ збоїв піÑÐ»Ñ Ñкої Gitlab повніÑÑ‚ÑŽ заблокує доÑтуп до Ñховища данних. Лічильник кількоÑÑ‚Ñ– збоїв може бути Ñкинутий в інтерфейÑÑ– адмініÑтратора (%{link_to_health_page}), або через %{api_documentation_link}." + msgid "The phase of the development lifecycle." msgstr "Фаза життєвого циклу розробки." @@ -1789,6 +2038,12 @@ msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Ð”Ð•Ð’ показує Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ злиттÑм \"MR\" Ñ msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Ñ‚ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” чаÑ, Ñкий GitLab CI виконує Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку кожного конвеєра Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ запиту злиттÑ. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ конвеєра." +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "КількіÑÑ‚ÑŒ Ñекунд, протÑгом Ñкої GitLab зберігає інформацію про збої. Якщо протÑгом цього періоду жодних збоїв не відбуваєтьÑÑ, Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ точку Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑкидаєтьÑÑ." + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "КількіÑÑ‚ÑŒ Ñекунд, протÑгом Ñкої GitLab намагатиметьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до Ñховища даних. По завершенню цього періоду буде згенерована помилка про Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу." + msgid "The time taken by each data entry gathered by that stage." msgstr "ЧаÑ, витрачений на кожен елемент, зібраний на цьому етапі." @@ -1798,6 +2053,9 @@ msgstr "Середнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² Ñ€Ñдку. Приклад: між 3, msgid "There are problems accessing Git storage: " msgstr "Є проблеми з доÑтупом до Ñховища: " +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "Ð¦Ñ Ð³Ñ–Ð»ÐºÐ° була змінена піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾ моменту, коли ви почали Ñ—Ñ— редагувати. Ви хотіли б Ñтворити нову?" + msgid "This is a confidential issue." msgstr "Це конфіденційна проблема." @@ -1984,6 +2242,9 @@ msgstr "Розблоковано" msgid "Unstar" msgstr "ВідпиÑатиÑÑŒ" +msgid "Unsubscribe" +msgstr "ВідпиÑатиÑÑ" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "Перейдіть на вищий тарифний план щоб активувати Покращений Глобальний Пошук." @@ -1991,13 +2252,13 @@ msgid "Upgrade your plan to activate Contribution Analytics." msgstr "Перейдіть на вищий тарифний план Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— Ðналітики контриб’юторів." msgid "Upgrade your plan to activate Group Webhooks." -msgstr "" +msgstr "Перейдіть на вищий тарифний план щоб активувати Групові Webhook’и." msgid "Upgrade your plan to activate Issue weight." -msgstr "" +msgstr "Підвищіть план щоб активувати вагу обговорень." msgid "Upgrade your plan to improve Issue boards." -msgstr "" +msgstr "Підвищіть Ñвій план, щоб покращити дошки обговорень." msgid "Upload New File" msgstr "Завантажити новий файл" @@ -2047,6 +2308,9 @@ msgstr "Webhook дозволÑÑŽÑ‚ÑŒ вам викликати адреÑу URL msgid "Weight" msgstr "Вага" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "Коли відбуваєтьÑÑ Ð·Ð±Ñ–Ð¹ при доÑтупі до Ñховища даних, GitLab блокує доÑуп до нього протÑгом періоду чаÑу, заданому тут. Це дає можливіÑÑ‚ÑŒ файловій ÑиÑтемі відновитиÑÑ. Репозиторії на шардах (shards) зі збоÑми тимчаÑово не доÑтупні" + msgid "Wiki" msgstr "Wiki" @@ -2054,103 +2318,103 @@ msgid "WikiClone|Clone your wiki" msgstr "Клонувати ваш wiki" msgid "WikiClone|Git Access" -msgstr "" +msgstr "Git доÑтуп" msgid "WikiClone|Install Gollum" -msgstr "" +msgstr "Ð’Ñтановити Gollum" msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:" -msgstr "" +msgstr "РекомендуєтьÑÑ Ð²Ñтановити %{markdown}, з тим щоб GFM функції візуалізувалиÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾:" msgid "WikiClone|Start Gollum and edit locally" -msgstr "" +msgstr "ЗапуÑÑ‚Ñ–Ñ‚ÑŒ Gollum Ñ– редагуйте локально" msgid "WikiEmptyPageError|You are not allowed to create wiki pages" -msgstr "" +msgstr "Ви не можете Ñтворювати вікі-Ñторінки" msgid "WikiHistoricalPage|This is an old version of this page." -msgstr "" +msgstr "Це — Ñтара верÑÑ–Ñ Ñторінки." msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." -msgstr "" +msgstr "Ви можете переглÑнути %{most_recent_link} або перейти на %{history_link}." msgid "WikiHistoricalPage|history" -msgstr "" +msgstr "Ñ–ÑторіÑ" msgid "WikiHistoricalPage|most recent version" -msgstr "" +msgstr "оÑÑ‚Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ" msgid "WikiMarkdownDocs|More examples are in the %{docs_link}" -msgstr "" +msgstr "Більше прикладів знаходитьÑÑ Ð² %{docs_link}" msgid "WikiMarkdownDocs|documentation" -msgstr "" +msgstr "документаціÑ" msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}" -msgstr "" +msgstr "Ð”Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° (нову) Ñторінку, проÑто введіть %{link_example}" msgid "WikiNewPagePlaceholder|how-to-setup" -msgstr "" +msgstr "ІнÑтрукціÑ" msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories." -msgstr "" +msgstr "Порада: можна вказати повний шлÑÑ… до нового файлу. Ми автоматично Ñтворимо вÑÑ– відÑутні каталоги." msgid "WikiNewPageTitle|New Wiki Page" -msgstr "" +msgstr "Ðова Вікі-Ñторінка" msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?" -msgstr "" +msgstr "Ви дійÑно бажаєте видалити цю Ñторінку?" msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs." -msgstr "" +msgstr "ХтоÑÑŒ редагував Ñторінку в той же чаÑ, що Ñ– ви. Будь лаÑка, ознайомтеÑÑ Ð· %{page_link} Ñ– переконайтеÑÑ, ваші зміни не затруть зміни інших." msgid "WikiPageConflictMessage|the page" -msgstr "" +msgstr "Ñторінка" msgid "WikiPageCreate|Create %{page_title}" -msgstr "" +msgstr "Створити %{page_title}" msgid "WikiPageEdit|Update %{page_title}" -msgstr "" +msgstr "Оновити %{page_title}" msgid "WikiPage|Page slug" -msgstr "" +msgstr "ШлÑÑ… Ñторінки" msgid "WikiPage|Write your content or drag files here..." -msgstr "" +msgstr "Ðапишіть текÑÑ‚ або перетÑгніть файли Ñюди..." msgid "Wiki|Create Page" -msgstr "" +msgstr "Створити Ñторінку" msgid "Wiki|Create page" -msgstr "" +msgstr "Створити Ñторінку" msgid "Wiki|Edit Page" msgstr "Редагувати Ñторінку" msgid "Wiki|Empty page" -msgstr "" +msgstr "ÐŸÐ¾Ñ€Ð¾Ð¶Ð½Ñ Ñторінка" msgid "Wiki|More Pages" -msgstr "" +msgstr "Більше Ñторінок" msgid "Wiki|New page" -msgstr "" +msgstr "Ðова Ñторінка" msgid "Wiki|Page history" -msgstr "" +msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñторінки" msgid "Wiki|Page version" -msgstr "" +msgstr "ВерÑÑ–Ñ Ñторінки" msgid "Wiki|Pages" -msgstr "" +msgstr "Сторінки" msgid "Wiki|Wiki Pages" -msgstr "" +msgstr "Вікі-Ñторінки" msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members." -msgstr "" +msgstr "З аналітикою контриб’юторів ви може вивчати активніÑÑ‚ÑŒ в обговореннÑÑ…, запитах на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– подій відправки коду Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— організації Ñ– Ñ—Ñ— учаÑників." msgid "Withdraw Access Request" msgstr "СкаÑувати запит доÑтупу" @@ -2167,9 +2431,21 @@ msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ зв'Ñзок з форка Ð msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "Ви збираєтеÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ проект %{project_name_with_namespace} іншому влаÑнику. Ви ÐБСОЛЮТÐО впевнені?" +msgid "You are on a read-only GitLab instance." +msgstr "Ви знаходитеÑÑ Ð½Ð° інÑтанÑÑ– Gitlab \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\"." + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "Ви знаходитеÑÑ Ð½Ð° інÑтанÑÑ– Gitlab \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\". Якщо ви хочете внеÑти зміни, вам необхідно перейти на %{link_to_primary_node}." + msgid "You can only add files when you are on a branch" msgstr "Ви можете додавати тільки файли, коли перебуваєте в гілці" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "Ви не можете запиÑувати на вторинні інÑтанÑи \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" GitLab Geo. Будь лаÑка викориÑтовуйте %{link_to_primary_node}." + +msgid "You cannot write to this read-only GitLab instance." +msgstr "Ви не можете запиÑувати на цей \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" інÑÑ‚Ð°Ð½Ñ GitLab." + msgid "You have reached your project limit" msgstr "Ви доÑÑгли Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² вашому проекті" @@ -2201,13 +2477,16 @@ msgid "You won't be able to pull or push project code via SSH until you %{add_ss msgstr "Ви не зможете отримувати Ñ– відправлÑти код проекту через SSH поки %{add_ssh_key_link} в ваш профіль." msgid "Your comment will not be visible to the public." -msgstr "" +msgstr "Ваш коментар не буде видимим Ð´Ð»Ñ Ð²ÑÑ–Ñ…." + +msgid "Your groups" +msgstr "Ваші групи" msgid "Your name" msgstr "Ваше ім'Ñ" msgid "Your projects" -msgstr "" +msgstr "Ваші проекти" msgid "commit" msgstr "комміт" @@ -2230,9 +2509,15 @@ msgstr[0] "джерело" msgstr[1] "джерела" msgstr[2] "джерел" -msgid "to help your contributors communicate effectively!" -msgstr "" +msgid "password" +msgstr "пароль" msgid "personal access token" -msgstr "" +msgstr "оÑобиÑтий токен доÑтупу" + +msgid "to help your contributors communicate effectively!" +msgstr "щоб допомогти вашим контриб’юторам ефективно ÑпілкуватиÑÑ!" + +msgid "username" +msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po index caccb246e0b..0d6f0d201c2 100644 --- a/locale/zh_CN/gitlab.po +++ b/locale/zh_CN/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:35-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-06 01:25-0500\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -22,7 +22,7 @@ msgstr[0] "%d 次æ交" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" +msgstr[0] "%d 层" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -31,6 +31,10 @@ msgstr[0] "为æ高页é¢åŠ 载速度åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "ç”± %{commit_author_link} æ交于 %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "%{count} ä½å‚与者" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} 个è½åŽ %{default_branch} 分支的æ交, %{number_commits_ahead} 早超å‰çš„æ交" @@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已 %{failed_attempts} 次å°è¯•è®¿é—®å˜å‚¨å¤±è´¥ï msgid "(checkout the %{link} for information on how to install it)." msgstr "(如需了解更多的安装信æ¯ï¼Œè¯·æŸ¥çœ‹ %{link})" +msgid "+ %{moreCount} more" +msgstr "+ 还有 %{moreCount} æ¡" + +msgid "- show less" +msgstr "- 显示较少" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d æ¡æµæ°´çº¿" @@ -58,7 +68,7 @@ msgid "1st contribution!" msgstr "最高贡献" msgid "2FA enabled" -msgstr "" +msgstr "å¯ç”¨ä¸¤æ¥éªŒè¯" msgid "A collection of graphs regarding Continuous Integration" msgstr "æŒç»é›†æˆæ•°æ®å›¾" @@ -105,9 +115,18 @@ msgstr "新建一个用于推é€æˆ–拉å–çš„ SSH 秘钥到账å·ä¸ã€‚" msgid "Add new directory" msgstr "æ·»åŠ ç›®å½•" +msgid "AdminHealthPageLink|health page" +msgstr "å¥åº·é¡µé¢" + +msgid "Advanced settings" +msgstr "高级设置" + msgid "All" msgstr "全部" +msgid "An error occurred. Please try again." +msgstr "å‘生了错误,请å†è¯•ä¸€æ¬¡ã€‚" + msgid "Appearance" msgstr "外观" @@ -123,6 +142,9 @@ msgstr "确定è¦åˆ 除æ¤æµæ°´çº¿è®¡åˆ’å—?" msgid "Are you sure you want to discard your changes?" msgstr "确定è¦æ”¾å¼ƒä¿®æ”¹å—?" +msgid "Are you sure you want to leave this group?" +msgstr "确定è¦ç¦»å¼€è¿™ä¸ªç¾¤ç»„å—?" + msgid "Are you sure you want to reset registration token?" msgstr "确定è¦é‡ç½®æ³¨å†Œä»¤ç‰Œå—?" @@ -156,18 +178,21 @@ msgstr "自动审查程åºå’Œè‡ªåŠ¨éƒ¨ç½²ç¨‹åºéœ€è¦ %{kubernetes} æ‰èƒ½æ£å¸¸ msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "DevOps 自动化(测试版)" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "å¯ä»¥ä¸ºæ¤é¡¹ç›®å¯ç”¨ DevOps è‡ªåŠ¨åŒ–ã€‚å®ƒå°†æ ¹æ®é¢„定义的 CI/CDé…置自动构建ã€æµ‹è¯•å’Œéƒ¨ç½²åº”用程åºã€‚" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "DevOps 自动化文档" msgid "AutoDevOps|Enable in settings" msgstr "在设置ä¸å¯ç”¨" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "å°†æ ¹æ®é¢„定义的 CI/CD é…置自动构建ã€æµ‹è¯•å’Œéƒ¨ç½²åº”用程åºã€‚" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "想了解更多请访问 %{link_to_documentation}" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "您å¯ä»¥ä¸ºæ¤é¡¹ç›®æ¿€æ´» %{link_to_settings}。" + msgid "Billing" msgstr "è´¦å•" @@ -229,6 +254,9 @@ msgstr[0] "分支" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "已创建分支 <strong>%{branch_name}</strong> 。如需设置自动部署, 请选择åˆé€‚çš„ GitLab CI Yaml 模æ¿å¹¶æ交更改。%{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "分支已有新å˜æ›´" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "æœç´¢åˆ†æ”¯" @@ -439,134 +467,146 @@ msgstr "已跳过" msgid "CiStatus|running" msgstr "è¿è¡Œä¸" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "æ–路器 API" + msgid "Clone repository" msgstr "克隆å˜å‚¨åº“" msgid "Close" msgstr "å…³é—" +msgid "Cluster" +msgstr "集群" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" -msgstr "" +msgstr "必须在æ¤å¸æˆ·ä¸‹åˆ›å»º %{link_to_container_project}" + +msgid "ClusterIntegration|Cluster details" +msgstr "集群详情" msgid "ClusterIntegration|Cluster integration" -msgstr "" +msgstr "集群集æˆ" msgid "ClusterIntegration|Cluster integration is disabled for this project." -msgstr "" +msgstr "æ¤é¡¹ç›®å·²ç¦ç”¨é›†ç¾¤é›†æˆã€‚" msgid "ClusterIntegration|Cluster integration is enabled for this project." -msgstr "" +msgstr "æ¤é¡¹ç›®å·²å¯ç”¨é›†ç¾¤é›†æˆã€‚" msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." -msgstr "" +msgstr "æ¤é¡¹ç›®å·²å¯ç”¨é›†ç¾¤é›†æˆã€‚ç¦ç”¨æ¤é›†æˆä¸ä¼šå½±å“您的集群,它åªä¼šæš‚æ—¶å…³é— GitLab 的连接。" msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." -msgstr "" +msgstr "集群æ£åœ¨ Google Container Engine 上创建..." msgid "ClusterIntegration|Cluster name" -msgstr "" +msgstr "集群å称" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" -msgstr "" +msgstr "集群已在 Google Container Engine 上æˆåŠŸåˆ›å»º" msgid "ClusterIntegration|Copy cluster name" -msgstr "" +msgstr "å¤åˆ¶é›†ç¾¤å称" msgid "ClusterIntegration|Create cluster" -msgstr "" +msgstr "创建集群" msgid "ClusterIntegration|Create new cluster on Google Container Engine" -msgstr "" +msgstr "在 Google Container Engine 上创建新集群" msgid "ClusterIntegration|Enable cluster integration" -msgstr "" +msgstr "å¯ç”¨é›†ç¾¤é›†æˆ" msgid "ClusterIntegration|Google Cloud Platform project ID" -msgstr "" +msgstr "Google 云平å°é¡¹ç›®ID" msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine" msgid "ClusterIntegration|Google Container Engine project" -msgstr "" - -msgid "ClusterIntegration|Google Container Engine" -msgstr "" +msgstr "Google Container Engine 项目" msgid "ClusterIntegration|Learn more about %{link_to_documentation}" -msgstr "" +msgstr "了解详细%{link_to_documentation}" -msgid "ClusterIntegration|See machine types" -msgstr "" +msgid "ClusterIntegration|Machine type" +msgstr "机器类型" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" -msgstr "" +msgstr "ç¡®ä¿æ‚¨çš„å¸æˆ·ç¬¦åˆåˆ›å»ºé›†ç¾¤çš„%{link_to_requirements}" + +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "管ç†æ‚¨çš„ GitLab 项目集群集æˆ" msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" -msgstr "" +msgstr "访问%{link_gke}æ¥ç®¡ç†æ‚¨çš„集群" msgid "ClusterIntegration|Number of nodes" -msgstr "" +msgstr "节点数é‡" + +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "请确ä¿æ‚¨çš„ Google å¸æˆ·ç¬¦åˆä»¥ä¸‹è¦æ±‚:" msgid "ClusterIntegration|Project namespace (optional, unique)" -msgstr "" +msgstr "项目命å空间(å¯é€‰ï¼Œå”¯ä¸€)" + +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "请阅读关于集群集æˆçš„%{link_to_help_page}。" msgid "ClusterIntegration|Remove cluster integration" -msgstr "" +msgstr "åˆ é™¤é›†ç¾¤é›†æˆ" msgid "ClusterIntegration|Remove integration" -msgstr "" +msgstr "åˆ é™¤é›†æˆ" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." -msgstr "" +msgstr "åˆ é™¤é›†ç¾¤é›†æˆå°†åˆ é™¤æ‚¨æ·»åŠ åˆ°æ¤é¡¹ç›®çš„集群é…置。它ä¸ä¼šåˆ 除您的项目。" -msgid "ClusterIntegration|Save changes" -msgstr "" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "查看并编辑集群的详细信æ¯" + +msgid "ClusterIntegration|See machine types" +msgstr "å‚è§æœºå™¨ç±»åž‹" msgid "ClusterIntegration|See your projects" -msgstr "" +msgstr "看到您的项目" msgid "ClusterIntegration|See zones" -msgstr "" +msgstr "查看区域" msgid "ClusterIntegration|Something went wrong on our end." -msgstr "" - -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" +msgstr "å‘生了内部错误" -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" -msgstr "" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" +msgstr "在 Google Container Engine 上创建集群时å‘生错误" msgid "ClusterIntegration|Toggle Cluster" -msgstr "" - -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" +msgstr "切æ¢é›†ç¾¤" msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." -msgstr "" +msgstr "使用与æ¤é¡¹ç›®å…³è”的集群,您å¯ä»¥ä½¿ç”¨å®¡é˜…应用程åºï¼Œéƒ¨ç½²åº”用程åºï¼Œè¿è¡Œæµæ°´çº¿ç‰ç‰ã€‚" msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" -msgstr "" +msgstr "您的å¸æˆ·å¿…须有%{link_to_container_engine}" msgid "ClusterIntegration|Zone" -msgstr "" +msgstr "区域" msgid "ClusterIntegration|access to Google Container Engine" -msgstr "" +msgstr "访问 Google Container Engine" msgid "ClusterIntegration|cluster" -msgstr "" +msgstr "集群" msgid "ClusterIntegration|help page" -msgstr "" +msgstr "帮助页é¢" msgid "ClusterIntegration|meets the requirements" -msgstr "" +msgstr "符åˆè¦æ±‚" msgid "ClusterIntegration|properly configured" -msgstr "" +msgstr "æ£ç¡®é…ç½®" msgid "Comments" msgstr "评论" @@ -575,6 +615,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "æ交" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "æ交 %d 个文件" + msgid "Commit Message" msgstr "æ交消æ¯" @@ -606,49 +650,49 @@ msgid "Compare" msgstr "比较" msgid "Container Registry" -msgstr "" +msgstr "容器注册" msgid "ContainerRegistry|Created" -msgstr "" +msgstr "已创建" msgid "ContainerRegistry|First log in to GitLab’s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" -msgstr "" +msgstr "首先使用您的 GitLab 用户å和密ç 登录 GitLab 的容器注册表。如果您有%{link_2fa},您需è¦ä½¿ç”¨%{link_token}:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" -msgstr "" +msgstr "GitLab 最多支æŒ3个级别的镜åƒå称。以下镜åƒç¤ºä¾‹å¯¹æ‚¨çš„项目有效:" msgid "ContainerRegistry|How to use the Container Registry" -msgstr "" +msgstr "如何使用容器注册表" msgid "ContainerRegistry|Learn more about" -msgstr "" +msgstr "关于更多" msgid "ContainerRegistry|No tags in Container Registry for this container image." -msgstr "" +msgstr "容器注册表ä¸æ²¡æœ‰æ¤å®¹å™¨é•œåƒçš„æ ‡ç¾ã€‚" msgid "ContainerRegistry|Once you log in, you’re free to create and upload a container image using the common %{build} and %{push} commands" -msgstr "" +msgstr "登录åŽæ‚¨å¯ä»¥ä½¿ç”¨é€šç”¨çš„%{build}å’Œ%{push}å‘½ä»¤è‡ªç”±åˆ›å»ºå’Œä¸Šä¼ å®¹å™¨æ˜ åƒ" msgid "ContainerRegistry|Remove repository" -msgstr "" +msgstr "åˆ é™¤å˜å‚¨åº“" msgid "ContainerRegistry|Remove tag" -msgstr "" +msgstr "åˆ é™¤æ ‡ç¾" msgid "ContainerRegistry|Size" -msgstr "" +msgstr "大å°" msgid "ContainerRegistry|Tag" -msgstr "" +msgstr "æ ‡ç¾" msgid "ContainerRegistry|Tag ID" -msgstr "" +msgstr "æ ‡ç¾ ID" msgid "ContainerRegistry|Use different image names" -msgstr "" +msgstr "使用ä¸åŒçš„é•œåƒå称" msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." -msgstr "" +msgstr "å°† Docker 容器注册表集æˆåˆ° GitLab ä¸ï¼Œæ¯ä¸ªé¡¹ç›®éƒ½å¯ä»¥æœ‰è‡ªå·±çš„空间æ¥å˜å‚¨ Docker 的图åƒã€‚" msgid "Contribution guide" msgstr "贡献指å—" @@ -656,6 +700,12 @@ msgstr "贡献指å—" msgid "Contributors" msgstr "贡献者" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "控制æ¤æ¬¡è¦èŠ‚点的 LFS/attachment 的最大并å‘性" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "控制æ¤æ¬¡è¦èŠ‚点的å˜å‚¨åº“的最大并å‘" + msgid "Copy SSH public key to clipboard" msgstr "å¤åˆ¶ SSH 公钥到剪贴æ¿" @@ -677,9 +727,21 @@ msgstr "创建目录" msgid "Create empty bare repository" msgstr "创建空的å˜å‚¨åº“" +msgid "Create file" +msgstr "创建文件" + msgid "Create merge request" msgstr "创建åˆå¹¶è¯·æ±‚" +msgid "Create new branch" +msgstr "创建新分支" + +msgid "Create new directory" +msgstr "创建新目录" + +msgid "Create new file" +msgstr "创建新文件" + msgid "Create new..." msgstr "创建..." @@ -765,6 +827,9 @@ msgstr "目录å称" msgid "Discard changes" msgstr "放弃更改" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "å…³é—循环分æžä»‹ç»æ¡†" + msgid "Dismiss Merge Request promotion" msgstr "å…³é—åˆå¹¶è¯·æ±‚ä¸çš„促销广告" @@ -837,12 +902,18 @@ msgstr "æ¯å‘¨æ‰§è¡Œï¼ˆå‘¨æ—¥å‡Œæ™¨ 4 点)" msgid "Explore projects" msgstr "查看项目" +msgid "Explore public groups" +msgstr "æœç´¢å…¬å…±ç¾¤ç»„" + msgid "Failed to change the owner" msgstr "æ— æ³•å˜æ›´æ‰€æœ‰è€…" msgid "Failed to remove the pipeline schedule" msgstr "æ— æ³•åˆ é™¤æµæ°´çº¿è®¡åˆ’" +msgid "File name" +msgstr "文件å" + msgid "Files" msgstr "文件" @@ -886,9 +957,15 @@ msgstr "GPG 密钥" msgid "Geo Nodes" msgstr "Geo 节点" +msgid "Geo|File sync capacity" +msgstr "文件åŒæ¥å®¹é‡" + msgid "Geo|Groups to replicate" msgstr "è¦å¤åˆ¶çš„群组" +msgid "Geo|Repository sync capacity" +msgstr "å˜å‚¨åº“åŒæ¥å®¹é‡" + msgid "Geo|Select groups to replicate." msgstr "选择è¦å¤åˆ¶çš„群组。" @@ -905,7 +982,7 @@ msgid "GoToYourFork|Fork" msgstr "跳转到派生项目" msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." -msgstr "" +msgstr "Google 身份验è¯ä¸æ˜¯%{link_to_documentation}。如果您想使用æ¤æœåŠ¡ï¼Œè¯·å’¨è¯¢æ‚¨çš„ GitLab 管ç†å‘˜ã€‚" msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "ç¦æ¢ä¸Žå…¶ä»–群组共享 %{group} ä¸çš„项目" @@ -931,6 +1008,51 @@ msgstr "æ— æ³•ç¦ç”¨çˆ¶ç»„的“共享群组é”â€ï¼Œåªæœ‰çˆ¶ç¾¤ç»„的所有者 msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "从 %{ancestor_group_name} ä¸åˆ 除共享群组é”" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "ç¾¤ç»„æ˜¯å‡ ä¸ªé¡¹ç›®çš„é›†åˆã€‚" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "如果您在一个群组下组织项目,它的工作方å¼å°±åƒä¸€ä¸ªæ–‡ä»¶å¤¹ã€‚" + +msgid "GroupsEmptyState|No groups found" +msgstr "找ä¸åˆ°ç¾¤ç»„" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "您å¯ä»¥ç®¡ç†ç¾¤ç»„æˆå‘˜çš„æƒé™å¹¶è®¿é—®ç¾¤ç»„ä¸çš„æ¯ä¸ªé¡¹ç›®ã€‚" + +msgid "GroupsTreeRole|as" +msgstr "çš„" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "您确定è¦ç¦»å¼€ç¾¤ç»„“${this.group.fullName}â€å—?" + +msgid "GroupsTree|Create a project in this group." +msgstr "在æ¤ç¾¤ç»„ä¸åˆ›å»ºä¸€ä¸ªé¡¹ç›®ã€‚" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "在æ¤ç¾¤ç»„ä¸åˆ›å»ºä¸€ä¸ªå群组。" + +msgid "GroupsTree|Edit group" +msgstr "编辑群组" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "æ— æ³•ç¦»å¼€ç¾¤ç»„ã€‚è¯·ç¡®ä¿æ‚¨ä¸æ˜¯å”¯ä¸€çš„所有者。" + +msgid "GroupsTree|Filter by name..." +msgstr "按å称过滤..." + +msgid "GroupsTree|Leave this group" +msgstr "离开这个群组" + +msgid "GroupsTree|Loading groups" +msgstr "åŠ è½½ç¾¤ç»„ä¸" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ä»»ä½•ç¬¦åˆçš„群组" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ä»»ä½•ç¾¤ç»„或项目符åˆæ‚¨çš„æœç´¢" + msgid "Health Check" msgstr "å¥åº·æ£€æŸ¥" @@ -974,6 +1096,12 @@ msgid "Instance" msgid_plural "Instances" msgstr[0] "例å" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "内部 - 任何登录的用户都å¯ä»¥æŸ¥çœ‹è¯¥ç¾¤ç»„和任何内部项目。" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "内部 - å¯ä»¥é€šè¿‡ä»»ä½•ç™»å½•ç”¨æˆ·è®¿é—®è¯¥é¡¹ç›®ã€‚" + msgid "Interval Pattern" msgstr "循环周期" @@ -1041,6 +1169,9 @@ msgstr "了解更多" msgid "Learn more in the|pipeline schedules documentation" msgstr "æµæ°´çº¿è®¡åˆ’文档" +msgid "Leave" +msgstr "离开" + msgid "Leave group" msgstr "退出群组" @@ -1063,6 +1194,12 @@ msgstr "å·²é”定" msgid "Locked Files" msgstr "å·²é”定文件" +msgid "Login" +msgstr "登录" + +msgid "Maximum git storage failures" +msgstr "最大 git å˜å‚¨å¤±è´¥" + msgid "Median" msgstr "ä¸ä½æ•°" @@ -1093,6 +1230,9 @@ msgstr "帮助文档" msgid "Multiple issue boards" msgstr "多个议题看æ¿" +msgid "New Cluster" +msgstr "新集群" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新建议题" @@ -1109,23 +1249,32 @@ msgstr "新建目录" msgid "New file" msgstr "新建文件" +msgid "New group" +msgstr "新群组" + msgid "New issue" msgstr "新建议题" msgid "New merge request" msgstr "新建åˆå¹¶è¯·æ±‚" +msgid "New project" +msgstr "新项目" + msgid "New schedule" msgstr "新建计划" msgid "New snippet" msgstr "新建代ç 片段" +msgid "New subgroup" +msgstr "æ–°å群组" + msgid "New tag" msgstr "æ–°å»ºæ ‡ç¾" msgid "No container images stored for this project. Add one by following the instructions above." -msgstr "" +msgstr "没有为æ¤é¡¹ç›®å˜å‚¨å®¹å™¨é•œåƒã€‚è¯·æŒ‰ç…§ä¸Šè¿°è¯´æ˜Žæ·»åŠ ä¸€ä¸ªã€‚" msgid "No repository" msgstr "没有å˜å‚¨åº“" @@ -1199,6 +1348,12 @@ msgstr "关注" msgid "Notifications" msgstr "通知" +msgid "Number of access attempts" +msgstr "å°è¯•è®¿é—®æ¬¡æ•°" + +msgid "Number of failures before backing off" +msgstr "退出å‰çš„失败次数" + msgid "OfSearchInADropdown|Filter" msgstr "ç›é€‰" @@ -1340,9 +1495,54 @@ msgstr "于阶段" msgid "Preferences" msgstr "å好设置" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "ç§äºº - å¿…é¡»å‘æ¯ä¸ªç”¨æˆ·æ˜Žç¡®æŽˆäºˆé¡¹ç›®è®¿é—®æƒé™ã€‚" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "ç§äºº - 群组åŠå…¶é¡¹ç›®åªèƒ½ç”±æˆå‘˜æŸ¥çœ‹ã€‚" + msgid "Profile" msgstr "用户信æ¯" +msgid "Profiles|Account scheduled for removal." +msgstr "å¸æˆ·åˆ 除计划。" + +msgid "Profiles|Delete Account" +msgstr "åˆ é™¤å¸æˆ·" + +msgid "Profiles|Delete account" +msgstr "åˆ é™¤å¸æˆ·" + +msgid "Profiles|Delete your account?" +msgstr "åˆ é™¤æ‚¨çš„å¸æˆ·?" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "åˆ é™¤å¸æˆ·å…·æœ‰ä»¥ä¸‹æ•ˆæžœï¼š" + +msgid "Profiles|Invalid password" +msgstr "密ç æ— æ•ˆ" + +msgid "Profiles|Invalid username" +msgstr "用户åæ— æ•ˆ" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "键入您的 %{confirmationValue} 以确认:" + +msgid "Profiles|You don't have access to delete this user." +msgstr "æ‚¨æ— æƒåˆ 除æ¤ç”¨æˆ·ã€‚" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "您必须转移所有æƒæˆ–åˆ é™¤è¿™äº›ç¾¤ç»„ï¼Œç„¶åŽæ‰èƒ½åˆ 除您的å¸æˆ·ã€‚" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "您的å¸æˆ·ç›®å‰æ˜¯è¿™äº›ç¾¤ç»„的所有者:" + +msgid "Profiles|your account" +msgstr "您的å¸æˆ·" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "项目 “%{project_name}†æ£åœ¨è¢«åˆ 除。" + msgid "Project '%{project_name}' queued for deletion." msgstr "项目 '%{project_name}' å·²è¿›å…¥åˆ é™¤é˜Ÿåˆ—ã€‚" @@ -1352,9 +1552,6 @@ msgstr "项目 '%{project_name}' 已创建æˆåŠŸã€‚" msgid "Project '%{project_name}' was successfully updated." msgstr "项目 '%{project_name}' 已更新完æˆã€‚" -msgid "Project '%{project_name}' will be deleted." -msgstr "项目 '%{project_name}' å°†è¢«åˆ é™¤ã€‚" - msgid "Project access must be granted explicitly to each user." msgstr "项目访问æƒé™å¿…须明确授æƒç»™æ¯ä¸ªç”¨æˆ·ã€‚" @@ -1412,6 +1609,12 @@ msgstr "æ¤è®¾ç½®åº”用于æœåŠ¡å™¨çº§åˆ«ï¼Œä½†å·²è¢«è¯¥é¡¹ç›®è¦†ç›–。" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "æ¤è®¾ç½®å°†åº”用于所有项目,除éžè¢«ç®¡ç†å‘˜è¦†ç›–。" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "用户åªèƒ½é€šè¿‡è‡ªå·±å·²éªŒè¯çš„电å邮件地å€å°†æ交到æ¤å˜å‚¨åº“ä¸ã€‚" + +msgid "Projects" +msgstr "项目" + msgid "ProjectsDropdown|Frequently visited" msgstr "ç»å¸¸è®¿é—®" @@ -1433,12 +1636,21 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ç¬¦åˆæ¡ä»¶çš„项目" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "æ¤åŠŸèƒ½éœ€è¦æµè§ˆå™¨æ”¯æŒ localStorage" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "公开 - 群组和任何公共项目å¯ä»¥åœ¨æ²¡æœ‰ä»»ä½•èº«ä»½éªŒè¯çš„情况下查看。" + +msgid "Public - The project can be accessed without any authentication." +msgstr "公开 - æ— éœ€ä»»ä½•èº«ä»½éªŒè¯å³å¯è®¿é—®è¯¥é¡¹ç›®ã€‚" + msgid "Push Rules" msgstr "推é€è§„则" msgid "Push events" msgstr "推é€äº‹ä»¶" +msgid "PushRule|Committer restriction" +msgstr "æ交é™åˆ¶" + msgid "Read more" msgstr "了解更多" @@ -1502,6 +1714,9 @@ msgstr "还原æ¤åˆå¹¶è¯·æ±‚" msgid "SSH Keys" msgstr "SSH 密钥" +msgid "Save" +msgstr "ä¿å˜" + msgid "Save changes" msgstr "ä¿å˜ä¿®æ”¹" @@ -1520,6 +1735,15 @@ msgstr "æµæ°´çº¿è®¡åˆ’" msgid "Search branches and tags" msgstr "æœç´¢åˆ†æ”¯å’Œæ ‡ç¾" +msgid "Seconds before reseting failure information" +msgstr "é‡ç½®å¤±è´¥ä¿¡æ¯ç‰å¾…时间(秒)" + +msgid "Seconds to wait after a storage failure" +msgstr "å˜å‚¨å¤±è´¥åŽç‰å¾…时间(秒)" + +msgid "Seconds to wait for a storage access attempt" +msgstr "ç‰å¾…å˜å‚¨è®¿é—®å°è¯•æ—¶é—´(秒)" + msgid "Select Archive Format" msgstr "é€‰æ‹©ä¸‹è½½æ ¼å¼" @@ -1564,16 +1788,19 @@ msgid "Snippets" msgstr "代ç 片段" msgid "Something went wrong on our end." -msgstr "" +msgstr "å‘生了错误。" + +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "å°è¯•æ›´æ”¹ ${this.issuableDisplayName(this.issuableType)} çš„é”定状æ€æ—¶å‘生错误" msgid "Something went wrong while fetching the projects." -msgstr "" +msgstr "拉å–项目时å‘生错误。" msgid "Something went wrong while fetching the registry list." -msgstr "" +msgstr "拉å–注册表列表时å‘生错误。" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "å°è¯•æ›´æ”¹ ${this.issuableDisplayName(this.issuableType)} çš„é”定状æ€æ—¶å‘生错误" +msgid "Sort by" +msgstr "排åº" msgid "SortOptions|Access level, ascending" msgstr "访问级别,å‡åºæŽ’列" @@ -1692,6 +1919,12 @@ msgstr "ç”±æ¤æ›´æ”¹ %{new_merge_request}" msgid "Start the Runner!" msgstr "å¯åŠ¨ Runner!" +msgid "Subgroups" +msgstr "å群组" + +msgid "Subscribe" +msgstr "订阅" + msgid "Switch branch/tag" msgstr "切æ¢åˆ†æ”¯/æ ‡ç¾" @@ -1715,7 +1948,10 @@ msgid "Thanks! Don't show me this again" msgstr "谢谢 ! 请ä¸è¦å†æ˜¾ç¤º" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." -msgstr "GitLab ä¸çš„高级全局æœç´¢åŠŸèƒ½æ˜¯éžå¸¸å¼ºå¤§çš„æœç´¢æœåŠ¡ã€‚您å¯ä»¥æœç´¢å…¶ä»–团队的代ç 以帮助您完善自己的项目ä¸çš„代ç 。从而é¿å…创建é‡å¤çš„代ç 或浪费时间。" +msgstr "GitLab ä¸çš„高级全局æœç´¢åŠŸèƒ½æ˜¯éžå¸¸å¼ºå¤§çš„æœç´¢æœåŠ¡ã€‚您å¯ä»¥æœç´¢å…¶ä»–团队的代ç 以帮助您完善自己项目ä¸çš„代ç 。从而é¿å…创建é‡å¤çš„代ç 或浪费时间。" + +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "æ–路器关é—阈值应该低于故障计数阈值" msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "ç¼–ç 阶段概述了从第一次æ交到创建åˆå¹¶è¯·æ±‚的时间。创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ 到æ¤å¤„。" @@ -1729,6 +1965,15 @@ msgstr "æ´¾ç”Ÿå…³ç³»å·²è¢«åˆ é™¤ã€‚" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "è®®é¢˜é˜¶æ®µæ¦‚è¿°äº†ä»Žåˆ›å»ºè®®é¢˜åˆ°å°†è®®é¢˜æ·»åŠ åˆ°é‡Œç¨‹ç¢‘æˆ–è®®é¢˜çœ‹æ¿æ‰€èŠ±è´¹çš„时间。创建第一个议题åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ 到æ¤å¤„.。" +msgid "The number of attempts GitLab will make to access a storage." +msgstr "GitLab 访问å˜å‚¨çš„次数。" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "GitLab 将临时ç¦ç”¨å¯¹ä¸»å˜å‚¨åˆ†ç‰‡çš„访问" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "GitLab 将完全阻æ¢è®¿é—®å˜å‚¨çš„故障次数。å¯ä»¥åœ¨ç®¡ç†ç•Œé¢%{link_to_health_page}或使用%{api_documentation_link}é‡ç½®æ•…障次数。" + msgid "The phase of the development lifecycle." msgstr "项目生命周期ä¸çš„å„个阶段。" @@ -1759,6 +2004,12 @@ msgstr "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒ msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "测试阶段概述了 GitLab CI 为相关åˆå¹¶è¯·æ±‚è¿è¡Œæ¯ä¸ªæµæ°´çº¿æ‰€éœ€çš„时间。当第一个æµæ°´çº¿è¿è¡Œå®ŒæˆåŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ 到æ¤å¤„。" +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "GitLab å°†ä¿æŒå¤±è´¥ä¿¡æ¯çš„时间(秒)。在æ¤æœŸé—´ä¸å‘生故障时,有关安装的信æ¯å°†é‡ç½®ã€‚" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "GitLab å°†å°è¯•è®¿é—®å˜å‚¨çš„时间(秒)。在æ¤æ—¶é—´ä¹‹åŽå°†å¼•å‘超时错误。" + msgid "The time taken by each data entry gathered by that stage." msgstr "该阶段æ¯æ¡æ•°æ®æ‰€èŠ±çš„时间" @@ -1768,6 +2019,9 @@ msgstr "ä¸ä½æ•°æ˜¯ä¸€ä¸ªæ•°åˆ—ä¸æœ€ä¸é—´çš„值。例如在 3ã€5ã€9 之间ï msgid "There are problems accessing Git storage: " msgstr "访问 Git å˜å‚¨æ—¶å‡ºçŽ°é—®é¢˜ï¼š" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "自您开始编辑åŽ, æ¤åˆ†æ”¯å·²æ›´æ”¹ã€‚您想创建一个新的分支å—?" + msgid "This is a confidential issue." msgstr "这是一个机密议题。" @@ -1950,6 +2204,9 @@ msgstr "已解é”" msgid "Unstar" msgstr "å–æ¶ˆæ˜Ÿæ ‡" +msgid "Unsubscribe" +msgstr "退订" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "å‡çº§æ‚¨çš„方案以å¯ç”¨é«˜çº§å…¨å±€æœç´¢ã€‚" @@ -2013,6 +2270,9 @@ msgstr "如果有新的推é€æˆ–新的议题,Webhook将自动触å‘您设置UR msgid "Weight" msgstr "æƒé‡" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "访问å˜å‚¨å¤±è´¥æ—¶ã€‚ GitLab 将在æ¤å¤„指定的时间内阻æ¢å¯¹å˜å‚¨çš„访问。这å…许文件系统æ¢å¤ã€‚故障分片上的å˜å‚¨åº“æš‚æ—¶æ— æ³•ä½¿ç”¨" + msgid "Wiki" msgstr "Wiki" @@ -2133,9 +2393,21 @@ msgstr "å³å°†åˆ 除与æºé¡¹ç›® %{forked_from_project} 的派生关系。确定 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å³å°† %{project_name_with_namespace} 转移给å¦ä¸€ä¸ªæ‰€æœ‰è€…。确定继ç»å—?" +msgid "You are on a read-only GitLab instance." +msgstr "您在一个åªè¯» GitLab 实例上。" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "您在一个åªè¯»çš„ GitLab 实例上。如果您想进行任何更改,您必须访问%{link_to_primary_node}。" + msgid "You can only add files when you are on a branch" msgstr "åªèƒ½åœ¨åˆ†æ”¯ä¸Šæ·»åŠ 文件" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„辅助 GitLab Geo 实例。请改用%{link_to_primary_node}。" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "您ä¸èƒ½å†™å…¥è¿™ä¸ªåªè¯»çš„ GitLab 实例。" + msgid "You have reached your project limit" msgstr "您已达到项目数é‡é™åˆ¶" @@ -2169,6 +2441,9 @@ msgstr "在账å·ä¸ %{add_ssh_key_link} 之å‰å°†æ— 法通过 SSH 拉å–或推é msgid "Your comment will not be visible to the public." msgstr "您的评论将ä¸ä¼šå…¬å¼€æ˜¾ç¤ºã€‚" +msgid "Your groups" +msgstr "您的群组" + msgid "Your name" msgstr "您的åå—" @@ -2192,9 +2467,15 @@ msgid "parent" msgid_plural "parents" msgstr[0] "父级" +msgid "password" +msgstr "密ç " + +msgid "personal access token" +msgstr "个人访问令牌" + msgid "to help your contributors communicate effectively!" msgstr "帮助您的贡献者进行有效沟通ï¼" -msgid "personal access token" -msgstr "" +msgid "username" +msgstr "用户å" diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 1ae511b4d6d..afb40e8b75f 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 05:36-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:30-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Traditional, Hong Kong\n" "Language: zh_HK\n" @@ -31,6 +31,10 @@ msgstr[0] "為æ高é é¢åŠ 載速度åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "ç”± %{commit_author_link} æ交於 %{commit_timeago}" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已訪å•æ¤ä¸»æ©Ÿå¤±æ•— %{failed_attempts} 次" msgid "(checkout the %{link} for information on how to install it)." msgstr "(想了解更多的安è£è¨Šæ¯è«‹æŸ¥çœ‹ %{link})" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d æ¢æµæ°´ç·š" @@ -105,9 +115,18 @@ msgstr "新增壹個用於推é€æˆ–拉å–çš„ SSH 秘鑰到賬號ä¸ã€‚" msgid "Add new directory" msgstr "æ·»åŠ æ–°ç›®éŒ„" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "全部" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "" @@ -123,6 +142,9 @@ msgstr "確定è¦åˆªé™¤æ¤æµæ°´ç·šè¨ˆåŠƒå—Žï¼Ÿ" msgid "Are you sure you want to discard your changes?" msgstr "確定è¦æ”¾æ£„修改嗎?" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "確定è¦é‡ç½®è¨»å†Šä»¤ç‰Œå—Žï¼Ÿ" @@ -156,18 +178,21 @@ msgstr "" msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "" msgid "AutoDevOps|Enable in settings" msgstr "" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "" @@ -229,6 +254,9 @@ msgstr[0] "分支" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "分支 <strong>%{branch_name}</strong> 已創建。如需è¨ç½®è‡ªå‹•éƒ¨ç½²ï¼Œ è«‹é¸æ“‡åˆé©çš„ GitLab CI Yaml 模æ¿ä½µæ交更改。%{link_to_autodeploy_doc}" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "æœç´¢åˆ†æ”¯" @@ -439,15 +467,24 @@ msgstr "已跳éŽ" msgid "CiStatus|running" msgstr "é‹è¡Œä¸" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "" msgid "Close" msgstr "" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -490,27 +527,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -520,7 +563,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -532,18 +578,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -575,6 +615,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "æ交" +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" + msgid "Commit Message" msgstr "" @@ -656,6 +700,12 @@ msgstr "è²¢ç»æŒ‡å—" msgid "Contributors" msgstr "è²¢ç»è€…" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "" @@ -677,9 +727,21 @@ msgstr "創建目錄" msgid "Create empty bare repository" msgstr "創建空的å˜å„²åº«" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "創建åˆä½µè«‹æ±‚" +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "創建..." @@ -765,6 +827,9 @@ msgstr "目錄å稱" msgid "Discard changes" msgstr "放棄更改" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "" @@ -837,12 +902,18 @@ msgstr "æ¯é€±åŸ·è¡Œï¼ˆå‘¨æ—¥æ·©æ™¨ 4 點)" msgid "Explore projects" msgstr "" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有者" msgid "Failed to remove the pipeline schedule" msgstr "無法刪除æµæ°´ç·šè¨ˆåŠƒ" +msgid "File name" +msgstr "" + msgid "Files" msgstr "文件" @@ -886,9 +957,15 @@ msgstr "" msgid "Geo Nodes" msgstr "" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "" @@ -931,6 +1008,51 @@ msgstr "" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "å¥åº·æª¢æŸ¥ (Health Check)" @@ -974,6 +1096,12 @@ msgid "Instance" msgid_plural "Instances" msgstr[0] "" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "循環週期" @@ -1041,6 +1169,9 @@ msgstr "了解更多" msgid "Learn more in the|pipeline schedules documentation" msgstr "æµæ°´ç·šè¨ˆåŠƒæ–‡æª”" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "退出群組" @@ -1063,6 +1194,12 @@ msgstr "" msgid "Locked Files" msgstr "" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "ä¸ä½æ•¸" @@ -1093,6 +1230,9 @@ msgstr "幫助文檔" msgid "Multiple issue boards" msgstr "" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新建è°é¡Œ" @@ -1109,18 +1249,27 @@ msgstr "新增目錄" msgid "New file" msgstr "新增文件" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "æ–°è°é¡Œ" msgid "New merge request" msgstr "新增åˆä½µè«‹æ±‚" +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "新增计划" msgid "New snippet" msgstr "新代碼片段" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "新增標籤" @@ -1199,6 +1348,12 @@ msgstr "關注" msgid "Notifications" msgstr "" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "篩é¸" @@ -1340,9 +1495,54 @@ msgstr "於階段" msgid "Preferences" msgstr "" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "é …ç›® '%{project_name}' 已進入刪除隊列。" @@ -1352,9 +1552,6 @@ msgstr "é …ç›® '%{project_name}' 已創建æˆåŠŸã€‚" msgid "Project '%{project_name}' was successfully updated." msgstr "é …ç›® '%{project_name}' 已更新完æˆã€‚" -msgid "Project '%{project_name}' will be deleted." -msgstr "é …ç›® '%{project_name}' 將被刪除。" - msgid "Project access must be granted explicitly to each user." msgstr "é …ç›®è¨ªå•æ¬Šé™å¿…é ˆæ˜Žç¢ºæŽˆæ¬Šçµ¦æ¯å€‹ç”¨æˆ¶ã€‚" @@ -1412,6 +1609,12 @@ msgstr "" msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "" @@ -1433,12 +1636,21 @@ msgstr "" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "" msgid "Push events" msgstr "推é€äº‹ä»¶ (push event) " +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "了解更多" @@ -1502,6 +1714,9 @@ msgstr "還原æ¤åˆä½µè«‹æ±‚" msgid "SSH Keys" msgstr "" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "" @@ -1520,6 +1735,15 @@ msgstr "æµæ°´ç·šè¨ˆåŠƒ" msgid "Search branches and tags" msgstr "æœç´¢åˆ†æ”¯å’Œæ¨™ç±¤" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "é¸æ“‡ä¸‹è¼‰æ ¼å¼" @@ -1566,13 +1790,16 @@ msgstr "" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgid "Sort by" msgstr "" msgid "SortOptions|Access level, ascending" @@ -1692,6 +1919,12 @@ msgstr "ç”±æ¤æ›´æ”¹ %{new_merge_request}" msgid "Start the Runner!" msgstr "é‹ä½œ Runner!" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "切æ›åˆ†æ”¯/標籤" @@ -1717,6 +1950,9 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "編碼階段概述了從第壹次æ交到創建åˆä½µè«‹æ±‚的時間。創建第壹個åˆä½µè«‹æ±‚å¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ åˆ°æ¤è™•ã€‚" @@ -1729,6 +1965,15 @@ msgstr "派生關係已被刪除。" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "è°é¡ŒéšŽæ®µæ¦‚述了從創建è°é¡Œåˆ°å°‡è°é¡Œæ·»åŠ 到è£ç¨‹ç¢‘或è°é¡Œçœ‹æ¿æ‰€èŠ±è²»çš„時間。創建第壹個è°é¡Œå¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ 到æ¤è™•.。" +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "é …ç›®ç”Ÿå‘½é€±æœŸä¸çš„å„個階段。" @@ -1759,6 +2004,12 @@ msgstr "é 發布階段概述了åˆä½µè«‹æ±‚çš„åˆä½µåˆ°éƒ¨ç½²ä»£ç¢¼åˆ°ç”Ÿç”¢ç’° msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "測試階段概述了 GitLab CI 為相關åˆä½µè«‹æ±‚é‹è¡Œæ¯å€‹æµæ°´ç·šæ‰€éœ€çš„時間。當第壹個æµæ°´ç·šé‹è¡Œå®Œæˆå¾Œï¼Œæ•¸æ“šå°‡è‡ªå‹•æ·»åŠ 到æ¤è™•ã€‚" +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "該階段æ¯æ¢æ•¸æ“šæ‰€èŠ±çš„時間" @@ -1768,6 +2019,9 @@ msgstr "ä¸ä½æ•¸æ˜¯å£¹å€‹æ•¸åˆ—ä¸æœ€ä¸é–“的值。例如在 3ã€5ã€9 之間ï msgid "There are problems accessing Git storage: " msgstr "è¨ªå• Git å˜å„²æ™‚出ç¾å•é¡Œï¼š" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "" @@ -1950,6 +2204,9 @@ msgstr "" msgid "Unstar" msgstr "å–消星標" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "" @@ -2013,6 +2270,9 @@ msgstr "" msgid "Weight" msgstr "" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "" @@ -2133,9 +2393,21 @@ msgstr "å³å°‡åˆªé™¤èˆ‡æºé …ç›® %{forked_from_project} 的派生關系。確定 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å³å°‡ %{project_name_with_namespace} 轉義給å¦å£¹å€‹æ‰€æœ‰è€…。確定繼續嗎?" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "åªèƒ½åœ¨åˆ†æ”¯ä¸Šæ·»åŠ 文件" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "您已é”åˆ°é …ç›®æ•¸é‡é™åˆ¶" @@ -2169,6 +2441,9 @@ msgstr "åœ¨è³¬è™Ÿä¸ %{add_ssh_key_link} 之å‰å°‡ç„¡æ³•é€šéŽ SSH 拉å–或推é msgid "Your comment will not be visible to the public." msgstr "" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "您的åå—" @@ -2192,9 +2467,15 @@ msgid "parent" msgid_plural "parents" msgstr[0] "父級" -msgid "to help your contributors communicate effectively!" +msgid "password" msgstr "" msgid "personal access token" msgstr "" +msgid "to help your contributors communicate effectively!" +msgstr "" + +msgid "username" +msgstr "" + diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po index d0c852f35ff..efef86671f0 100644 --- a/locale/zh_TW/gitlab.po +++ b/locale/zh_TW/gitlab.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: gitlab-ee\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-06 22:39+0200\n" -"PO-Revision-Date: 2017-10-17 13:01-0400\n" +"POT-Creation-Date: 2017-11-02 14:42+0100\n" +"PO-Revision-Date: 2017-11-03 12:30-0400\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Language-Team: Chinese Traditional\n" "Language: zh_TW\n" @@ -22,7 +22,7 @@ msgstr[0] "%d 個更動 (commit)" msgid "%d layer" msgid_plural "%d layers" -msgstr[0] "" +msgstr[0] "%d 個圖層" msgid "%s additional commit has been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues." @@ -31,6 +31,10 @@ msgstr[0] "å› æ•ˆèƒ½è€ƒé‡ï¼Œä¸é¡¯ç¤º %s 個更動 (commit)。" msgid "%{commit_author_link} committed %{commit_timeago}" msgstr "%{commit_author_link} 在 %{commit_timeago} é€äº¤" +msgid "%{count} participant" +msgid_plural "%{count} participants" +msgstr[0] "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "%{number_commits_behind} 個è½å¾Œ %{default_branch} 分支的修訂版æ交,%{number_commits_ahead} 個超å‰çš„修訂版æ交" @@ -50,6 +54,12 @@ msgstr[0] "%{storage_name}:已å˜å–æ¤ä¸»æ©Ÿå¤±æ•— %{failed_attempts} 次" msgid "(checkout the %{link} for information on how to install it)." msgstr "(如何安è£è«‹åƒé–± %{link})" +msgid "+ %{moreCount} more" +msgstr "" + +msgid "- show less" +msgstr "" + msgid "1 pipeline" msgid_plural "%d pipelines" msgstr[0] "%d æ¢æµæ°´ç·š" @@ -58,7 +68,7 @@ msgid "1st contribution!" msgstr "第一次å”作" msgid "2FA enabled" -msgstr "" +msgstr "已啟用雙é‡èªè‰" msgid "A collection of graphs regarding Continuous Integration" msgstr "æŒçºŒæ•´åˆ (CI) 相關的圖表" @@ -105,9 +115,18 @@ msgstr "請先新增 SSH 金鑰到您的個人帳號,æ‰èƒ½ä½¿ç”¨ SSH ä¾†ä¸Šå‚ msgid "Add new directory" msgstr "新增目錄" +msgid "AdminHealthPageLink|health page" +msgstr "" + +msgid "Advanced settings" +msgstr "" + msgid "All" msgstr "全部" +msgid "An error occurred. Please try again." +msgstr "" + msgid "Appearance" msgstr "外觀" @@ -123,6 +142,9 @@ msgstr "確定è¦åˆªé™¤æ¤æµæ°´ç·š (pipeline) 排程嗎?" msgid "Are you sure you want to discard your changes?" msgstr "確定è¦æ”¾æ£„修改嗎?" +msgid "Are you sure you want to leave this group?" +msgstr "" + msgid "Are you sure you want to reset registration token?" msgstr "確定è¦é‡ç½®è¨»å†Šæ†‘è‰ (registration token) 嗎?" @@ -156,18 +178,21 @@ msgstr "è‡ªå‹•å¯©æŸ¥ç¨‹åº & 自動部屬程åºéœ€è¦ %{kubernetes} æ‰èƒ½æ£å¸¸ msgid "AutoDevOps|Auto DevOps (Beta)" msgstr "DevOps 自動化 (測試版)" -msgid "AutoDevOps|Auto DevOps can be activated for this project. It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." -msgstr "為æ¤å°ˆæ¡ˆå•Ÿç”¨ 「DevOps 自動化ã€ã€‚ 它將ä¾æ“šé è¨çš„ CI/CD é…置自動構建ã€æ¸¬è©¦ã€éƒ¨å±¬æ‡‰ç”¨ç¨‹å¼ã€‚" - msgid "AutoDevOps|Auto DevOps documentation" msgstr "「DevOps 自動化〠文件" msgid "AutoDevOps|Enable in settings" msgstr "在è¨å®šä¸å•Ÿç”¨" +msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." +msgstr "" + msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgstr "了解更多於 %{link_to_documentation}" +msgid "AutoDevOps|You can activate %{link_to_settings} for this project." +msgstr "" + msgid "Billing" msgstr "方案" @@ -229,6 +254,9 @@ msgstr[0] "分支 (branch) " msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgstr "已建立分支 (branch) <strong>%{branch_name}</strong> 。如è¦è¨å®šè‡ªå‹•éƒ¨ç½²ï¼Œ è«‹é¸æ“‡åˆé©çš„ GitLab CI Yaml 模æ¿ï¼Œç„¶å¾Œè¨˜å¾—è¦é€äº¤ (commit) 您的編輯內容。%{link_to_autodeploy_doc}\n" +msgid "Branch has changed" +msgstr "" + msgid "BranchSwitcherPlaceholder|Search branches" msgstr "æœå°‹åˆ†æ”¯ (branches)" @@ -439,15 +467,24 @@ msgstr "已跳éŽ" msgid "CiStatus|running" msgstr "執行ä¸" +msgid "CircuitBreakerApiLink|circuitbreaker api" +msgstr "" + msgid "Clone repository" msgstr "克隆倉庫" msgid "Close" msgstr "關閉" +msgid "Cluster" +msgstr "" + msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgstr "" +msgid "ClusterIntegration|Cluster details" +msgstr "" + msgid "ClusterIntegration|Cluster integration" msgstr "" @@ -490,27 +527,33 @@ msgstr "" msgid "ClusterIntegration|Google Container Engine project" msgstr "" -msgid "ClusterIntegration|Google Container Engine" -msgstr "" - msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgstr "" -msgid "ClusterIntegration|See machine types" +msgid "ClusterIntegration|Machine type" msgstr "" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgstr "" +msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" +msgstr "" + msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgstr "" msgid "ClusterIntegration|Number of nodes" msgstr "" +msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgstr "" + msgid "ClusterIntegration|Project namespace (optional, unique)" msgstr "" +msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." +msgstr "" + msgid "ClusterIntegration|Remove cluster integration" msgstr "" @@ -520,7 +563,10 @@ msgstr "" msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgstr "" -msgid "ClusterIntegration|Save changes" +msgid "ClusterIntegration|See and edit the details for your cluster" +msgstr "" + +msgid "ClusterIntegration|See machine types" msgstr "" msgid "ClusterIntegration|See your projects" @@ -532,18 +578,12 @@ msgstr "" msgid "ClusterIntegration|Something went wrong on our end." msgstr "" -msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine." -msgstr "" - -msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" +msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgstr "" msgid "ClusterIntegration|Toggle Cluster" msgstr "" -msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." -msgstr "" - msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgstr "" @@ -575,6 +615,10 @@ msgid "Commit" msgid_plural "Commits" msgstr[0] "更動記錄 (commit) " +msgid "Commit %d file" +msgid_plural "Commit %d files" +msgstr[0] "" + msgid "Commit Message" msgstr "更動訊æ¯" @@ -656,6 +700,12 @@ msgstr "å”作指å—" msgid "Contributors" msgstr "å”作者" +msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "Copy SSH public key to clipboard" msgstr "複製 SSH 公鑰到剪貼簿" @@ -677,9 +727,21 @@ msgstr "建立目錄" msgid "Create empty bare repository" msgstr "建立一個新的 bare repository" +msgid "Create file" +msgstr "" + msgid "Create merge request" msgstr "發出åˆä½µè«‹æ±‚ (merge request) " +msgid "Create new branch" +msgstr "" + +msgid "Create new directory" +msgstr "" + +msgid "Create new file" +msgstr "" + msgid "Create new..." msgstr "建立..." @@ -765,6 +827,9 @@ msgstr "目錄å稱" msgid "Discard changes" msgstr "放棄修改" +msgid "Dismiss Cycle Analytics introduction box" +msgstr "" + msgid "Dismiss Merge Request promotion" msgstr "關閉åˆä½µè«‹æ±‚ä¸çš„促銷廣告" @@ -837,12 +902,18 @@ msgstr "æ¯é€±åŸ·è¡Œï¼ˆé€±æ—¥æ·©æ™¨ 四點)" msgid "Explore projects" msgstr "ç€è¦½é …ç›®" +msgid "Explore public groups" +msgstr "" + msgid "Failed to change the owner" msgstr "無法變更所有權" msgid "Failed to remove the pipeline schedule" msgstr "無法刪除æµæ°´ç·š (pipeline) 排程" +msgid "File name" +msgstr "" + msgid "Files" msgstr "檔案" @@ -886,9 +957,15 @@ msgstr "GPG 金鑰" msgid "Geo Nodes" msgstr "Geo 節點" +msgid "Geo|File sync capacity" +msgstr "" + msgid "Geo|Groups to replicate" msgstr "è¦è¤‡è£½çš„群組" +msgid "Geo|Repository sync capacity" +msgstr "" + msgid "Geo|Select groups to replicate." msgstr "é¸æ“‡æ¬²è¤‡è£½ä¹‹ç¾¤çµ„。" @@ -931,6 +1008,51 @@ msgstr "無法調用父組的 \"共享群組鎖\",僅父群組的所有者æ‰å msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgstr "從 %{ancestor_group_name} ä¸ç§»é™¤å…±äº«ç¾¤çµ„鎖" +msgid "GroupsEmptyState|A group is a collection of several projects." +msgstr "" + +msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." +msgstr "" + +msgid "GroupsEmptyState|No groups found" +msgstr "" + +msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." +msgstr "" + +msgid "GroupsTreeRole|as" +msgstr "" + +msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" +msgstr "" + +msgid "GroupsTree|Create a project in this group." +msgstr "" + +msgid "GroupsTree|Create a subgroup in this group." +msgstr "" + +msgid "GroupsTree|Edit group" +msgstr "" + +msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." +msgstr "" + +msgid "GroupsTree|Filter by name..." +msgstr "" + +msgid "GroupsTree|Leave this group" +msgstr "" + +msgid "GroupsTree|Loading groups" +msgstr "" + +msgid "GroupsTree|Sorry, no groups matched your search" +msgstr "" + +msgid "GroupsTree|Sorry, no groups or projects matched your search" +msgstr "" + msgid "Health Check" msgstr "å¥åº·æª¢æŸ¥" @@ -974,6 +1096,12 @@ msgid "Instance" msgid_plural "Instances" msgstr[0] "實例" +msgid "Internal - The group and any internal projects can be viewed by any logged in user." +msgstr "" + +msgid "Internal - The project can be accessed by any logged in user." +msgstr "" + msgid "Interval Pattern" msgstr "循環週期" @@ -1041,6 +1169,9 @@ msgstr "了解更多" msgid "Learn more in the|pipeline schedules documentation" msgstr "æµæ°´ç·š (pipeline) 排程說明文件" +msgid "Leave" +msgstr "" + msgid "Leave group" msgstr "退出群組" @@ -1063,6 +1194,12 @@ msgstr "鎖定" msgid "Locked Files" msgstr "被鎖定檔案" +msgid "Login" +msgstr "" + +msgid "Maximum git storage failures" +msgstr "" + msgid "Median" msgstr "ä¸ä½æ•¸" @@ -1093,6 +1230,9 @@ msgstr "å¥åº·æª¢æŸ¥" msgid "Multiple issue boards" msgstr "多個å•é¡Œçœ‹æ¿" +msgid "New Cluster" +msgstr "" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "建立è°é¡Œ (issue) " @@ -1109,18 +1249,27 @@ msgstr "新增目錄" msgid "New file" msgstr "新增檔案" +msgid "New group" +msgstr "" + msgid "New issue" msgstr "新增è°é¡Œ (issue) " msgid "New merge request" msgstr "新增åˆä½µè«‹æ±‚ (merge request) " +msgid "New project" +msgstr "" + msgid "New schedule" msgstr "新增排程" msgid "New snippet" msgstr "æ–°æ–‡å—片段" +msgid "New subgroup" +msgstr "" + msgid "New tag" msgstr "新增標籤" @@ -1199,6 +1348,12 @@ msgstr "關注" msgid "Notifications" msgstr "通知" +msgid "Number of access attempts" +msgstr "" + +msgid "Number of failures before backing off" +msgstr "" + msgid "OfSearchInADropdown|Filter" msgstr "篩é¸" @@ -1340,9 +1495,54 @@ msgstr "於階段" msgid "Preferences" msgstr "å好è¨å®š" +msgid "Private - Project access must be granted explicitly to each user." +msgstr "" + +msgid "Private - The group and its projects can only be viewed by members." +msgstr "" + msgid "Profile" msgstr "個人資料" +msgid "Profiles|Account scheduled for removal." +msgstr "" + +msgid "Profiles|Delete Account" +msgstr "" + +msgid "Profiles|Delete account" +msgstr "" + +msgid "Profiles|Delete your account?" +msgstr "" + +msgid "Profiles|Deleting an account has the following effects:" +msgstr "" + +msgid "Profiles|Invalid password" +msgstr "" + +msgid "Profiles|Invalid username" +msgstr "" + +msgid "Profiles|Type your %{confirmationValue} to confirm:" +msgstr "" + +msgid "Profiles|You don't have access to delete this user." +msgstr "" + +msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." +msgstr "" + +msgid "Profiles|Your account is currently an owner in these groups:" +msgstr "" + +msgid "Profiles|your account" +msgstr "" + +msgid "Project '%{project_name}' is in the process of being deleted." +msgstr "" + msgid "Project '%{project_name}' queued for deletion." msgstr "專案 '%{project_name}' å·²åŠ å…¥åˆªé™¤ä½‡åˆ—ã€‚" @@ -1352,9 +1552,6 @@ msgstr "專案 '%{project_name}' 建立完æˆã€‚" msgid "Project '%{project_name}' was successfully updated." msgstr "專案 '%{project_name}' 更新完æˆã€‚" -msgid "Project '%{project_name}' will be deleted." -msgstr "專案 '%{project_name}' 將被刪除。" - msgid "Project access must be granted explicitly to each user." msgstr "專案權é™å¿…é ˆä¸€ä¸€æŒ‡æ´¾çµ¦æ¯å€‹ä½¿ç”¨è€…。" @@ -1412,6 +1609,12 @@ msgstr "æ¤è¨å®šå·²ç¶“套用於伺æœå™¨ç´šåˆ¥ï¼Œä½†å·²ç¶“在這個專案被覆 msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgstr "æ¤è¨å®šå°‡å¥—用於所有專案,除éžè¢«ç®¡ç†å“¡è¦†å¯«ã€‚" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + +msgid "Projects" +msgstr "" + msgid "ProjectsDropdown|Frequently visited" msgstr "經常使用" @@ -1433,12 +1636,21 @@ msgstr "抱æ‰ï¼Œæ²’有符åˆæœå°‹æ¢ä»¶çš„專案" msgid "ProjectsDropdown|This feature requires browser localStorage support" msgstr "æ¤åŠŸèƒ½éœ€è¦ç€è¦½å™¨æ”¯æ´ localStorage" +msgid "Public - The group and any public projects can be viewed without any authentication." +msgstr "" + +msgid "Public - The project can be accessed without any authentication." +msgstr "" + msgid "Push Rules" msgstr "æŽ¨é€ [Push] è¦å‰‡" msgid "Push events" msgstr "æŽ¨é€ (push) 事件" +msgid "PushRule|Committer restriction" +msgstr "" + msgid "Read more" msgstr "çžè§£æ›´å¤š" @@ -1502,6 +1714,9 @@ msgstr "還原æ¤åˆä½µè«‹æ±‚ (merge request) " msgid "SSH Keys" msgstr "SSH 金鑰" +msgid "Save" +msgstr "" + msgid "Save changes" msgstr "儲å˜è®Šæ›´" @@ -1520,6 +1735,15 @@ msgstr "æµæ°´ç·š (pipeline) 排程" msgid "Search branches and tags" msgstr "æœå°‹åˆ†æ”¯ (branch) 和標籤" +msgid "Seconds before reseting failure information" +msgstr "" + +msgid "Seconds to wait after a storage failure" +msgstr "" + +msgid "Seconds to wait for a storage access attempt" +msgstr "" + msgid "Select Archive Format" msgstr "é¸æ“‡ä¸‹è¼‰æ ¼å¼" @@ -1566,14 +1790,17 @@ msgstr "æ–‡å—片段" msgid "Something went wrong on our end." msgstr "" +msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" +msgstr "æœ‰å€‹åœ°æ–¹å‡ºéŒ¯äº†ï¼Œå› ç‚ºä»–å˜—è©¦åŽ»è®Šæ›´ ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。" + msgid "Something went wrong while fetching the projects." msgstr "" msgid "Something went wrong while fetching the registry list." msgstr "" -msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" -msgstr "æœ‰å€‹åœ°æ–¹å‡ºéŒ¯äº†ï¼Œå› ç‚ºä»–å˜—è©¦åŽ»è®Šæ›´ ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。" +msgid "Sort by" +msgstr "" msgid "SortOptions|Access level, ascending" msgstr "訪å•ç´šåˆ¥ã€å‡å†ªæŽ’列" @@ -1692,6 +1919,12 @@ msgstr "以這些改動建立一個新的 %{new_merge_request} " msgid "Start the Runner!" msgstr "å•Ÿå‹• Runner!" +msgid "Subgroups" +msgstr "" + +msgid "Subscribe" +msgstr "" + msgid "Switch branch/tag" msgstr "切æ›åˆ†æ”¯ (branch) 或標籤" @@ -1717,6 +1950,9 @@ msgstr "æ„Ÿè¬ï¼è«‹ä¸è¦å†æ¬¡é¡¯ç¤º" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "GitLab 的進階全局æœå°‹åŠŸèƒ½æ˜¯éžå¸¸å¼·å¤§çš„æœå°‹æœå‹™ã€‚您å¯ä»¥æœå°‹å…¶ä»–åœ˜éšŠçš„ä»£ç¢¼ä»¥å¹«åŠ©æ‚¨å®Œå–„è‡ªå·±é …ç›®ä¸çš„代碼。從而é¿å…建立é‡è¤‡çš„代碼浪費時間。" +msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" +msgstr "" + msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgstr "程å¼é–‹ç™¼éšŽæ®µé¡¯ç¤ºå¾žç¬¬ä¸€æ¬¡æ›´å‹•è¨˜éŒ„ (commit) 到建立åˆä½µè«‹æ±‚ (merge request) 的時間。建立第一個åˆä½µè«‹æ±‚後,資料將自動填入。" @@ -1729,6 +1965,15 @@ msgstr "åˆ†æ”¯èˆ‡ä¸»å¹¹é–“çš„é—œè¯ (fork relationship) 已被刪除。" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "è°é¡Œ (issue) 階段顯示從è°é¡Œå»ºç«‹åˆ°è¨å®šé‡Œç¨‹ç¢‘所花的時間,或是è°é¡Œè¢«åˆ†é¡žåˆ°è°é¡Œçœ‹æ¿ (issue board) ä¸æ‰€èŠ±çš„時間。建立第一個è°é¡Œå¾Œï¼Œè³‡æ–™å°‡è‡ªå‹•å¡«å…¥ã€‚" +msgid "The number of attempts GitLab will make to access a storage." +msgstr "" + +msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" +msgstr "" + +msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." +msgstr "" + msgid "The phase of the development lifecycle." msgstr "專案開發週期的å„個階段。" @@ -1759,6 +2004,12 @@ msgstr "試營é‹æ®µé¡¯ç¤ºå¾žåˆä½µè«‹æ±‚ (merge request) 被åˆä½µå¾Œè‡³éƒ¨ç½²ç msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running." msgstr "測試階段顯示相關åˆä½µè«‹æ±‚ (merge request) çš„æµæ°´ç·š (pipeline) 所花的時間。當第一個æµæ°´ç·š (pipeline) 執行完畢後,資料將自動填入。" +msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." +msgstr "" + +msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." +msgstr "" + msgid "The time taken by each data entry gathered by that stage." msgstr "該階段ä¸æ¯ä¸€å€‹è³‡æ–™é …目所花的時間。" @@ -1768,6 +2019,9 @@ msgstr "ä¸ä½æ•¸æ˜¯ä¸€å€‹æ•¸åˆ—ä¸æœ€ä¸é–“的值。例如在 3ã€5ã€9 之間ï msgid "There are problems accessing Git storage: " msgstr "å˜å– Git 儲å˜ç©ºé–“時出ç¾å•é¡Œï¼š" +msgid "This branch has changed since you started editing. Would you like to create a new branch?" +msgstr "" + msgid "This is a confidential issue." msgstr "這是個隱密å•é¡Œã€‚" @@ -1950,6 +2204,9 @@ msgstr "已解鎖" msgid "Unstar" msgstr "å–消收è—" +msgid "Unsubscribe" +msgstr "" + msgid "Upgrade your plan to activate Advanced Global Search." msgstr "å‡ç´šæ‚¨çš„方案以啟用進階全局æœå°‹ã€‚" @@ -2013,6 +2270,9 @@ msgstr "如果有新的推é€æˆ–新的议题,Webhook 将自动触å‘您设置 msgid "Weight" msgstr "權é‡" +msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" +msgstr "" + msgid "Wiki" msgstr "Wiki" @@ -2133,9 +2393,21 @@ msgstr "å°‡è¦åˆªé™¤æœ¬åˆ†æ”¯å°ˆæ¡ˆèˆ‡ä¸»å¹¹ %{forked_from_project} 的所有關 msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?" msgstr "å°‡è¦æŠŠ %{project_name_with_namespace} 的所有權轉移給å¦ä¸€å€‹äººã€‚真的「確定ã€è¦é€™éº¼åšå—Žï¼Ÿ" +msgid "You are on a read-only GitLab instance." +msgstr "" + +msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." +msgstr "" + msgid "You can only add files when you are on a branch" msgstr "åªèƒ½åœ¨åˆ†æ”¯ (branch) 上建立檔案" +msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." +msgstr "" + +msgid "You cannot write to this read-only GitLab instance." +msgstr "" + msgid "You have reached your project limit" msgstr "您已é”到專案數é‡é™åˆ¶" @@ -2169,6 +2441,9 @@ msgstr "åœ¨å€‹äººå¸³è™Ÿä¸ %{add_ssh_key_link} 之å‰ï¼Œ 將無法使用 SSH 上 msgid "Your comment will not be visible to the public." msgstr "ä½ çš„ç•™è¨€å°‡ä¸æœƒè¢«å…¬é–‹ã€‚" +msgid "Your groups" +msgstr "" + msgid "Your name" msgstr "您的åå—" @@ -2192,9 +2467,15 @@ msgid "parent" msgid_plural "parents" msgstr[0] "上層" +msgid "password" +msgstr "" + +msgid "personal access token" +msgstr "" + msgid "to help your contributors communicate effectively!" msgstr "å¹«åŠ©ä½ çš„è²¢ç»è€…進行有效的æºé€šï¼" -msgid "personal access token" +msgid "username" msgstr "" diff --git a/qa/qa/scenario/test/integration/mattermost.rb b/qa/qa/scenario/test/integration/mattermost.rb index 9a84e5c8fd8..59d7dcd3d23 100644 --- a/qa/qa/scenario/test/integration/mattermost.rb +++ b/qa/qa/scenario/test/integration/mattermost.rb @@ -7,7 +7,7 @@ module QA # including staging and on-premises installation. # class Mattermost < Scenario::Entrypoint - tags :core, :mattermost + tags :mattermost def perform(address, mattermost, *files) Runtime::Scenario.mattermost = mattermost diff --git a/scripts/static-analysis b/scripts/static-analysis index aeefb2bc96f..51a2fd81a79 100755 --- a/scripts/static-analysis +++ b/scripts/static-analysis @@ -11,31 +11,40 @@ tasks = [ %w[bundle exec rake brakeman], %w[bundle exec license_finder], %w[yarn run eslint], - %w[bundle exec rubocop --require rubocop-rspec], + %w[bundle exec rubocop --parallel], %w[scripts/lint-conflicts.sh], %w[bundle exec rake gettext:lint], %w[scripts/lint-changelog-yaml] ] failed_tasks = tasks.reduce({}) do |failures, task| - output, status = Gitlab::Popen.popen(task) + start = Time.now + puts + puts "$ #{task.join(' ')}" - puts "Running: #{task.join(' ')}" - puts output + output, status = Gitlab::Popen.popen(task) + puts "==> Finished in #{Time.now - start} seconds" + puts failures[task.join(' ')] = output unless status.zero? failures end +puts +puts '===================================================' +puts +puts + if failed_tasks.empty? puts 'All static analyses passed successfully.' else - puts "\n===================================================\n\n" - puts "Some static analyses failed:" + puts 'Some static analyses failed:' failed_tasks.each do |failed_task, output| - puts "\n**** #{failed_task} failed with the following error:\n\n" + puts + puts "**** #{failed_task} failed with the following error:" + puts puts output end diff --git a/spec/controllers/metrics_controller_spec.rb b/spec/controllers/metrics_controller_spec.rb index 4aed2a25baa..9e8a37171ec 100644 --- a/spec/controllers/metrics_controller_spec.rb +++ b/spec/controllers/metrics_controller_spec.rb @@ -67,7 +67,8 @@ describe MetricsController do it 'returns proper response' do get :index - expect(response.status).to eq(404) + expect(response.status).to eq(200) + expect(response.body).to eq("# Metrics are disabled, see: http://test.host/help/administration/monitoring/prometheus/gitlab_metrics#gitlab-prometheus-metrics\n") end end end diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 8016176110e..4dbbaecdd6d 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -861,7 +861,7 @@ describe Projects::IssuesController do end it 'delegates the update of the todos count cache to TodoService' do - expect_any_instance_of(TodoService).to receive(:destroy_issue).with(issue, owner).once + expect_any_instance_of(TodoService).to receive(:destroy_issuable).with(issue, owner).once delete :destroy, namespace_id: project.namespace, project_id: project, id: issue.iid end diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 14021b8ca50..bfdad85c082 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -456,7 +456,7 @@ describe Projects::MergeRequestsController do end it 'delegates the update of the todos count cache to TodoService' do - expect_any_instance_of(TodoService).to receive(:destroy_merge_request).with(merge_request, owner).once + expect_any_instance_of(TodoService).to receive(:destroy_issuable).with(merge_request, owner).once delete :destroy, namespace_id: project.namespace, project_id: project, id: merge_request.iid end diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb index 7c4a22c94c2..cc6cef63b47 100644 --- a/spec/factories/merge_requests.rb +++ b/spec/factories/merge_requests.rb @@ -83,10 +83,10 @@ FactoryGirl.define do target_project = merge_request.target_project source_project = merge_request.source_project - # Fake `write_ref` if we don't have repository + # Fake `fetch_ref!` if we don't have repository # We have too many existing tests replying on this behaviour unless [target_project, source_project].all?(&:repository_exists?) - allow(merge_request).to receive(:write_ref) + allow(merge_request).to receive(:fetch_ref!) end end diff --git a/spec/features/issues/create_branch_merge_request_spec.rb b/spec/features/issues/create_branch_merge_request_spec.rb index 546dc7e8a49..edea95c6699 100644 --- a/spec/features/issues/create_branch_merge_request_spec.rb +++ b/spec/features/issues/create_branch_merge_request_spec.rb @@ -64,6 +64,19 @@ feature 'Create Branch/Merge Request Dropdown on issue page', :feature, :js do end end + context 'when merge requests are disabled' do + before do + project.project_feature.update(merge_requests_access_level: 0) + + visit project_issue_path(project, issue) + end + + it 'shows only create branch button' do + expect(page).not_to have_button('Create a merge request') + expect(page).to have_button('Create a branch') + end + end + context 'when issue is confidential' do it 'disables the create branch button' do issue = create(:issue, :confidential, project: project) diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb index d5536fcb22b..8a80b88da5d 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -1,96 +1,6 @@ require 'spec_helper' describe EventsHelper do - describe '#event_note' do - let(:user) { build(:user) } - - before do - allow(helper).to receive(:current_user).and_return(user) - end - - it 'displays one line of plain text without alteration' do - input = 'A short, plain note' - expect(helper.event_note(input)).to match(input) - expect(helper.event_note(input)).not_to match(/\.\.\.\z/) - end - - it 'displays inline code' do - input = 'A note with `inline code`' - expected = 'A note with <code>inline code</code>' - - expect(helper.event_note(input)).to match(expected) - end - - it 'truncates a note with multiple paragraphs' do - input = "Paragraph 1\n\nParagraph 2" - expected = 'Paragraph 1...' - - expect(helper.event_note(input)).to match(expected) - end - - it 'displays the first line of a code block' do - input = "```\nCode block\nwith two lines\n```" - expected = %r{<pre.+><code><span class="line">Code block\.\.\.</span>\n</code></pre>} - - expect(helper.event_note(input)).to match(expected) - end - - it 'truncates a single long line of text' do - text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars - input = text * 4 - expected = (text * 2).sub(/.{3}/, '...') - - expect(helper.event_note(input)).to match(expected) - end - - it 'preserves a link href when link text is truncated' do - text = 'The quick brown fox jumped over the lazy dog' # 44 chars - input = "#{text}#{text}#{text} " # 133 chars - link_url = 'http://example.com/foo/bar/baz' # 30 chars - input << link_url - expected_link_text = 'http://example...</a>' - - expect(helper.event_note(input)).to match(link_url) - expect(helper.event_note(input)).to match(expected_link_text) - end - - it 'preserves code color scheme' do - input = "```ruby\ndef test\n 'hello world'\nend\n```" - expected = "\n<pre class=\"code highlight js-syntax-highlight ruby\">" \ - "<code><span class=\"line\"><span class=\"k\">def</span> <span class=\"nf\">test</span>...</span>\n" \ - "</code></pre>" - expect(helper.event_note(input)).to eq(expected) - end - - it 'preserves data-src for lazy images' do - input = "![ImageTest](/uploads/test.png)" - image_url = "data-src=\"/uploads/test.png\"" - expect(helper.event_note(input)).to match(image_url) - end - - context 'labels formatting' do - let(:input) { 'this should be ~label_1' } - - def format_event_note(project) - create(:label, title: 'label_1', project: project) - - helper.event_note(input, { project: project }) - end - - it 'preserves style attribute for a label that can be accessed by current_user' do - project = create(:project, :public) - - expect(format_event_note(project)).to match(/span class=.*style=.*/) - end - - it 'does not style a label that can not be accessed by current_user' do - project = create(:project, :private) - - expect(format_event_note(project)).to eq("<p>#{input}</p>") - end - end - end - describe '#event_commit_title' do let(:message) { "foo & bar " + "A" * 70 + "\n" + "B" * 80 } subject { helper.event_commit_title(message) } diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb index 03d706062b7..62ea6d48542 100644 --- a/spec/helpers/markup_helper_spec.rb +++ b/spec/helpers/markup_helper_spec.rb @@ -67,7 +67,7 @@ describe MarkupHelper do describe 'without redacted attribute' do it 'renders the markdown value' do - expect(Banzai).to receive(:render_field).with(commit, attribute).and_call_original + expect(Banzai).to receive(:render_field).with(commit, attribute, {}).and_call_original helper.markdown_field(commit, attribute) end @@ -252,38 +252,141 @@ describe MarkupHelper do end describe '#first_line_in_markdown' do - it 'truncates Markdown properly' do - text = "@#{user.username}, can you look at this?\nHello world\n" - actual = first_line_in_markdown(text, 100, project: project) + shared_examples_for 'common markdown examples' do + let(:project_base) { build(:project, :repository) } - doc = Nokogiri::HTML.parse(actual) + it 'displays inline code' do + object = create_object('Text with `inline code`') + expected = 'Text with <code>inline code</code>' - # Make sure we didn't create invalid markup - expect(doc.errors).to be_empty + expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected) + end - # Leading user link - expect(doc.css('a').length).to eq(1) - expect(doc.css('a')[0].attr('href')).to eq user_path(user) - expect(doc.css('a')[0].text).to eq "@#{user.username}" + it 'truncates the text with multiple paragraphs' do + object = create_object("Paragraph 1\n\nParagraph 2") + expected = 'Paragraph 1...' - expect(doc.content).to eq "@#{user.username}, can you look at this?..." - end + expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected) + end - it 'truncates Markdown with emoji properly' do - text = "foo :wink:\nbar :grinning:" - actual = first_line_in_markdown(text, 100, project: project) + it 'displays the first line of a code block' do + object = create_object("```\nCode block\nwith two lines\n```") + expected = %r{<pre.+><code><span class="line">Code block\.\.\.</span>\n</code></pre>} - doc = Nokogiri::HTML.parse(actual) + expect(first_line_in_markdown(object, attribute, 100, project: project)).to match(expected) + end - # Make sure we didn't create invalid markup - # But also account for the 2 errors caused by the unknown `gl-emoji` elements - expect(doc.errors.length).to eq(2) + it 'truncates a single long line of text' do + text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars + object = create_object(text * 4) + expected = (text * 2).sub(/.{3}/, '...') + + expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(expected) + end + + it 'preserves a link href when link text is truncated' do + text = 'The quick brown fox jumped over the lazy dog' # 44 chars + input = "#{text}#{text}#{text} " # 133 chars + link_url = 'http://example.com/foo/bar/baz' # 30 chars + input << link_url + object = create_object(input) + expected_link_text = 'http://example...</a>' + + expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(link_url) + expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(expected_link_text) + end + + it 'preserves code color scheme' do + object = create_object("```ruby\ndef test\n 'hello world'\nend\n```") + expected = "\n<pre class=\"code highlight js-syntax-highlight ruby\">" \ + "<code><span class=\"line\"><span class=\"k\">def</span> <span class=\"nf\">test</span>...</span>\n" \ + "</code></pre>" + + expect(first_line_in_markdown(object, attribute, 150, project: project)).to eq(expected) + end + + it 'preserves data-src for lazy images' do + object = create_object("![ImageTest](/uploads/test.png)") + image_url = "data-src=\".*/uploads/test.png\"" + + expect(first_line_in_markdown(object, attribute, 150, project: project)).to match(image_url) + end + + context 'labels formatting' do + let(:label_title) { 'this should be ~label_1' } + + def create_and_format_label(project) + create(:label, title: 'label_1', project: project) + object = create_object(label_title, project: project) - expect(doc.css('gl-emoji').length).to eq(2) - expect(doc.css('gl-emoji')[0].attr('data-name')).to eq 'wink' - expect(doc.css('gl-emoji')[1].attr('data-name')).to eq 'grinning' + first_line_in_markdown(object, attribute, 150, project: project) + end - expect(doc.content).to eq "foo 😉\nbar 😀" + it 'preserves style attribute for a label that can be accessed by current_user' do + project = create(:project, :public) + + expect(create_and_format_label(project)).to match(/span class=.*style=.*/) + end + + it 'does not style a label that can not be accessed by current_user' do + project = create(:project, :private) + + expect(create_and_format_label(project)).to eq("<p>#{label_title}</p>") + end + end + + it 'truncates Markdown properly' do + object = create_object("@#{user.username}, can you look at this?\nHello world\n") + actual = first_line_in_markdown(object, attribute, 100, project: project) + + doc = Nokogiri::HTML.parse(actual) + + # Make sure we didn't create invalid markup + expect(doc.errors).to be_empty + + # Leading user link + expect(doc.css('a').length).to eq(1) + expect(doc.css('a')[0].attr('href')).to eq user_path(user) + expect(doc.css('a')[0].text).to eq "@#{user.username}" + + expect(doc.content).to eq "@#{user.username}, can you look at this?..." + end + + it 'truncates Markdown with emoji properly' do + object = create_object("foo :wink:\nbar :grinning:") + actual = first_line_in_markdown(object, attribute, 100, project: project) + + doc = Nokogiri::HTML.parse(actual) + + # Make sure we didn't create invalid markup + # But also account for the 2 errors caused by the unknown `gl-emoji` elements + expect(doc.errors.length).to eq(2) + + expect(doc.css('gl-emoji').length).to eq(2) + expect(doc.css('gl-emoji')[0].attr('data-name')).to eq 'wink' + expect(doc.css('gl-emoji')[1].attr('data-name')).to eq 'grinning' + + expect(doc.content).to eq "foo 😉\nbar 😀" + end + end + + context 'when the asked attribute can be redacted' do + include_examples 'common markdown examples' do + let(:attribute) { :note } + def create_object(title, project: project_base) + build(:note, note: title, project: project) + end + end + end + + context 'when the asked attribute can not be redacted' do + include_examples 'common markdown examples' do + let(:attribute) { :body } + def create_object(title, project: project_base) + issue = build(:issue, title: title) + build(:todo, :done, project: project_base, author: user, target: issue) + end + end end end diff --git a/spec/initializers/8_metrics_spec.rb b/spec/initializers/8_metrics_spec.rb index 4e6052a9f80..80c77057065 100644 --- a/spec/initializers/8_metrics_spec.rb +++ b/spec/initializers/8_metrics_spec.rb @@ -3,7 +3,6 @@ require 'spec_helper' describe 'instrument_classes' do let(:config) { double(:config) } - let(:unicorn_sampler) { double(:unicorn_sampler) } let(:influx_sampler) { double(:influx_sampler) } before do @@ -11,9 +10,7 @@ describe 'instrument_classes' do allow(config).to receive(:instrument_methods) allow(config).to receive(:instrument_instance_method) allow(config).to receive(:instrument_instance_methods) - allow(Gitlab::Metrics::UnicornSampler).to receive(:initialize_instance).and_return(unicorn_sampler) - allow(Gitlab::Metrics::InfluxSampler).to receive(:initialize_instance).and_return(influx_sampler) - allow(unicorn_sampler).to receive(:start) + allow(Gitlab::Metrics::Samplers::InfluxSampler).to receive(:initialize_instance).and_return(influx_sampler) allow(influx_sampler).to receive(:start) allow(Gitlab::Application).to receive(:configure) end diff --git a/spec/javascripts/fixtures/search_autocomplete.html.haml b/spec/javascripts/fixtures/search_autocomplete.html.haml index 7785120da5b..0421ed2182f 100644 --- a/spec/javascripts/fixtures/search_autocomplete.html.haml +++ b/spec/javascripts/fixtures/search_autocomplete.html.haml @@ -8,3 +8,4 @@ %input#search.search-input.dropdown-menu-toggle .dropdown-menu.dropdown-select .dropdown-content + %input{ type: "hidden", class: "js-search-project-options" } diff --git a/spec/javascripts/lib/utils/datefix_spec.js b/spec/javascripts/lib/utils/datefix_spec.js index 0b9fde2be67..e58ac4300ba 100644 --- a/spec/javascripts/lib/utils/datefix_spec.js +++ b/spec/javascripts/lib/utils/datefix_spec.js @@ -1,4 +1,4 @@ -import { pad, parsePikadayDate, pikadayToString } from '~/lib/utils/datefix'; +import { pad, pikadayToString } from '~/lib/utils/datefix'; describe('datefix', () => { describe('pad', () => { @@ -16,9 +16,7 @@ describe('datefix', () => { }); describe('parsePikadayDate', () => { - it('should return a UTC date', () => { - expect(parsePikadayDate('2020-01-29')).toEqual(new Date('2020-01-29')); - }); + // removed because of https://gitlab.com/gitlab-org/gitlab-ce/issues/39834 }); describe('pikadayToString', () => { diff --git a/spec/javascripts/search_autocomplete_spec.js b/spec/javascripts/search_autocomplete_spec.js index 5e55a5d2686..a2394857b82 100644 --- a/spec/javascripts/search_autocomplete_spec.js +++ b/spec/javascripts/search_autocomplete_spec.js @@ -57,6 +57,10 @@ import '~/lib/utils/common_utils'; } }; + const disableProjectIssues = function() { + document.querySelector('.js-search-project-options').setAttribute('data-issues-disabled', true); + }; + // Mock `gl` object in window for dashboard specific page. App code will need it. mockDashboardOptions = function() { window.gl || (window.gl = {}); @@ -91,18 +95,20 @@ import '~/lib/utils/common_utils'; assertLinks = function(list, issuesPath, mrsPath) { var a1, a2, a3, a4, issuesAssignedToMeLink, issuesIHaveCreatedLink, mrsAssignedToMeLink, mrsIHaveCreatedLink; - issuesAssignedToMeLink = issuesPath + "/?assignee_username=" + userName; - issuesIHaveCreatedLink = issuesPath + "/?author_username=" + userName; + if (issuesPath) { + issuesAssignedToMeLink = issuesPath + "/?assignee_username=" + userName; + issuesIHaveCreatedLink = issuesPath + "/?author_username=" + userName; + a1 = "a[href='" + issuesAssignedToMeLink + "']"; + a2 = "a[href='" + issuesIHaveCreatedLink + "']"; + expect(list.find(a1).length).toBe(1); + expect(list.find(a1).text()).toBe('Issues assigned to me'); + expect(list.find(a2).length).toBe(1); + expect(list.find(a2).text()).toBe("Issues I've created"); + } mrsAssignedToMeLink = mrsPath + "/?assignee_username=" + userName; mrsIHaveCreatedLink = mrsPath + "/?author_username=" + userName; - a1 = "a[href='" + issuesAssignedToMeLink + "']"; - a2 = "a[href='" + issuesIHaveCreatedLink + "']"; a3 = "a[href='" + mrsAssignedToMeLink + "']"; a4 = "a[href='" + mrsIHaveCreatedLink + "']"; - expect(list.find(a1).length).toBe(1); - expect(list.find(a1).text()).toBe('Issues assigned to me'); - expect(list.find(a2).length).toBe(1); - expect(list.find(a2).text()).toBe("Issues I've created"); expect(list.find(a3).length).toBe(1); expect(list.find(a3).text()).toBe('Merge requests assigned to me'); expect(list.find(a4).length).toBe(1); @@ -153,6 +159,14 @@ import '~/lib/utils/common_utils'; list = widget.wrap.find('.dropdown-menu').find('ul'); return assertLinks(list, projectIssuesPath, projectMRsPath); }); + it('should show only Project mergeRequest dropdown menu items when project issues are disabled', function() { + addBodyAttributes('project'); + disableProjectIssues(); + mockProjectOptions(); + widget.searchInput.triggerHandler('focus'); + const list = widget.wrap.find('.dropdown-menu').find('ul'); + assertLinks(list, null, projectMRsPath); + }); it('should not show category related menu if there is text in the input', function() { var link, list; addBodyAttributes('project'); diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js index d4e134583c7..fd7aa332d17 100644 --- a/spec/javascripts/test_bundle.js +++ b/spec/javascripts/test_bundle.js @@ -11,6 +11,12 @@ const isHeadlessChrome = /\bHeadlessChrome\//.test(navigator.userAgent); Vue.config.devtools = !isHeadlessChrome; Vue.config.productionTip = false; +let hasVueWarnings = false; +Vue.config.warnHandler = (msg, vm, trace) => { + hasVueWarnings = true; + fail(`${msg}${trace}`); +}; + Vue.use(VueResource); // enable test fixtures @@ -34,11 +40,6 @@ window.addEventListener('unhandledrejection', (event) => { console.error(event.reason.stack || event.reason); }); -const checkUnhandledPromiseRejections = (done) => { - expect(hasUnhandledPromiseRejections).toBe(false); - done(); -}; - // HACK: Chrome 59 disconnects if there are too many synchronous tests in a row // because it appears to lock up the thread that communicates to Karma's socket // This async beforeEach gets called on every spec and releases the JS thread long @@ -47,17 +48,6 @@ const checkUnhandledPromiseRejections = (done) => { // to run our unit tests. beforeEach(done => done()); -beforeAll(() => { - const origError = console.error; - spyOn(console, 'error').and.callFake((message) => { - if (/^\[Vue warn\]/.test(message)) { - fail(message); - } else { - origError(message); - } - }); -}); - const builtinVueHttpInterceptors = Vue.http.interceptors.slice(); beforeEach(() => { @@ -80,8 +70,22 @@ testsContext.keys().forEach(function (path) { } }); -it('has no unhandled Promise rejections', (done) => { - setTimeout(checkUnhandledPromiseRejections(done), 1000); +describe('test errors', () => { + beforeAll((done) => { + if (hasUnhandledPromiseRejections || hasVueWarnings) { + setTimeout(done, 1000); + } else { + done(); + } + }); + + it('has no unhandled Promise rejections', () => { + expect(hasUnhandledPromiseRejections).toBe(false); + }); + + it('has no Vue warnings', () => { + expect(hasVueWarnings).toBe(false); + }); }); // if we're generating coverage reports, make sure to include all files so diff --git a/spec/javascripts/vue_shared/components/markdown/field_spec.js b/spec/javascripts/vue_shared/components/markdown/field_spec.js index 65c49b9f30b..24209be83fe 100644 --- a/spec/javascripts/vue_shared/components/markdown/field_spec.js +++ b/spec/javascripts/vue_shared/components/markdown/field_spec.js @@ -1,6 +1,12 @@ import Vue from 'vue'; import fieldComponent from '~/vue_shared/components/markdown/field.vue'; +function assertMarkdownTabs(isWrite, writeLink, previewLink, vm) { + expect(writeLink.parentNode.classList.contains('active')).toEqual(isWrite); + expect(previewLink.parentNode.classList.contains('active')).toEqual(!isWrite); + expect(vm.$el.querySelector('.md-preview').style.display).toEqual(isWrite ? 'none' : ''); +} + describe('Markdown field component', () => { let vm; @@ -39,6 +45,7 @@ describe('Markdown field component', () => { describe('markdown preview', () => { let previewLink; + let writeLink; beforeEach(() => { spyOn(Vue.http, 'post').and.callFake(() => new Promise((resolve) => { @@ -53,7 +60,8 @@ describe('Markdown field component', () => { }); })); - previewLink = vm.$el.querySelector('.nav-links li:nth-child(2) a'); + previewLink = vm.$el.querySelector('.nav-links .js-preview-link'); + writeLink = vm.$el.querySelector('.nav-links .js-write-link'); }); it('sets preview link as active', (done) => { @@ -105,6 +113,23 @@ describe('Markdown field component', () => { done(); }, 0); }); + + it('clicking already active write or preview link does nothing', (done) => { + writeLink.click(); + Vue.nextTick() + .then(() => assertMarkdownTabs(true, writeLink, previewLink, vm)) + .then(() => writeLink.click()) + .then(() => Vue.nextTick()) + .then(() => assertMarkdownTabs(true, writeLink, previewLink, vm)) + .then(() => previewLink.click()) + .then(() => Vue.nextTick()) + .then(() => assertMarkdownTabs(false, writeLink, previewLink, vm)) + .then(() => previewLink.click()) + .then(() => Vue.nextTick()) + .then(() => assertMarkdownTabs(false, writeLink, previewLink, vm)) + .then(done) + .catch(done.fail); + }); }); describe('markdown buttons', () => { diff --git a/spec/javascripts/vue_shared/components/markdown/header_spec.js b/spec/javascripts/vue_shared/components/markdown/header_spec.js index 7110ff36937..edebd822295 100644 --- a/spec/javascripts/vue_shared/components/markdown/header_spec.js +++ b/spec/javascripts/vue_shared/components/markdown/header_spec.js @@ -43,11 +43,13 @@ describe('Markdown field header component', () => { it('emits toggle markdown event when clicking preview', () => { spyOn(vm, '$emit'); - vm.$el.querySelector('li:nth-child(2) a').click(); + vm.$el.querySelector('.js-preview-link').click(); - expect( - vm.$emit, - ).toHaveBeenCalledWith('toggle-markdown'); + expect(vm.$emit).toHaveBeenCalledWith('preview-markdown'); + + vm.$el.querySelector('.js-write-link').click(); + + expect(vm.$emit).toHaveBeenCalledWith('write-markdown'); }); it('blurs preview link after click', (done) => { diff --git a/spec/lib/banzai/commit_renderer_spec.rb b/spec/lib/banzai/commit_renderer_spec.rb index 049d025a5b9..84adaebdcbe 100644 --- a/spec/lib/banzai/commit_renderer_spec.rb +++ b/spec/lib/banzai/commit_renderer_spec.rb @@ -10,7 +10,7 @@ describe Banzai::CommitRenderer do described_class::ATTRIBUTES.each do |attr| expect_any_instance_of(Banzai::ObjectRenderer).to receive(:render).with([project.commit], attr).once.and_call_original - expect(Banzai::Renderer).to receive(:cacheless_render_field).with(project.commit, attr) + expect(Banzai::Renderer).to receive(:cacheless_render_field).with(project.commit, attr, {}) end described_class.render([project.commit], project, user) diff --git a/spec/lib/banzai/filter/absolute_link_filter_spec.rb b/spec/lib/banzai/filter/absolute_link_filter_spec.rb new file mode 100644 index 00000000000..a3ad056efcd --- /dev/null +++ b/spec/lib/banzai/filter/absolute_link_filter_spec.rb @@ -0,0 +1,58 @@ +require 'spec_helper' + +describe Banzai::Filter::AbsoluteLinkFilter do + def filter(doc, context = {}) + described_class.call(doc, context) + end + + context 'with html links' do + context 'if only_path is false' do + let(:only_path_context) do + { only_path: false } + end + let(:fake_url) { 'http://www.example.com' } + + before do + allow(Gitlab.config.gitlab).to receive(:url).and_return(fake_url) + end + + context 'has the .gfm class' do + it 'converts a relative url into absolute' do + doc = filter(link('/foo', 'gfm'), only_path_context) + expect(doc.at_css('a')['href']).to eq "#{fake_url}/foo" + end + + it 'does not change the url if it already absolute' do + doc = filter(link("#{fake_url}/foo", 'gfm'), only_path_context) + expect(doc.at_css('a')['href']).to eq "#{fake_url}/foo" + end + + context 'if relative_url_root is set' do + it 'joins the url without without doubling the path' do + allow(Gitlab.config.gitlab).to receive(:url).and_return("#{fake_url}/gitlab/") + doc = filter(link("/gitlab/foo", 'gfm'), only_path_context) + expect(doc.at_css('a')['href']).to eq "#{fake_url}/gitlab/foo" + end + end + end + + context 'has not the .gfm class' do + it 'does not convert a relative url into absolute' do + doc = filter(link('/foo'), only_path_context) + expect(doc.at_css('a')['href']).to eq '/foo' + end + end + end + + context 'if only_path is not false' do + it 'does not convert a relative url into absolute' do + expect(filter(link('/foo', 'gfm')).at_css('a')['href']).to eq '/foo' + expect(filter(link('/foo')).at_css('a')['href']).to eq '/foo' + end + end + end + + def link(path, css_class = '') + %(<a class="#{css_class}" href="#{path}">example</a>) + end +end diff --git a/spec/lib/banzai/note_renderer_spec.rb b/spec/lib/banzai/note_renderer_spec.rb deleted file mode 100644 index 32764bee5eb..00000000000 --- a/spec/lib/banzai/note_renderer_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'spec_helper' - -describe Banzai::NoteRenderer do - describe '.render' do - it 'renders a Note' do - note = double(:note) - project = double(:project) - wiki = double(:wiki) - user = double(:user) - - expect(Banzai::ObjectRenderer).to receive(:new) - .with(project, user, - requested_path: 'foo', - project_wiki: wiki, - ref: 'bar') - .and_call_original - - expect_any_instance_of(Banzai::ObjectRenderer) - .to receive(:render).with([note], :note) - - described_class.render([note], project, user, 'foo', wiki, 'bar') - end - end -end diff --git a/spec/lib/banzai/object_renderer_spec.rb b/spec/lib/banzai/object_renderer_spec.rb index b172a1b718c..074d521a5c6 100644 --- a/spec/lib/banzai/object_renderer_spec.rb +++ b/spec/lib/banzai/object_renderer_spec.rb @@ -22,7 +22,7 @@ describe Banzai::ObjectRenderer do end it 'retrieves field content using Banzai::Renderer.render_field' do - expect(Banzai::Renderer).to receive(:render_field).with(object, :note).and_call_original + expect(Banzai::Renderer).to receive(:render_field).with(object, :note, {}).and_call_original renderer.render([object], :note) end @@ -68,7 +68,7 @@ describe Banzai::ObjectRenderer do end it 'retrieves field content using Banzai::Renderer.cacheless_render_field' do - expect(Banzai::Renderer).to receive(:cacheless_render_field).with(commit, :title).and_call_original + expect(Banzai::Renderer).to receive(:cacheless_render_field).with(commit, :title, {}).and_call_original renderer.render([commit], :title) end diff --git a/spec/lib/banzai/renderer_spec.rb b/spec/lib/banzai/renderer_spec.rb index 81a04a2d46d..650cecfc778 100644 --- a/spec/lib/banzai/renderer_spec.rb +++ b/spec/lib/banzai/renderer_spec.rb @@ -18,7 +18,7 @@ describe Banzai::Renderer do let(:commit) { create(:project, :repository).commit } it 'returns cacheless render field' do - expect(renderer).to receive(:cacheless_render_field).with(commit, :title) + expect(renderer).to receive(:cacheless_render_field).with(commit, :title, {}) renderer.render_field(commit, :title) end diff --git a/spec/lib/gitlab/checks/change_access_spec.rb b/spec/lib/gitlab/checks/change_access_spec.rb index 6c25b7349e1..74a24a4424b 100644 --- a/spec/lib/gitlab/checks/change_access_spec.rb +++ b/spec/lib/gitlab/checks/change_access_spec.rb @@ -11,13 +11,13 @@ describe Gitlab::Checks::ChangeAccess do let(:changes) { { oldrev: oldrev, newrev: newrev, ref: ref } } let(:protocol) { 'ssh' } - subject do + subject(:change_access) do described_class.new( changes, project: project, user_access: user_access, protocol: protocol - ).exec + ) end before do @@ -26,7 +26,7 @@ describe Gitlab::Checks::ChangeAccess do context 'without failed checks' do it "doesn't raise an error" do - expect { subject }.not_to raise_error + expect { subject.exec }.not_to raise_error end end @@ -34,7 +34,7 @@ describe Gitlab::Checks::ChangeAccess do it 'raises an error' do expect(user_access).to receive(:can_do_action?).with(:push_code).and_return(false) - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to this project.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to this project.') end end @@ -45,7 +45,7 @@ describe Gitlab::Checks::ChangeAccess do allow(user_access).to receive(:can_do_action?).with(:push_code).and_return(true) expect(user_access).to receive(:can_do_action?).with(:admin_project).and_return(false) - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to change existing tags on this project.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to change existing tags on this project.') end context 'with protected tag' do @@ -61,7 +61,7 @@ describe Gitlab::Checks::ChangeAccess do let(:newrev) { '0000000000000000000000000000000000000000' } it 'is prevented' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be deleted/) + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be deleted/) end end @@ -70,7 +70,7 @@ describe Gitlab::Checks::ChangeAccess do let(:newrev) { '54fcc214b94e78d7a41a9a8fe6d87a5e59500e51' } it 'is prevented' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be updated/) + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /cannot be updated/) end end end @@ -81,14 +81,14 @@ describe Gitlab::Checks::ChangeAccess do let(:ref) { 'refs/tags/v9.1.0' } it 'prevents creation below access level' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /allowed to create this tag as it is protected/) + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /allowed to create this tag as it is protected/) end context 'when user has access' do let!(:protected_tag) { create(:protected_tag, :developers_can_create, project: project, name: 'v*') } it 'allows tag creation' do - expect { subject }.not_to raise_error + expect { subject.exec }.not_to raise_error end end end @@ -101,7 +101,7 @@ describe Gitlab::Checks::ChangeAccess do let(:ref) { 'refs/heads/master' } it 'raises an error' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'The default branch of a project cannot be deleted.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'The default branch of a project cannot be deleted.') end end @@ -114,7 +114,7 @@ describe Gitlab::Checks::ChangeAccess do it 'raises an error if the user is not allowed to do forced pushes to protected branches' do expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true) - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to force push code to a protected branch on this project.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to force push code to a protected branch on this project.') end it 'raises an error if the user is not allowed to merge to protected branches' do @@ -122,13 +122,13 @@ describe Gitlab::Checks::ChangeAccess do expect(user_access).to receive(:can_merge_to_branch?).and_return(false) expect(user_access).to receive(:can_push_to_branch?).and_return(false) - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to merge code into protected branches on this project.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to merge code into protected branches on this project.') end it 'raises an error if the user is not allowed to push to protected branches' do expect(user_access).to receive(:can_push_to_branch?).and_return(false) - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to protected branches on this project.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to push code to protected branches on this project.') end context 'branch deletion' do @@ -137,7 +137,7 @@ describe Gitlab::Checks::ChangeAccess do context 'if the user is not allowed to delete protected branches' do it 'raises an error' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.') end end @@ -150,18 +150,63 @@ describe Gitlab::Checks::ChangeAccess do let(:protocol) { 'web' } it 'allows branch deletion' do - expect { subject }.not_to raise_error + expect { subject.exec }.not_to raise_error end end context 'over SSH or HTTP' do it 'raises an error' do - expect { subject }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only delete protected branches using the web interface.') + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, 'You can only delete protected branches using the web interface.') end end end end end end + + context 'LFS integrity check' do + let(:blob_object) { project.repository.blob_at_branch('lfs', 'files/lfs/lfs_object.iso') } + + before do + allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects) do |&lazy_block| + lazy_block.call([blob_object.id]) + end + end + + context 'with LFS not enabled' do + it 'skips integrity check' do + expect_any_instance_of(Gitlab::Git::RevList).not_to receive(:new_objects) + + subject.exec + end + end + + context 'with LFS enabled' do + before do + allow(project).to receive(:lfs_enabled?).and_return(true) + end + + context 'deletion' do + let(:changes) { { oldrev: oldrev, ref: ref } } + + it 'skips integrity check' do + expect_any_instance_of(Gitlab::Git::RevList).not_to receive(:new_objects) + + subject.exec + end + end + + it 'fails if any LFS blobs are missing' do + expect { subject.exec }.to raise_error(Gitlab::GitAccess::UnauthorizedError, /LFS objects are missing/) + end + + it 'succeeds if LFS objects have already been uploaded' do + lfs_object = create(:lfs_object, oid: blob_object.lfs_oid) + create(:lfs_objects_project, project: project, lfs_object: lfs_object) + + expect { subject.exec }.not_to raise_error + end + end + end end end diff --git a/spec/lib/gitlab/git/lfs_changes_spec.rb b/spec/lib/gitlab/git/lfs_changes_spec.rb index c2d2c6e1bc8..c9007d7d456 100644 --- a/spec/lib/gitlab/git/lfs_changes_spec.rb +++ b/spec/lib/gitlab/git/lfs_changes_spec.rb @@ -9,7 +9,7 @@ describe Gitlab::Git::LfsChanges do describe 'new_pointers' do before do - allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects).and_return([blob_object_id]) + allow_any_instance_of(Gitlab::Git::RevList).to receive(:new_objects).and_yield([blob_object_id]) end it 'uses rev-list to find new objects' do @@ -38,7 +38,7 @@ describe Gitlab::Git::LfsChanges do it 'uses rev-list to find all objects' do rev_list = double allow(Gitlab::Git::RevList).to receive(:new).and_return(rev_list) - allow(rev_list).to receive(:all_objects).and_return([blob_object_id]) + allow(rev_list).to receive(:all_objects).and_yield([blob_object_id]) expect(Gitlab::Git::Blob).to receive(:batch_lfs_pointers).with(project.repository, [blob_object_id]) diff --git a/spec/lib/gitlab/git/popen_spec.rb b/spec/lib/gitlab/git/popen_spec.rb index 2b65bc1cf15..b033ede9062 100644 --- a/spec/lib/gitlab/git/popen_spec.rb +++ b/spec/lib/gitlab/git/popen_spec.rb @@ -53,6 +53,23 @@ describe 'Gitlab::Git::Popen' do it { expect(status).to be_zero } it { expect(output).to eq('hello') } end + + context 'with lazy block' do + it 'yields a lazy io' do + expect_lazy_io = lambda do |io| + expect(io).to be_a Enumerator::Lazy + expect(io.inspect).to include('#<IO:fd') + end + + klass.new.popen(%w[ls], path, lazy_block: expect_lazy_io) + end + + it "doesn't wait for process exit" do + Timeout.timeout(2) do + klass.new.popen(%w[yes], path, lazy_block: ->(io) {}) + end + end + end end context 'popen_with_timeout' do diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 1d4d0c300eb..96e162ac087 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -1521,7 +1521,7 @@ describe Gitlab::Git::Repository, seed_helper: true do end end - describe '#fetch_source_branch' do + describe '#fetch_source_branch!' do let(:local_ref) { 'refs/merge-requests/1/head' } context 'when the branch exists' do @@ -1530,11 +1530,11 @@ describe Gitlab::Git::Repository, seed_helper: true do it 'writes the ref' do expect(repository).to receive(:write_ref).with(local_ref, /\h{40}/) - repository.fetch_source_branch(repository, source_branch, local_ref) + repository.fetch_source_branch!(repository, source_branch, local_ref) end it 'returns true' do - expect(repository.fetch_source_branch(repository, source_branch, local_ref)).to eq(true) + expect(repository.fetch_source_branch!(repository, source_branch, local_ref)).to eq(true) end end @@ -1544,11 +1544,11 @@ describe Gitlab::Git::Repository, seed_helper: true do it 'does not write the ref' do expect(repository).not_to receive(:write_ref) - repository.fetch_source_branch(repository, source_branch, local_ref) + repository.fetch_source_branch!(repository, source_branch, local_ref) end it 'returns false' do - expect(repository.fetch_source_branch(repository, source_branch, local_ref)).to eq(false) + expect(repository.fetch_source_branch!(repository, source_branch, local_ref)).to eq(false) end end end diff --git a/spec/lib/gitlab/git/rev_list_spec.rb b/spec/lib/gitlab/git/rev_list_spec.rb index 643a4b2d03e..eaf74951b0e 100644 --- a/spec/lib/gitlab/git/rev_list_spec.rb +++ b/spec/lib/gitlab/git/rev_list_spec.rb @@ -3,26 +3,44 @@ require 'spec_helper' describe Gitlab::Git::RevList do let(:project) { create(:project, :repository) } let(:rev_list) { described_class.new(newrev: 'newrev', path_to_repo: project.repository.path_to_repo) } + let(:env_hash) do + { + 'GIT_OBJECT_DIRECTORY' => 'foo', + 'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar' + } + end before do - allow(Gitlab::Git::Env).to receive(:all).and_return({ - GIT_OBJECT_DIRECTORY: 'foo', - GIT_ALTERNATE_OBJECT_DIRECTORIES: 'bar' - }) + allow(Gitlab::Git::Env).to receive(:all).and_return(env_hash.symbolize_keys) end - def stub_popen_rev_list(*additional_args, output:) - expect(rev_list).to receive(:popen).with([ + def args_for_popen(args_list) + [ Gitlab.config.git.bin_path, "--git-dir=#{project.repository.path_to_repo}", 'rev-list', - *additional_args - ], - nil, - { - 'GIT_OBJECT_DIRECTORY' => 'foo', - 'GIT_ALTERNATE_OBJECT_DIRECTORIES' => 'bar' - }).and_return([output, 0]) + *args_list + ] + end + + def stub_popen_rev_list(*additional_args, output:) + args = args_for_popen(additional_args) + + expect(rev_list).to receive(:popen).with(args, nil, env_hash) + .and_return([output, 0]) + end + + def stub_lazy_popen_rev_list(*additional_args, output:) + params = [ + args_for_popen(additional_args), + nil, + env_hash, + hash_including(lazy_block: anything) + ] + + expect(rev_list).to receive(:popen).with(*params) do |*_, lazy_block:| + lazy_block.call(output.split("\n").lazy) + end end context "#new_refs" do @@ -46,10 +64,22 @@ describe Gitlab::Git::RevList do expect(rev_list.new_objects(require_path: true)).to eq(%w[sha2]) end - it 'can return a lazy enumerator' do - stub_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2") + it 'can yield a lazy enumerator' do + stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2") + + rev_list.new_objects do |object_ids| + expect(object_ids).to be_a Enumerator::Lazy + end + end + + it 'returns the result of the block when given' do + stub_lazy_popen_rev_list('newrev', '--not', '--all', '--objects', output: "sha1\nsha2") + + objects = rev_list.new_objects do |object_ids| + object_ids.first + end - expect(rev_list.new_objects(lazy: true)).to be_a Enumerator::Lazy + expect(objects).to eq 'sha1' end it 'can accept list of references to exclude' do @@ -69,7 +99,7 @@ describe Gitlab::Git::RevList do it 'fetches list of all pushed objects using rev-list' do stub_popen_rev_list('--all', '--objects', output: "sha1\nsha2") - expect(rev_list.all_objects.force).to eq(%w[sha1 sha2]) + expect(rev_list.all_objects).to eq(%w[sha1 sha2]) end end diff --git a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb index 92bf87bbad4..78475403f9e 100644 --- a/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb +++ b/spec/lib/gitlab/hook_data/merge_request_builder_spec.rb @@ -26,7 +26,6 @@ describe Gitlab::HookData::MergeRequestBuilder do merge_user_id merge_when_pipeline_succeeds milestone_id - ref_fetched source_branch source_project_id state diff --git a/spec/lib/gitlab/import_export/fork_spec.rb b/spec/lib/gitlab/import_export/fork_spec.rb index dd0ce0dae41..cfb15ee7e8b 100644 --- a/spec/lib/gitlab/import_export/fork_spec.rb +++ b/spec/lib/gitlab/import_export/fork_spec.rb @@ -46,7 +46,7 @@ describe 'forked project import' do end it 'can access the MR' do - project.merge_requests.first.ensure_ref_fetched + project.merge_requests.first.fetch_ref! expect(project.repository.ref_exists?('refs/merge-requests/1/head')).to be_truthy end diff --git a/spec/lib/gitlab/metrics/background_transaction_spec.rb b/spec/lib/gitlab/metrics/background_transaction_spec.rb new file mode 100644 index 00000000000..96052b8dc2f --- /dev/null +++ b/spec/lib/gitlab/metrics/background_transaction_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe Gitlab::Metrics::BackgroundTransaction do + let(:test_worker_class) { double(:class, name: 'TestWorker') } + + subject { described_class.new(test_worker_class) } + + describe '#action' do + it 'returns transaction action name' do + expect(subject.action).to eq('TestWorker#perform') + end + end +end diff --git a/spec/lib/gitlab/metrics/instrumentation_spec.rb b/spec/lib/gitlab/metrics/instrumentation_spec.rb index 4b19ee19103..977bc250049 100644 --- a/spec/lib/gitlab/metrics/instrumentation_spec.rb +++ b/spec/lib/gitlab/metrics/instrumentation_spec.rb @@ -1,7 +1,8 @@ require 'spec_helper' describe Gitlab::Metrics::Instrumentation do - let(:transaction) { Gitlab::Metrics::Transaction.new } + let(:env) { {} } + let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) } before do @dummy = Class.new do diff --git a/spec/lib/gitlab/metrics/method_call_spec.rb b/spec/lib/gitlab/metrics/method_call_spec.rb index a247f03b2da..f1e9e414e0d 100644 --- a/spec/lib/gitlab/metrics/method_call_spec.rb +++ b/spec/lib/gitlab/metrics/method_call_spec.rb @@ -1,7 +1,8 @@ require 'spec_helper' describe Gitlab::Metrics::MethodCall do - let(:method_call) { described_class.new('Foo#bar', 'foo') } + let(:transaction) { double(:transaction, labels: {}) } + let(:method_call) { described_class.new('Foo#bar', :Foo, '#bar', transaction) } describe '#measure' do it 'measures the performance of the supplied block' do @@ -11,6 +12,18 @@ describe Gitlab::Metrics::MethodCall do expect(method_call.cpu_time).to be_a_kind_of(Numeric) expect(method_call.call_count).to eq(1) end + + it 'observes the performance of the supplied block' do + expect(described_class.call_real_duration_histogram) + .to receive(:observe) + .with({ module: :Foo, method: '#bar' }, be_a_kind_of(Numeric)) + + expect(described_class.call_cpu_duration_histogram) + .to receive(:observe) + .with({ module: :Foo, method: '#bar' }, be_a_kind_of(Numeric)) + + method_call.measure { 'foo' } + end end describe '#to_metric' do @@ -19,7 +32,7 @@ describe Gitlab::Metrics::MethodCall do metric = method_call.to_metric expect(metric).to be_an_instance_of(Gitlab::Metrics::Metric) - expect(metric.series).to eq('foo') + expect(metric.series).to eq('rails_method_calls') expect(metric.values[:duration]).to be_a_kind_of(Numeric) expect(metric.values[:cpu_duration]).to be_a_kind_of(Numeric) diff --git a/spec/lib/gitlab/metrics/rack_middleware_spec.rb b/spec/lib/gitlab/metrics/rack_middleware_spec.rb index ec415f2bd85..b84387204ee 100644 --- a/spec/lib/gitlab/metrics/rack_middleware_spec.rb +++ b/spec/lib/gitlab/metrics/rack_middleware_spec.rb @@ -18,34 +18,6 @@ describe Gitlab::Metrics::RackMiddleware do expect(middleware.call(env)).to eq('yay') end - it 'tags a transaction with the name and action of a controller' do - klass = double(:klass, name: 'TestController', content_type: 'text/html') - controller = double(:controller, class: klass, action_name: 'show') - - env['action_controller.instance'] = controller - - allow(app).to receive(:call).with(env) - - expect(middleware).to receive(:tag_controller) - .with(an_instance_of(Gitlab::Metrics::Transaction), env) - - middleware.call(env) - end - - it 'tags a transaction with the method and path of the route in the grape endpoint' do - route = double(:route, request_method: "GET", path: "/:version/projects/:id/archive(.:format)") - endpoint = double(:endpoint, route: route) - - env['api.endpoint'] = endpoint - - allow(app).to receive(:call).with(env) - - expect(middleware).to receive(:tag_endpoint) - .with(an_instance_of(Gitlab::Metrics::Transaction), env) - - middleware.call(env) - end - it 'tracks any raised exceptions' do expect(app).to receive(:call).with(env).and_raise(RuntimeError) @@ -60,7 +32,7 @@ describe Gitlab::Metrics::RackMiddleware do let(:transaction) { middleware.transaction_from_env(env) } it 'returns a Transaction' do - expect(transaction).to be_an_instance_of(Gitlab::Metrics::Transaction) + expect(transaction).to be_an_instance_of(Gitlab::Metrics::WebTransaction) end it 'stores the request method and URI in the transaction as values' do @@ -84,58 +56,4 @@ describe Gitlab::Metrics::RackMiddleware do end end end - - describe '#tag_controller' do - let(:transaction) { middleware.transaction_from_env(env) } - let(:content_type) { 'text/html' } - - before do - klass = double(:klass, name: 'TestController') - controller = double(:controller, class: klass, action_name: 'show', content_type: content_type) - - env['action_controller.instance'] = controller - end - - it 'tags a transaction with the name and action of a controller' do - middleware.tag_controller(transaction, env) - - expect(transaction.action).to eq('TestController#show') - end - - context 'when the response content type is not :html' do - let(:content_type) { 'application/json' } - - it 'appends the mime type to the transaction action' do - middleware.tag_controller(transaction, env) - - expect(transaction.action).to eq('TestController#show.json') - end - end - end - - describe '#tag_endpoint' do - let(:transaction) { middleware.transaction_from_env(env) } - - it 'tags a transaction with the method and path of the route in the grape endpount' do - route = double(:route, request_method: "GET", path: "/:version/projects/:id/archive(.:format)") - endpoint = double(:endpoint, route: route) - - env['api.endpoint'] = endpoint - - middleware.tag_endpoint(transaction, env) - - expect(transaction.action).to eq('Grape#GET /projects/:id/archive') - end - - it 'does not tag a transaction if route infos are missing' do - endpoint = double(:endpoint) - allow(endpoint).to receive(:route).and_raise - - env['api.endpoint'] = endpoint - - middleware.tag_endpoint(transaction, env) - - expect(transaction.action).to be_nil - end - end end diff --git a/spec/lib/gitlab/metrics/influx_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/influx_sampler_spec.rb index 999a9536d82..667e4747897 100644 --- a/spec/lib/gitlab/metrics/influx_sampler_spec.rb +++ b/spec/lib/gitlab/metrics/samplers/influx_sampler_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Gitlab::Metrics::InfluxSampler do +describe Gitlab::Metrics::Samplers::InfluxSampler do let(:sampler) { described_class.new(5) } after do diff --git a/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb new file mode 100644 index 00000000000..53699327da1 --- /dev/null +++ b/spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb @@ -0,0 +1,90 @@ +require 'spec_helper' + +describe Gitlab::Metrics::Samplers::RubySampler do + let(:sampler) { described_class.new(5) } + + after do + Allocations.stop if Gitlab::Metrics.mri? + end + + describe '#sample' do + it 'samples various statistics' do + expect(Gitlab::Metrics::System).to receive(:memory_usage) + expect(Gitlab::Metrics::System).to receive(:file_descriptor_count) + expect(sampler).to receive(:sample_objects) + expect(sampler).to receive(:sample_gc) + + sampler.sample + end + + it 'adds a metric containing the memory usage' do + expect(Gitlab::Metrics::System).to receive(:memory_usage) + .and_return(9000) + + expect(sampler.metrics[:memory_usage]).to receive(:set) + .with({}, 9000) + .and_call_original + + sampler.sample + end + + it 'adds a metric containing the amount of open file descriptors' do + expect(Gitlab::Metrics::System).to receive(:file_descriptor_count) + .and_return(4) + + expect(sampler.metrics[:file_descriptors]).to receive(:set) + .with({}, 4) + .and_call_original + + sampler.sample + end + + it 'clears any GC profiles' do + expect(GC::Profiler).to receive(:clear) + + sampler.sample + end + end + + describe '#sample_gc' do + it 'adds a metric containing garbage collection time statistics' do + expect(GC::Profiler).to receive(:total_time).and_return(0.24) + + expect(sampler.metrics[:total_time]).to receive(:set) + .with({}, 240) + .and_call_original + + sampler.sample + end + + it 'adds a metric containing garbage collection statistics' do + GC.stat.keys.each do |key| + expect(sampler.metrics[key]).to receive(:set).with({}, anything).and_call_original + end + + sampler.sample + end + end + + if Gitlab::Metrics.mri? + describe '#sample_objects' do + it 'adds a metric containing the amount of allocated objects' do + expect(sampler.metrics[:objects_total]).to receive(:set) + .with(include(class: anything), be > 0) + .at_least(:once) + .and_call_original + + sampler.sample + end + + it 'ignores classes without a name' do + expect(Allocations).to receive(:to_hash).and_return({ Class.new => 4 }) + + expect(sampler.metrics[:objects_total]).not_to receive(:set) + .with(include(class: 'object_counts'), anything) + + sampler.sample + end + end + end +end diff --git a/spec/lib/gitlab/metrics/unicorn_sampler_spec.rb b/spec/lib/gitlab/metrics/samplers/unicorn_sampler_spec.rb index dc0d1f2e940..771b633a2b9 100644 --- a/spec/lib/gitlab/metrics/unicorn_sampler_spec.rb +++ b/spec/lib/gitlab/metrics/samplers/unicorn_sampler_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Gitlab::Metrics::UnicornSampler do +describe Gitlab::Metrics::Samplers::UnicornSampler do subject { described_class.new(1.second) } describe '#sample' do diff --git a/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb b/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb index 0803ce42fac..6d69b5305d2 100644 --- a/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb +++ b/spec/lib/gitlab/metrics/sidekiq_middleware_spec.rb @@ -5,8 +5,8 @@ describe Gitlab::Metrics::SidekiqMiddleware do let(:message) { { 'args' => ['test'], 'enqueued_at' => Time.new(2016, 6, 23, 6, 59).to_f } } def run(worker, message) - expect(Gitlab::Metrics::Transaction).to receive(:new) - .with('TestWorker#perform') + expect(Gitlab::Metrics::BackgroundTransaction).to receive(:new) + .with(worker.class) .and_call_original expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:set) @@ -18,21 +18,18 @@ describe Gitlab::Metrics::SidekiqMiddleware do end describe '#call' do - it 'tracks the transaction' do - worker = double(:worker, class: double(:class, name: 'TestWorker')) + let(:test_worker_class) { double(:class, name: 'TestWorker') } + let(:worker) { double(:worker, class: test_worker_class) } + it 'tracks the transaction' do run(worker, message) end it 'tracks the transaction (for messages without `enqueued_at`)' do - worker = double(:worker, class: double(:class, name: 'TestWorker')) - run(worker, {}) end it 'tracks any raised exceptions' do - worker = double(:worker, class: double(:class, name: 'TestWorker')) - expect_any_instance_of(Gitlab::Metrics::Transaction) .to receive(:run).and_raise(RuntimeError) @@ -45,18 +42,5 @@ describe Gitlab::Metrics::SidekiqMiddleware do expect { middleware.call(worker, message, :test) } .to raise_error(RuntimeError) end - - it 'tags the metrics accordingly' do - tags = { one: 1, two: 2 } - worker = double(:worker, class: double(:class, name: 'TestWorker')) - allow(worker).to receive(:metrics_tags).and_return(tags) - - tags.each do |tag, value| - expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:add_tag) - .with(tag, value) - end - - run(worker, message) - end end end diff --git a/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb b/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb index e7b595405a8..eca75a4fac1 100644 --- a/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb +++ b/spec/lib/gitlab/metrics/subscribers/action_view_spec.rb @@ -1,7 +1,8 @@ require 'spec_helper' describe Gitlab::Metrics::Subscribers::ActionView do - let(:transaction) { Gitlab::Metrics::Transaction.new } + let(:env) { {} } + let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) } let(:subscriber) { described_class.new } @@ -29,5 +30,13 @@ describe Gitlab::Metrics::Subscribers::ActionView do subscriber.render_template(event) end + + it 'observes view rendering time' do + expect(subscriber.send(:metric_view_rendering_duration_seconds)) + .to receive(:observe) + .with({ view: 'app/views/x.html.haml' }, 2.1) + + subscriber.render_template(event) + end end end diff --git a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb index ce6587e993f..9b3698fb4a8 100644 --- a/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb +++ b/spec/lib/gitlab/metrics/subscribers/active_record_spec.rb @@ -1,11 +1,12 @@ require 'spec_helper' describe Gitlab::Metrics::Subscribers::ActiveRecord do - let(:transaction) { Gitlab::Metrics::Transaction.new } + let(:env) { {} } + let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) } let(:subscriber) { described_class.new } let(:event) do - double(:event, duration: 0.2, + double(:event, duration: 2, payload: { sql: 'SELECT * FROM users WHERE id = 10' }) end @@ -20,16 +21,24 @@ describe Gitlab::Metrics::Subscribers::ActiveRecord do end describe 'with a current transaction' do + it 'observes sql_duration metric' do + expect(subscriber).to receive(:current_transaction) + .at_least(:once) + .and_return(transaction) + expect(subscriber.send(:metric_sql_duration_seconds)).to receive(:observe).with({}, 0.002) + subscriber.sql(event) + end + it 'increments the :sql_duration value' do expect(subscriber).to receive(:current_transaction) .at_least(:once) .and_return(transaction) expect(transaction).to receive(:increment) - .with(:sql_duration, 0.2) + .with(:sql_duration, 2, false) expect(transaction).to receive(:increment) - .with(:sql_count, 1) + .with(:sql_count, 1, false) subscriber.sql(event) end diff --git a/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb b/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb index f04dc8dcc02..58e28592cf9 100644 --- a/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb +++ b/spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb @@ -1,15 +1,16 @@ require 'spec_helper' describe Gitlab::Metrics::Subscribers::RailsCache do - let(:transaction) { Gitlab::Metrics::Transaction.new } + let(:env) { {} } + let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) } let(:subscriber) { described_class.new } let(:event) { double(:event, duration: 15.2) } describe '#cache_read' do it 'increments the cache_read duration' do - expect(subscriber).to receive(:increment) - .with(:cache_read, event.duration) + expect(subscriber).to receive(:observe) + .with(:read, event.duration) subscriber.cache_read(event) end @@ -17,7 +18,7 @@ describe Gitlab::Metrics::Subscribers::RailsCache do context 'with a transaction' do before do allow(subscriber).to receive(:current_transaction) - .and_return(transaction) + .and_return(transaction) end context 'with hit event' do @@ -25,9 +26,9 @@ describe Gitlab::Metrics::Subscribers::RailsCache do it 'increments the cache_read_hit count' do expect(transaction).to receive(:increment) - .with(:cache_read_hit_count, 1) + .with(:cache_read_hit_count, 1, false) expect(transaction).to receive(:increment) - .with(any_args).at_least(1) # Other calls + .with(any_args).at_least(1) # Other calls subscriber.cache_read(event) end @@ -37,7 +38,7 @@ describe Gitlab::Metrics::Subscribers::RailsCache do it 'does not increment cache read miss' do expect(transaction).not_to receive(:increment) - .with(:cache_read_hit_count, 1) + .with(:cache_read_hit_count, 1) subscriber.cache_read(event) end @@ -49,9 +50,15 @@ describe Gitlab::Metrics::Subscribers::RailsCache do it 'increments the cache_read_miss count' do expect(transaction).to receive(:increment) - .with(:cache_read_miss_count, 1) + .with(:cache_read_miss_count, 1, false) expect(transaction).to receive(:increment) - .with(any_args).at_least(1) # Other calls + .with(any_args).at_least(1) # Other calls + + subscriber.cache_read(event) + end + + it 'increments the cache_read_miss total' do + expect(subscriber.send(:metric_cache_misses_total)).to receive(:increment).with({}) subscriber.cache_read(event) end @@ -61,7 +68,13 @@ describe Gitlab::Metrics::Subscribers::RailsCache do it 'does not increment cache read miss' do expect(transaction).not_to receive(:increment) - .with(:cache_read_miss_count, 1) + .with(:cache_read_miss_count, 1) + + subscriber.cache_read(event) + end + + it 'does not increment cache_read_miss total' do + expect(subscriber.send(:metric_cache_misses_total)).not_to receive(:increment).with({}) subscriber.cache_read(event) end @@ -71,27 +84,27 @@ describe Gitlab::Metrics::Subscribers::RailsCache do end describe '#cache_write' do - it 'increments the cache_write duration' do - expect(subscriber).to receive(:increment) - .with(:cache_write, event.duration) + it 'observes write duration' do + expect(subscriber).to receive(:observe) + .with(:write, event.duration) subscriber.cache_write(event) end end describe '#cache_delete' do - it 'increments the cache_delete duration' do - expect(subscriber).to receive(:increment) - .with(:cache_delete, event.duration) + it 'observes delete duration' do + expect(subscriber).to receive(:observe) + .with(:delete, event.duration) subscriber.cache_delete(event) end end describe '#cache_exist?' do - it 'increments the cache_exists duration' do - expect(subscriber).to receive(:increment) - .with(:cache_exists, event.duration) + it 'observes the exists duration' do + expect(subscriber).to receive(:observe) + .with(:exists, event.duration) subscriber.cache_exist?(event) end @@ -109,12 +122,12 @@ describe Gitlab::Metrics::Subscribers::RailsCache do context 'with a transaction' do before do allow(subscriber).to receive(:current_transaction) - .and_return(transaction) + .and_return(transaction) end it 'increments the cache_read_hit count' do expect(transaction).to receive(:increment) - .with(:cache_read_hit_count, 1) + .with(:cache_read_hit_count, 1) subscriber.cache_fetch_hit(event) end @@ -133,47 +146,61 @@ describe Gitlab::Metrics::Subscribers::RailsCache do context 'with a transaction' do before do allow(subscriber).to receive(:current_transaction) - .and_return(transaction) + .and_return(transaction) end it 'increments the cache_fetch_miss count' do expect(transaction).to receive(:increment) - .with(:cache_read_miss_count, 1) + .with(:cache_read_miss_count, 1) + + subscriber.cache_generate(event) + end + + it 'increments the cache_read_miss total' do + expect(subscriber.send(:metric_cache_misses_total)).to receive(:increment).with({}) subscriber.cache_generate(event) end end end - describe '#increment' do + describe '#observe' do context 'without a transaction' do it 'returns' do expect(transaction).not_to receive(:increment) - subscriber.increment(:foo, 15.2) + subscriber.observe(:foo, 15.2) end end context 'with a transaction' do before do allow(subscriber).to receive(:current_transaction) - .and_return(transaction) + .and_return(transaction) end it 'increments the total and specific cache duration' do expect(transaction).to receive(:increment) - .with(:cache_duration, event.duration) + .with(:cache_duration, event.duration, false) expect(transaction).to receive(:increment) - .with(:cache_count, 1) + .with(:cache_count, 1, false) expect(transaction).to receive(:increment) - .with(:cache_delete_duration, event.duration) + .with(:cache_delete_duration, event.duration, false) expect(transaction).to receive(:increment) - .with(:cache_delete_count, 1) + .with(:cache_delete_count, 1, false) + + subscriber.observe(:delete, event.duration) + end + + it 'observes cache metric' do + expect(subscriber.send(:metric_cache_operation_duration_seconds)) + .to receive(:observe) + .with(transaction.labels.merge(operation: :delete), event.duration / 1000.0) - subscriber.increment(:cache_delete, event.duration) + subscriber.observe(:delete, event.duration) end end end diff --git a/spec/lib/gitlab/metrics/transaction_spec.rb b/spec/lib/gitlab/metrics/web_transaction_spec.rb index 3779af81512..1d162f53a13 100644 --- a/spec/lib/gitlab/metrics/transaction_spec.rb +++ b/spec/lib/gitlab/metrics/web_transaction_spec.rb @@ -1,7 +1,8 @@ require 'spec_helper' -describe Gitlab::Metrics::Transaction do - let(:transaction) { described_class.new } +describe Gitlab::Metrics::WebTransaction do + let(:env) { {} } + let(:transaction) { described_class.new(env) } describe '#duration' do it 'returns the duration of a transaction in seconds' do @@ -48,7 +49,7 @@ describe Gitlab::Metrics::Transaction do describe '#method_call_for' do it 'returns a MethodCall' do - method = transaction.method_call_for('Foo#bar') + method = transaction.method_call_for('Foo#bar', :Foo, '#bar') expect(method).to be_an_instance_of(Gitlab::Metrics::MethodCall) end @@ -85,14 +86,6 @@ describe Gitlab::Metrics::Transaction do end end - describe '#add_tag' do - it 'adds a tag' do - transaction.add_tag(:foo, 'bar') - - expect(transaction.tags).to eq({ foo: 'bar' }) - end - end - describe '#finish' do it 'tracks the transaction details and submits them to Sidekiq' do expect(transaction).to receive(:track_self) @@ -127,7 +120,7 @@ describe Gitlab::Metrics::Transaction do end it 'adds the action as a tag for every metric' do - transaction.action = 'Foo#bar' + allow(transaction).to receive(:labels).and_return(controller: 'Foo', action: 'bar') transaction.track_self hash = { @@ -144,7 +137,8 @@ describe Gitlab::Metrics::Transaction do end it 'does not add an action tag for events' do - transaction.action = 'Foo#bar' + allow(transaction).to receive(:labels).and_return(controller: 'Foo', action: 'bar') + transaction.add_event(:meow) hash = { @@ -161,6 +155,61 @@ describe Gitlab::Metrics::Transaction do end end + describe '#labels' do + context 'when request goes to Grape endpoint' do + before do + route = double(:route, request_method: 'GET', path: '/:version/projects/:id/archive(.:format)') + endpoint = double(:endpoint, route: route) + + env['api.endpoint'] = endpoint + end + it 'provides labels with the method and path of the route in the grape endpoint' do + expect(transaction.labels).to eq({ controller: 'Grape', action: 'GET /projects/:id/archive' }) + expect(transaction.action).to eq('Grape#GET /projects/:id/archive') + end + + it 'does not provide labels if route infos are missing' do + endpoint = double(:endpoint) + allow(endpoint).to receive(:route).and_raise + + env['api.endpoint'] = endpoint + + expect(transaction.labels).to eq({}) + expect(transaction.action).to be_nil + end + end + + context 'when request goes to ActionController' do + let(:content_type) { 'text/html' } + + before do + klass = double(:klass, name: 'TestController') + controller = double(:controller, class: klass, action_name: 'show', content_type: content_type) + + env['action_controller.instance'] = controller + end + + it 'tags a transaction with the name and action of a controller' do + expect(transaction.labels).to eq({ controller: 'TestController', action: 'show' }) + expect(transaction.action).to eq('TestController#show') + end + + context 'when the response content type is not :html' do + let(:content_type) { 'application/json' } + + it 'appends the mime type to the transaction action' do + expect(transaction.labels).to eq({ controller: 'TestController', action: 'show.json' }) + expect(transaction.action).to eq('TestController#show.json') + end + end + end + + it 'returns no labels when no route information is present in env' do + expect(transaction.labels).to eq({}) + expect(transaction.action).to eq(nil) + end + end + describe '#add_event' do it 'adds a metric' do transaction.add_event(:meow) diff --git a/spec/lib/gitlab/metrics_spec.rb b/spec/lib/gitlab/metrics_spec.rb index 599b8807d8d..1619fbd88b1 100644 --- a/spec/lib/gitlab/metrics_spec.rb +++ b/spec/lib/gitlab/metrics_spec.rb @@ -115,7 +115,7 @@ describe Gitlab::Metrics do end context 'with a transaction' do - let(:transaction) { Gitlab::Metrics::Transaction.new } + let(:transaction) { Gitlab::Metrics::WebTransaction.new({}) } before do allow(described_class).to receive(:current_transaction) @@ -124,13 +124,13 @@ describe Gitlab::Metrics do it 'adds a metric to the current transaction' do expect(transaction).to receive(:increment) - .with('foo_real_time', a_kind_of(Numeric)) + .with('foo_real_time', a_kind_of(Numeric), false) expect(transaction).to receive(:increment) - .with('foo_cpu_time', a_kind_of(Numeric)) + .with('foo_cpu_time', a_kind_of(Numeric), false) expect(transaction).to receive(:increment) - .with('foo_call_count', 1) + .with('foo_call_count', 1, false) described_class.measure(:foo) { 10 } end @@ -143,31 +143,6 @@ describe Gitlab::Metrics do end end - describe '.tag_transaction' do - context 'without a transaction' do - it 'does nothing' do - expect_any_instance_of(Gitlab::Metrics::Transaction) - .not_to receive(:add_tag) - - described_class.tag_transaction(:foo, 'bar') - end - end - - context 'with a transaction' do - let(:transaction) { Gitlab::Metrics::Transaction.new } - - it 'adds the tag to the transaction' do - expect(described_class).to receive(:current_transaction) - .and_return(transaction) - - expect(transaction).to receive(:add_tag) - .with(:foo, 'bar') - - described_class.tag_transaction(:foo, 'bar') - end - end - end - describe '.action=' do context 'without a transaction' do it 'does nothing' do @@ -180,7 +155,7 @@ describe Gitlab::Metrics do context 'with a transaction' do it 'sets the action of a transaction' do - trans = Gitlab::Metrics::Transaction.new + trans = Gitlab::Metrics::WebTransaction.new({}) expect(described_class).to receive(:current_transaction) .and_return(trans) @@ -210,7 +185,7 @@ describe Gitlab::Metrics do context 'with a transaction' do it 'adds an event' do - transaction = Gitlab::Metrics::Transaction.new + transaction = Gitlab::Metrics::WebTransaction.new({}) expect(transaction).to receive(:add_event).with(:meow) @@ -224,7 +199,7 @@ describe Gitlab::Metrics do shared_examples 'prometheus metrics API' do describe '#counter' do - subject { described_class.counter(:couter, 'doc') } + subject { described_class.counter(:counter, 'doc') } describe '#increment' do it 'successfully calls #increment without arguments' do @@ -280,7 +255,7 @@ describe Gitlab::Metrics do it_behaves_like 'prometheus metrics API' describe '#null_metric' do - subject { described_class.provide_metric(:test) } + subject { described_class.send(:provide_metric, :test) } it { is_expected.to be_a(Gitlab::Metrics::NullMetric) } end @@ -321,7 +296,7 @@ describe Gitlab::Metrics do it_behaves_like 'prometheus metrics API' describe '#null_metric' do - subject { described_class.provide_metric(:test) } + subject { described_class.send(:provide_metric, :test) } it { is_expected.to be_nil } end diff --git a/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb b/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb index 88107536c9e..14f2c3cb86f 100644 --- a/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb +++ b/spec/lib/gitlab/middleware/rails_queue_duration_spec.rb @@ -4,7 +4,7 @@ describe Gitlab::Middleware::RailsQueueDuration do let(:app) { double(:app) } let(:middleware) { described_class.new(app) } let(:env) { {} } - let(:transaction) { double(:transaction) } + let(:transaction) { Gitlab::Metrics::WebTransaction.new(env) } before do expect(app).to receive(:call).with(env).and_return('yay') @@ -30,6 +30,16 @@ describe Gitlab::Middleware::RailsQueueDuration do expect(transaction).to receive(:set).with(:rails_queue_duration, an_instance_of(Float)) expect(middleware.call(env)).to eq('yay') end + + it 'observes rails queue duration metrics and calls the app when the header is present' do + env['HTTP_GITLAB_WORKHORSE_PROXY_START'] = '2000000000' + + expect(middleware.send(:metric_rails_queue_duration_seconds)).to receive(:observe).with(transaction.labels, 1) + + Timecop.freeze(Time.at(3)) do + expect(middleware.call(env)).to eq('yay') + end + end end end end diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb index f1f188cbfb5..ee63c9338c5 100644 --- a/spec/lib/gitlab/path_regex_spec.rb +++ b/spec/lib/gitlab/path_regex_spec.rb @@ -68,14 +68,27 @@ describe Gitlab::PathRegex do message end - let(:all_routes) do + let(:all_non_legacy_routes) do route_set = Rails.application.routes routes_collection = route_set.routes routes_array = routes_collection.routes - routes_array.map { |route| route.path.spec.to_s } + + non_legacy_routes = routes_array.reject do |route| + route.name.to_s =~ /legacy_(\w*)_redirect/ + end + + non_deprecated_redirect_routes = non_legacy_routes.reject do |route| + app = route.app + # `app.app` is either another app, or `self`. We want to find the final app. + app = app.app while app.try(:app) && app.app != app + + app.is_a?(ActionDispatch::Routing::PathRedirect) && app.block.include?('/-/') + end + + non_deprecated_redirect_routes.map { |route| route.path.spec.to_s } end - let(:routes_without_format) { all_routes.map { |path| without_format(path) } } + let(:routes_without_format) { all_non_legacy_routes.map { |path| without_format(path) } } # Routes not starting with `/:` or `/*` # all routes not starting with a param diff --git a/spec/models/concerns/ignorable_column_spec.rb b/spec/models/concerns/ignorable_column_spec.rb index dba9fe43327..b70f2331a0e 100644 --- a/spec/models/concerns/ignorable_column_spec.rb +++ b/spec/models/concerns/ignorable_column_spec.rb @@ -5,7 +5,11 @@ describe IgnorableColumn do Class.new do def self.columns # This method does not have access to "double" - [Struct.new(:name).new('id'), Struct.new(:name).new('title')] + [ + Struct.new(:name).new('id'), + Struct.new(:name).new('title'), + Struct.new(:name).new('date') + ] end end end @@ -18,7 +22,7 @@ describe IgnorableColumn do describe '.columns' do it 'returns the columns, excluding the ignored ones' do - model.ignore_column(:title) + model.ignore_column(:title, :date) expect(model.columns.map(&:name)).to eq(%w(id)) end @@ -30,9 +34,9 @@ describe IgnorableColumn do end it 'returns the names of the ignored columns' do - model.ignore_column(:title) + model.ignore_column(:title, :date) - expect(model.ignored_columns).to eq(Set.new(%w(title))) + expect(model.ignored_columns).to eq(Set.new(%w(title date))) end end end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 476a2697605..d022dae3476 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1755,39 +1755,12 @@ describe MergeRequest do end end - describe '#fetch_ref' do - it 'sets "ref_fetched" flag to true' do - subject.update!(ref_fetched: nil) + describe '#fetch_ref!' do + it 'fetches the ref correctly' do + expect { subject.target_project.repository.delete_refs(subject.ref_path) }.not_to raise_error - subject.fetch_ref - - expect(subject.reload.ref_fetched).to be_truthy - end - end - - describe '#ref_fetched?' do - it 'does not perform git operation when value is cached' do - subject.ref_fetched = true - - expect_any_instance_of(Repository).not_to receive(:ref_exists?) - expect(subject.ref_fetched?).to be_truthy - end - - it 'caches the value when ref exists but value is not cached' do - subject.update!(ref_fetched: nil) - allow_any_instance_of(Repository).to receive(:ref_exists?) - .and_return(true) - - expect(subject.ref_fetched?).to be_truthy - expect(subject.reload.ref_fetched).to be_truthy - end - - it 'returns false when ref does not exist' do - subject.update!(ref_fetched: nil) - allow_any_instance_of(Repository).to receive(:ref_exists?) - .and_return(false) - - expect(subject.ref_fetched?).to be_falsey + subject.fetch_ref! + expect(subject.target_project.repository.ref_exists?(subject.ref_path)).to be_truthy end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e8588975118..0e50909988b 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -276,6 +276,12 @@ describe Project do expect(project).to be_valid end + + it 'allows a path ending in a period' do + project = build(:project, path: 'foo.') + + expect(project).to be_valid + end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index e0896d64c8f..d2f97009ad9 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -788,14 +788,16 @@ describe User do end it "creates external user by default" do - user = build(:user) + user = create(:user) expect(user.external).to be_truthy + expect(user.can_create_group).to be_falsey + expect(user.projects_limit).to be 0 end describe 'with default overrides' do it "creates a non-external user" do - user = build(:user, external: false) + user = create(:user, external: false) expect(user.external).to be_falsey end diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb index 3b7b9c889e7..1765907c1b4 100644 --- a/spec/requests/api/jobs_spec.rb +++ b/spec/requests/api/jobs_spec.rb @@ -165,7 +165,17 @@ describe API::Jobs do context 'authorized user' do it 'returns specific job data' do expect(response).to have_gitlab_http_status(200) - expect(json_response['name']).to eq('test') + expect(json_response['id']).to eq(job.id) + expect(json_response['status']).to eq(job.status) + expect(json_response['stage']).to eq(job.stage) + expect(json_response['name']).to eq(job.name) + expect(json_response['ref']).to eq(job.ref) + expect(json_response['tag']).to eq(job.tag) + expect(json_response['coverage']).to eq(job.coverage) + expect(Time.parse(json_response['created_at'])).to be_like_time(job.created_at) + expect(Time.parse(json_response['started_at'])).to be_like_time(job.started_at) + expect(Time.parse(json_response['finished_at'])).to be_like_time(job.finished_at) + expect(json_response['duration']).to eq(job.duration) end it 'returns pipeline data' do diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 024cfe8b372..e16be3c46e1 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -623,8 +623,6 @@ describe API::MergeRequests do before do forked_project.add_reporter(user2) - - allow_any_instance_of(MergeRequest).to receive(:write_ref) end it "returns merge_request" do diff --git a/spec/requests/api/v3/merge_requests_spec.rb b/spec/requests/api/v3/merge_requests_spec.rb index 26251b95680..91897e5ee01 100644 --- a/spec/requests/api/v3/merge_requests_spec.rb +++ b/spec/requests/api/v3/merge_requests_spec.rb @@ -319,8 +319,6 @@ describe API::MergeRequests do before do forked_project.add_reporter(user2) - - allow_any_instance_of(MergeRequest).to receive(:write_ref) end it "returns merge_request" do diff --git a/spec/services/events/render_service_spec.rb b/spec/services/events/render_service_spec.rb new file mode 100644 index 00000000000..b4a4a44d07b --- /dev/null +++ b/spec/services/events/render_service_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +describe Events::RenderService do + describe '#execute' do + let!(:note) { build(:note) } + let!(:event) { build(:event, target: note, project: note.project) } + let!(:user) { build(:user) } + + context 'when the request format is atom' do + it 'renders the note inside events' do + expect(Banzai::ObjectRenderer).to receive(:new) + .with(event.project, user, + only_path: false, + xhtml: true) + .and_call_original + + expect_any_instance_of(Banzai::ObjectRenderer) + .to receive(:render).with([note], :note) + + described_class.new(user).execute([event], atom_request: true) + end + end + + context 'when the request format is not atom' do + it 'renders the note inside events' do + expect(Banzai::ObjectRenderer).to receive(:new) + .with(event.project, user, {}) + .and_call_original + + expect_any_instance_of(Banzai::ObjectRenderer) + .to receive(:render).with([note], :note) + + described_class.new(user).execute([event], atom_request: false) + end + end + end +end diff --git a/spec/services/notes/render_service_spec.rb b/spec/services/notes/render_service_spec.rb new file mode 100644 index 00000000000..faac498037f --- /dev/null +++ b/spec/services/notes/render_service_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe Notes::RenderService do + describe '#execute' do + it 'renders a Note' do + note = double(:note) + project = double(:project) + wiki = double(:wiki) + user = double(:user) + + expect(Banzai::ObjectRenderer).to receive(:new) + .with(project, user, + requested_path: 'foo', + project_wiki: wiki, + ref: 'bar', + only_path: nil, + xhtml: false) + .and_call_original + + expect_any_instance_of(Banzai::ObjectRenderer) + .to receive(:render).with([note], :note) + + described_class.new(user).execute([note], project, + requested_path: 'foo', + project_wiki: wiki, + ref: 'bar', + only_path: nil, + xhtml: false) + end + end +end diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb index a9b34a5258a..dc2673abc73 100644 --- a/spec/services/todo_service_spec.rb +++ b/spec/services/todo_service_spec.rb @@ -248,11 +248,11 @@ describe TodoService do end end - describe '#destroy_issue' do + describe '#destroy_issuable' do it 'refresh the todos count cache for the user' do expect(john_doe).to receive(:update_todos_count_cache).and_call_original - service.destroy_issue(issue, john_doe) + service.destroy_issuable(issue, john_doe) end end @@ -643,14 +643,6 @@ describe TodoService do end end - describe '#destroy_merge_request' do - it 'refresh the todos count cache for the user' do - expect(john_doe).to receive(:update_todos_count_cache).and_call_original - - service.destroy_merge_request(mr_assigned, john_doe) - end - end - describe '#reassigned_merge_request' do it 'creates a pending todo for new assignee' do mr_unassigned.update_attribute(:assignee, john_doe) diff --git a/spec/validators/dynamic_path_validator_spec.rb b/spec/validators/dynamic_path_validator_spec.rb deleted file mode 100644 index 08e1c5a728a..00000000000 --- a/spec/validators/dynamic_path_validator_spec.rb +++ /dev/null @@ -1,97 +0,0 @@ -require 'spec_helper' - -describe DynamicPathValidator do - let(:validator) { described_class.new(attributes: [:path]) } - - def expect_handles_invalid_utf8 - expect { yield('\255invalid') }.to be_falsey - end - - describe '.valid_user_path' do - it 'handles invalid utf8' do - expect(described_class.valid_user_path?("a\0weird\255path")).to be_falsey - end - end - - describe '.valid_group_path' do - it 'handles invalid utf8' do - expect(described_class.valid_group_path?("a\0weird\255path")).to be_falsey - end - end - - describe '.valid_project_path' do - it 'handles invalid utf8' do - expect(described_class.valid_project_path?("a\0weird\255path")).to be_falsey - end - end - - describe '#path_valid_for_record?' do - context 'for project' do - it 'calls valid_project_path?' do - project = build(:project, path: 'activity') - - expect(described_class).to receive(:valid_project_path?).with(project.full_path).and_call_original - - expect(validator.path_valid_for_record?(project, 'activity')).to be_truthy - end - end - - context 'for group' do - it 'calls valid_group_path?' do - group = build(:group, :nested, path: 'activity') - - expect(described_class).to receive(:valid_group_path?).with(group.full_path).and_call_original - - expect(validator.path_valid_for_record?(group, 'activity')).to be_falsey - end - end - - context 'for user' do - it 'calls valid_user_path?' do - user = build(:user, username: 'activity') - - expect(described_class).to receive(:valid_user_path?).with(user.full_path).and_call_original - - expect(validator.path_valid_for_record?(user, 'activity')).to be_truthy - end - end - - context 'for user namespace' do - it 'calls valid_user_path?' do - user = create(:user, username: 'activity') - namespace = user.namespace - - expect(described_class).to receive(:valid_user_path?).with(namespace.full_path).and_call_original - - expect(validator.path_valid_for_record?(namespace, 'activity')).to be_truthy - end - end - end - - describe '#validates_each' do - it 'adds a message when the path is not in the correct format' do - group = build(:group) - - validator.validate_each(group, :path, "Path with spaces, and comma's!") - - expect(group.errors[:path]).to include(Gitlab::PathRegex.namespace_format_message) - end - - it 'adds a message when the path is not in the correct format' do - group = build(:group, path: 'users') - - validator.validate_each(group, :path, 'users') - - expect(group.errors[:path]).to include('users is a reserved name') - end - - it 'updating to an invalid path is not allowed' do - project = create(:project) - project.path = 'update' - - validator.validate_each(project, :path, 'update') - - expect(project.errors[:path]).to include('update is a reserved name') - end - end -end diff --git a/spec/validators/namespace_path_validator_spec.rb b/spec/validators/namespace_path_validator_spec.rb new file mode 100644 index 00000000000..61e2845f35f --- /dev/null +++ b/spec/validators/namespace_path_validator_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe NamespacePathValidator do + let(:validator) { described_class.new(attributes: [:path]) } + + describe '.valid_path?' do + it 'handles invalid utf8' do + expect(described_class.valid_path?("a\0weird\255path")).to be_falsey + end + end + + describe '#validates_each' do + it 'adds a message when the path is not in the correct format' do + group = build(:group) + + validator.validate_each(group, :path, "Path with spaces, and comma's!") + + expect(group.errors[:path]).to include(Gitlab::PathRegex.namespace_format_message) + end + + it 'adds a message when the path is reserved when creating' do + group = build(:group, path: 'help') + + validator.validate_each(group, :path, 'help') + + expect(group.errors[:path]).to include('help is a reserved name') + end + + it 'adds a message when the path is reserved when updating' do + group = create(:group) + group.path = 'help' + + validator.validate_each(group, :path, 'help') + + expect(group.errors[:path]).to include('help is a reserved name') + end + end +end diff --git a/spec/validators/project_path_validator_spec.rb b/spec/validators/project_path_validator_spec.rb new file mode 100644 index 00000000000..8bb5e72dc22 --- /dev/null +++ b/spec/validators/project_path_validator_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe ProjectPathValidator do + let(:validator) { described_class.new(attributes: [:path]) } + + describe '.valid_path?' do + it 'handles invalid utf8' do + expect(described_class.valid_path?("a\0weird\255path")).to be_falsey + end + end + + describe '#validates_each' do + it 'adds a message when the path is not in the correct format' do + project = build(:project) + + validator.validate_each(project, :path, "Path with spaces, and comma's!") + + expect(project.errors[:path]).to include(Gitlab::PathRegex.project_path_format_message) + end + + it 'adds a message when the path is reserved when creating' do + project = build(:project, path: 'blob') + + validator.validate_each(project, :path, 'blob') + + expect(project.errors[:path]).to include('blob is a reserved name') + end + + it 'adds a message when the path is reserved when updating' do + project = create(:project) + project.path = 'blob' + + validator.validate_each(project, :path, 'blob') + + expect(project.errors[:path]).to include('blob is a reserved name') + end + end +end diff --git a/spec/validators/user_path_validator_spec.rb b/spec/validators/user_path_validator_spec.rb new file mode 100644 index 00000000000..a46089cc24f --- /dev/null +++ b/spec/validators/user_path_validator_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe UserPathValidator do + let(:validator) { described_class.new(attributes: [:username]) } + + describe '.valid_path?' do + it 'handles invalid utf8' do + expect(described_class.valid_path?("a\0weird\255path")).to be_falsey + end + end + + describe '#validates_each' do + it 'adds a message when the path is not in the correct format' do + user = build(:user) + + validator.validate_each(user, :username, "Path with spaces, and comma's!") + + expect(user.errors[:username]).to include(Gitlab::PathRegex.namespace_format_message) + end + + it 'adds a message when the path is reserved when creating' do + user = build(:user, username: 'help') + + validator.validate_each(user, :username, 'help') + + expect(user.errors[:username]).to include('help is a reserved name') + end + + it 'adds a message when the path is reserved when updating' do + user = create(:user) + user.username = 'help' + + validator.validate_each(user, :username, 'help') + + expect(user.errors[:username]).to include('help is a reserved name') + end + end +end diff --git a/yarn.lock b/yarn.lock index ee00c1f4f3e..bf92370d44f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2722,7 +2722,7 @@ getpass@^0.1.1: "gitlab-svgs@https://gitlab.com/gitlab-org/gitlab-svgs.git": version "1.0.4" - resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#46c0a49cd43639948dfcc77a0f94d59deaad1e85" + resolved "https://gitlab.com/gitlab-org/gitlab-svgs.git#0442503549e6d74a4e22e1641e1d2ab0ae09884b" glob-base@^0.3.0: version "0.3.0" |