]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8828 Make sure all messages can be localized (#2600)
authorStas Vilchik <stas.vilchik@sonarsource.com>
Tue, 3 Oct 2017 07:12:56 +0000 (09:12 +0200)
committerGitHub <noreply@github.com>
Tue, 3 Oct 2017 07:12:56 +0000 (09:12 +0200)
81 files changed:
server/sonar-web/src/main/js/app/components/nav/settings/SettingsNav.js
server/sonar-web/src/main/js/app/components/nav/settings/__tests__/__snapshots__/SettingsNav-test.js.snap
server/sonar-web/src/main/js/apps/account/notifications/Projects.js
server/sonar-web/src/main/js/apps/account/notifications/__tests__/__snapshots__/Projects-test.js.snap
server/sonar-web/src/main/js/apps/account/profile/Profile.js
server/sonar-web/src/main/js/apps/account/templates/account-tokens.hbs
server/sonar-web/src/main/js/apps/account/tokens-view.js
server/sonar-web/src/main/js/apps/background-tasks/components/DateFilter.js
server/sonar-web/src/main/js/apps/background-tasks/components/Search.js
server/sonar-web/src/main/js/apps/coding-rules/rule/rule-profile-view.js
server/sonar-web/src/main/js/apps/coding-rules/templates/rule/coding-rules-rule-meta.hbs
server/sonar-web/src/main/js/apps/custom-measures/templates/custom-measures-delete.hbs
server/sonar-web/src/main/js/apps/custom-measures/templates/custom-measures-form.hbs
server/sonar-web/src/main/js/apps/custom-measures/templates/custom-measures-list-footer.hbs
server/sonar-web/src/main/js/apps/custom-measures/templates/custom-measures-list-item.hbs
server/sonar-web/src/main/js/apps/custom-measures/templates/custom-measures-list.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-delete.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-form.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-header.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-list-footer.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-list-item.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-list.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-search.hbs
server/sonar-web/src/main/js/apps/groups/templates/groups-users.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-migration-failed.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-migration-not-supported.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-migration-required.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-migration-running.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-migration-succeeded.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-state-no-migration.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-status-down.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-status-migration.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-status-starting.hbs
server/sonar-web/src/main/js/apps/maintenance/templates/_maintenance-status-up.hbs
server/sonar-web/src/main/js/apps/metrics/templates/metrics-delete.hbs
server/sonar-web/src/main/js/apps/metrics/templates/metrics-form.hbs
server/sonar-web/src/main/js/apps/metrics/templates/metrics-header.hbs
server/sonar-web/src/main/js/apps/metrics/templates/metrics-list-footer.hbs
server/sonar-web/src/main/js/apps/metrics/templates/metrics-list-item.hbs
server/sonar-web/src/main/js/apps/overview/main/enhance.js
server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.js
server/sonar-web/src/main/js/apps/permission-templates/components/Defaults.js
server/sonar-web/src/main/js/apps/permission-templates/components/ListHeader.js
server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/__snapshots__/Defaults-test.js.snap
server/sonar-web/src/main/js/apps/permission-templates/templates/permission-templates-delete.hbs
server/sonar-web/src/main/js/apps/permission-templates/templates/permission-templates-form.hbs
server/sonar-web/src/main/js/apps/permissions/project/components/PageHeader.js
server/sonar-web/src/main/js/apps/permissions/project/templates/ApplyTemplateTemplate.hbs
server/sonar-web/src/main/js/apps/permissions/shared/components/HoldersList.js
server/sonar-web/src/main/js/apps/permissions/shared/components/SearchForm.js
server/sonar-web/src/main/js/apps/projectsManagement/Search.tsx
server/sonar-web/src/main/js/apps/projectsManagement/__tests__/__snapshots__/Search-test.tsx.snap
server/sonar-web/src/main/js/apps/quality-profiles/changelog/ChangelogSearch.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/ComparisonForm.tsx
server/sonar-web/src/main/js/apps/settings/encryption/EncryptionForm.js
server/sonar-web/src/main/js/apps/settings/encryption/GenerateSecretKeyForm.js
server/sonar-web/src/main/js/apps/settings/serverId/ServerIdApp.js
server/sonar-web/src/main/js/apps/update-center/templates/_update-center-plugin-actions.hbs
server/sonar-web/src/main/js/apps/update-center/templates/_update-center-plugin-changelog-entry.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-footer.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-header.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-plugin-changelog.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-plugin.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-search.hbs
server/sonar-web/src/main/js/apps/update-center/templates/update-center-system-update.hbs
server/sonar-web/src/main/js/apps/users/templates/users-change-password.hbs
server/sonar-web/src/main/js/apps/users/templates/users-deactivate.hbs
server/sonar-web/src/main/js/apps/users/templates/users-form.hbs
server/sonar-web/src/main/js/apps/users/templates/users-groups.hbs
server/sonar-web/src/main/js/apps/users/templates/users-header.hbs
server/sonar-web/src/main/js/apps/users/templates/users-list-footer.hbs
server/sonar-web/src/main/js/apps/users/templates/users-list-item.hbs
server/sonar-web/src/main/js/apps/users/templates/users-list.hbs
server/sonar-web/src/main/js/apps/users/templates/users-search.hbs
server/sonar-web/src/main/js/apps/users/templates/users-tokens.hbs
server/sonar-web/src/main/js/apps/users/tokens-view.js
server/sonar-web/src/main/js/components/SourceViewer/views/measures-overlay.js
server/sonar-web/src/main/js/components/SourceViewer/views/templates/_source-viewer-measures-duplications.hbs
server/sonar-web/src/main/js/components/SourceViewer/views/templates/_source-viewer-measures-lines.hbs
sonar-core/src/main/resources/org/sonar/l10n/core.properties
sonar-core/src/test/java/org/sonar/core/i18n/DefaultI18nTest.java

index a18b7c1ab91f03463c44cbf4ff4571738f37647b..36a74fdef7a9f681a947f43404029382c6a430b7 100644 (file)
@@ -116,7 +116,7 @@ class SettingsNav extends React.PureComponent {
               </li>
               <li>
                 <IndexLink to="/admin/custom_metrics" activeClassName="active">
-                  Custom Metrics
+                  {translate('custom_metrics.page')}
                 </IndexLink>
               </li>
               {this.props.extensions.map(this.renderExtension)}
@@ -165,7 +165,7 @@ class SettingsNav extends React.PureComponent {
               {!this.props.customOrganizations && (
                 <li>
                   <IndexLink to="/admin/projects_management" activeClassName="active">
-                    Management
+                    {translate('management')}
                   </IndexLink>
                 </li>
               )}
index ffd20497a524b3a7b0a03996fb5d013b528d3060..ca0145b11c855f7a21bd8810d4208a584fd9e228 100644 (file)
@@ -68,7 +68,7 @@ exports[`should work with extensions 1`] = `
             activeClassName="active"
             to="/admin/custom_metrics"
           >
-            Custom Metrics
+            custom_metrics.page
           </IndexLink>
         </li>
         <li>
@@ -156,7 +156,7 @@ exports[`should work with extensions 1`] = `
             activeClassName="active"
             to="/admin/projects_management"
           >
-            Management
+            management
           </IndexLink>
         </li>
         <li>
index 9c20ab517e385e656dd0d5c9464c00482c8e14e1..d7d9df33ed7f2015ad63de8924f05f3c592c69f1 100644 (file)
@@ -123,7 +123,9 @@ class Projects extends React.PureComponent {
         {allProjects.map(project => <ProjectNotifications key={project.key} project={project} />)}
 
         <div className="spacer-top panel bg-muted">
-          <span className="text-middle spacer-right">Set notifications for:</span>
+          <span className="text-middle spacer-right">
+            {translate('my_account.set_notifications_for')}:
+          </span>
           <Select.Async
             autoload={false}
             cache={false}
@@ -133,7 +135,7 @@ class Projects extends React.PureComponent {
             minimumInput={2}
             optionRenderer={this.renderOption}
             onChange={this.handleAddProject}
-            placeholder="Search Project"
+            placeholder={translate('my_account.search_project')}
           />
         </div>
       </section>
index efaa64321e6959b47cede320d35f461fe94b535a..0a6bbf5f26765ebade6d3eeb5ec0fe916635eb50 100644 (file)
@@ -29,7 +29,8 @@ exports[`should render projects 1`] = `
     <span
       className="text-middle spacer-right"
     >
-      Set notifications for:
+      my_account.set_notifications_for
+      :
     </span>
     <Async
       autoload={false}
@@ -43,7 +44,7 @@ exports[`should render projects 1`] = `
       onChange={[Function]}
       optionRenderer={[Function]}
       options={Array []}
-      placeholder="Search Project"
+      placeholder="my_account.search_project"
       searchPromptText="Type to search"
       style={
         Object {
@@ -92,7 +93,8 @@ exports[`should render projects 2`] = `
     <span
       className="text-middle spacer-right"
     >
-      Set notifications for:
+      my_account.set_notifications_for
+      :
     </span>
     <Async
       autoload={false}
@@ -106,7 +108,7 @@ exports[`should render projects 2`] = `
       onChange={[Function]}
       optionRenderer={[Function]}
       options={Array []}
-      placeholder="Search Project"
+      placeholder="my_account.search_project"
       searchPromptText="Type to search"
       style={
         Object {
@@ -155,7 +157,8 @@ exports[`should render projects 3`] = `
     <span
       className="text-middle spacer-right"
     >
-      Set notifications for:
+      my_account.set_notifications_for
+      :
     </span>
     <Async
       autoload={false}
@@ -169,7 +172,7 @@ exports[`should render projects 3`] = `
       onChange={[Function]}
       optionRenderer={[Function]}
       options={Array []}
-      placeholder="Search Project"
+      placeholder="my_account.search_project"
       searchPromptText="Type to search"
       style={
         Object {
index 343e4206abacb1304eaa7f512d448384cd2ad24d..1022a377f331b99552359648cf5e0487ecbed22d 100644 (file)
@@ -24,6 +24,7 @@ import UserExternalIdentity from './UserExternalIdentity';
 import UserGroups from './UserGroups';
 import UserScmAccounts from './UserScmAccounts';
 import { getCurrentUser, areThereCustomOrganizations } from '../../../store/rootReducer';
+import { translate } from '../../../helpers/l10n';
 
 /*::
 type Props = {
@@ -45,7 +46,7 @@ function Profile(props /*: Props */) {
   return (
     <div className="account-body account-container">
       <div className="spacer-bottom">
-        Login: <strong id="login">{user.login}</strong>
+        {translate('login')}: <strong id="login">{user.login}</strong>
       </div>
 
       {!user.local &&
@@ -57,7 +58,7 @@ function Profile(props /*: Props */) {
 
       {!!user.email && (
         <div className="spacer-bottom">
-          Email: <strong id="email">{user.email}</strong>
+          {translate('my_profile.email')}: <strong id="email">{user.email}</strong>
         </div>
       )}
 
index 12884afbff9e46a38c0e5701b68081ff7881683f..2c8da3e02977aa8d4b668450c3e172f065d88b26 100644 (file)
@@ -1,4 +1,4 @@
-<h2 class="spacer-bottom">Tokens</h2>
+<h2 class="spacer-bottom">{{t 'users.tokens'}}</h2>
 
 <div class="big-spacer-bottom big-spacer-right markdown">
   <p>{{t 'my_account.tokens_description'}}</p>
@@ -8,8 +8,8 @@
   <table class="data">
     <thead>
     <tr>
-      <th>Name</th>
-      <th class="text-right">Created</th>
+      <th>{{t 'name'}}</th>
+      <th class="text-right">{{t 'created'}}</th>
       <th>&nbsp;</th>
     </tr>
     </thead>
@@ -28,9 +28,9 @@
           <div class="big-spacer-left">
             <form class="js-revoke-token-form" data-token="{{name}}">
               {{#if deleting}}
-                <button class="button-red active input-small">Sure?</button>
+                <button class="button-red active input-small">{{t 'users.tokens.sure'}}</button>
               {{else}}
-                <button class="button-red input-small">Revoke</button>
+                <button class="button-red input-small">{{t 'users.tokens.revoke'}}</button>
               {{/if}}
             </form>
           </div>
@@ -39,7 +39,7 @@
     {{else}}
       <tr>
         <td colspan="3">
-          <span class="note">No tokens</span>
+          <span class="note">{{t 'users.no_tokens'}}</span>
         </td>
       </tr>
     {{/each}}
 {{/each}}
 
 <form class="js-generate-token-form spacer-top panel bg-muted">
-  <label>Generate New Token:</label>
-  <input type="text" required maxlength="100" placeholder="Enter Token Name">
-  <button>Generate</button>
+  <label>{{t 'users.generate_new_token'}}:</label>
+  <input type="text" required maxlength="100" placeholder="{{t 'users.enter_token_name'}}">
+  <button>{{t 'users.generate'}}</button>
 </form>
 
 {{#if newToken}}
   <div class="panel panel-white big-spacer-top">
     <div class="alert alert-warning">
-      New token "{{limitString newToken.name}}" has been created. Make sure you copy it now, you won’t be able to see it
-      again!
+      {{tp 'users.tokens.new_token_created' newToken.name}}
     </div>
 
     <table class="data">
       <tr>
-
         <td class="thin">
-          <button class="js-copy-to-clipboard" data-clipboard-text="{{newToken.token}}">Copy</button>
+          <button class="js-copy-to-clipboard" data-clipboard-text="{{newToken.token}}">{{t 'copy'}}</button>
         </td>
         <td class="nowrap">
           <div class="monospaced text-success">{{newToken.token}}</div>
index 29ef6f5f9cd1f07f1487ab13a01c01e6fba39595..e63f1692804f9e2c3ae0754be67ef6d247237e20 100644 (file)
@@ -22,6 +22,7 @@ import Marionette from 'backbone.marionette';
 import Clipboard from 'clipboard';
 import Template from './templates/account-tokens.hbs';
 import { getTokens, generateToken, revokeToken } from '../../api/user-tokens';
+import { translate } from '../../helpers/l10n';
 
 export default Marionette.ItemView.extend({
   template: Template,
@@ -81,7 +82,11 @@ export default Marionette.ItemView.extend({
       const clipboard = new Clipboard(copyButton.get(0));
       clipboard.on('success', () => {
         copyButton
-          .tooltip({ title: 'Copied!', placement: 'bottom', trigger: 'manual' })
+          .tooltip({
+            title: translate('users.tokens.copied'),
+            placement: 'bottom',
+            trigger: 'manual'
+          })
           .tooltip('show');
         setTimeout(() => copyButton.tooltip('hide'), 1000);
       });
index de5c77abebd50e0da4e9b19389dc1c3effd510ba..fbb3bd5df25cef8adc65a2bce202f0de819ceee6 100644 (file)
@@ -20,6 +20,7 @@
 import $ from 'jquery';
 import React, { Component } from 'react';
 import { isValidDate, parseDate, toShortNotSoISOString } from '../../../helpers/dates';
+import { translate } from '../../../helpers/l10n';
 
 export default class DateFilter extends Component {
   componentDidMount() {
@@ -70,7 +71,7 @@ export default class DateFilter extends Component {
           onChange={() => true}
           ref="minDate"
           type="text"
-          placeholder="From"
+          placeholder={translate('from')}
         />{' '}
         <input
           className="input-small"
@@ -78,7 +79,7 @@ export default class DateFilter extends Component {
           onChange={() => true}
           ref="maxDate"
           type="text"
-          placeholder="To"
+          placeholder={translate('to')}
         />
       </div>
     );
index 9036a5613b09d620ce78cd0d998430f71dc3c0d6..d8bf4203b0c19edb953268e10fd2b42244fc662a 100644 (file)
@@ -79,7 +79,9 @@ export default class Search extends React.PureComponent {
 
     return (
       <li>
-        <h6 className="bt-search-form-label">Search by Task or Component</h6>
+        <h6 className="bt-search-form-label">
+          {translate('background_tasks.search_by_task_or_component')}
+        </h6>
 
         <input
           onChange={e => this.handleQueryChange(e.target.value)}
@@ -87,7 +89,7 @@ export default class Search extends React.PureComponent {
           ref="searchInput"
           className="js-search input-medium"
           type="search"
-          placeholder="Search"
+          placeholder={translate('search_verb')}
         />
       </li>
     );
@@ -109,12 +111,12 @@ export default class Search extends React.PureComponent {
       <section className="big-spacer-top big-spacer-bottom">
         <ul className="bt-search-form">
           <li>
-            <h6 className="bt-search-form-label">Status</h6>
+            <h6 className="bt-search-form-label">{translate('status')}</h6>
             <StatusFilter value={status} onChange={this.handleStatusChange.bind(this)} />
           </li>
           {types.length > 1 && (
             <li>
-              <h6 className="bt-search-form-label">Type</h6>
+              <h6 className="bt-search-form-label">{translate('type')}</h6>
               <TypesFilter
                 value={taskType}
                 types={types}
@@ -124,12 +126,14 @@ export default class Search extends React.PureComponent {
           )}
           {!component && (
             <li>
-              <h6 className="bt-search-form-label">Only Latest Analysis</h6>
+              <h6 className="bt-search-form-label">
+                {translate('background_tasks.currents_filter.ONLY_CURRENTS')}
+              </h6>
               <CurrentsFilter value={currents} onChange={this.handleCurrentsChange.bind(this)} />
             </li>
           )}
           <li>
-            <h6 className="bt-search-form-label">Date</h6>
+            <h6 className="bt-search-form-label">{translate('date')}</h6>
             <DateFilter
               minSubmittedAt={minSubmittedAt}
               maxExecutedAt={maxExecutedAt}
index 3ddbfd5096131e39ec6a3da5ec8b6709bb509244..31b1056c266599c38adfb5488fff3b4d4e3ddaaa 100644 (file)
@@ -76,6 +76,8 @@ export default Marionette.ItemView.extend({
         'coding_rules.revert_to_parent_definition.confirm',
         this.getParent().name
       ),
+      yesLabel: translate('yes'),
+      noLabel: translate('cancel'),
       yesHandler() {
         return $.ajax({
           type: 'POST',
@@ -98,6 +100,8 @@ export default Marionette.ItemView.extend({
     confirmDialog({
       title: translate('coding_rules.deactivate'),
       html: translateWithParameters('coding_rules.deactivate.confirm'),
+      yesLabel: translate('yes'),
+      noLabel: translate('cancel'),
       yesHandler() {
         return $.ajax({
           type: 'POST',
index 41d6a6999a10e91fd409be59a89aec076c916467..8f6506a0dbc1cb96c73e56f15cfbd1828f115d5d 100644 (file)
@@ -2,8 +2,7 @@
   <div class="page-actions">
     <span class="note">{{key}}</span>
 
-    <a class="coding-rules-detail-permalink link-no-underline spacer-left" target="_blank" href="{{permalink}}"
-       data-toggle="tooltip" data-placement="left" title="Rule permalink">
+    <a class="coding-rules-detail-permalink link-no-underline spacer-left" target="_blank" href="{{permalink}}">
       <svg
         class="text-text-top"
         xmlns="http://www.w3.org/2000/svg"
   </li>
 
   <li class="coding-rules-detail-property"
-      data-toggle="tooltip" data-placement="bottom" title="Default rule severity">
+      data-toggle="tooltip" data-placement="bottom" title="{{t 'default_severity'}}">
     {{severityIcon severity}}&nbsp;{{t "severity" severity}}
   </li>
 
   {{#notEq status 'READY'}}
     <li class="coding-rules-detail-property"
-        data-toggle="tooltip" data-placement="bottom" title="Rule status">
+        data-toggle="tooltip" data-placement="bottom" title="{{t 'status'}}">
       <span class="badge badge-normal-size badge-danger-light">
         {{t 'rules.status' status}}
       </span>
@@ -47,7 +46,7 @@
   {{/notEq}}
 
   <li class="coding-rules-detail-property coding-rules-detail-tag-list {{#if canCustomizeRule}}coding-rules-detail-tags-change{{/if}}"
-      data-toggle="tooltip" data-placement="bottom" title="Rule tags">
+      data-toggle="tooltip" data-placement="bottom" title="{{t 'tags'}}">
     <i class="icon-tags"></i>
     <span>{{#if allTags}}{{join allTags ', '}}{{else}}{{t 'coding_rules.no_tags'}}{{/if}}</span>
     {{#if canCustomizeRule}}<i class="icon-dropdown"></i>{{/if}}
index 87a29038ba1327edb8d2e6d25f81b7d1a260977a..c216329b3b117df064c295497f768f41bd2d1ef2 100644 (file)
@@ -1,13 +1,13 @@
 <form id="delete-custom-measure-form">
   <div class="modal-head">
-    <h2>Delete Custom Measure</h2>
+    <h2>{{t 'custom_measures.delete_custom_measure'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
-    Are you sure you want to delete custom measure "{{metric.name}}"?
+    {{tp 'custom_measures.delete_custom_measure.confirmation' metric.name}}
   </div>
   <div class="modal-foot">
-    <button id="delete-custom-measure-submit" class="button-red">Delete</button>
-    <a href="#" class="js-modal-close" id="delete-custom-measure-cancel">Cancel</a>
+    <button id="delete-custom-measure-submit" class="button-red">{{t 'delete'}}</button>
+    <a href="#" class="js-modal-close" id="delete-custom-measure-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 71b01cc044c1d1387e73164fd2ef0b69d722013e..884cad7e08dfa0cdd1440857df44901444bf007d 100644 (file)
@@ -1,6 +1,6 @@
 <form id="create-custom-measure-form" autocomplete="off">
   <div class="modal-head">
-    <h2>{{#if id}}Update{{else}}Create{{/if}} Custom Measure</h2>
+    <h2>{{#if id}}{{t 'custom_measures.update_custom_measure'}}{{else}}{{t 'custom_measures.create_custom_measure'}}{{/if}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
@@ -8,7 +8,7 @@
     {{#unless id}}
       {{#if canCreateMetric}}
         <div class="modal-field">
-          <label for="create-custom-measure-metric">Metric<em class="mandatory">*</em></label>
+          <label for="create-custom-measure-metric">{{t 'custom_measures.metric'}}<em class="mandatory">*</em></label>
           <select id="create-custom-measure-metric" name="metric" required>
             {{#each metrics}}
               <option value="{{id}}" {{#eq id ../metric.id}}selected{{/eq}}>{{name}}</option>
     {{/unless}}
 
     <div class="modal-field">
-      <label for="create-custom-measure-value">Value<em class="mandatory">*</em></label>
+      <label for="create-custom-measure-value">{{t 'value'}}<em class="mandatory">*</em></label>
       <input id="create-custom-measure-value" name="value" type="text" maxlength="200" required value="{{value}}">
     </div>
 
     <div class="modal-field">
-      <label for="create-custom-measure-description">Description</label>
+      <label for="create-custom-measure-description">{{t 'description'}}</label>
       <textarea id="create-custom-measure-description" name="description">{{description}}</textarea>
     </div>
   </div>
   <div class="modal-foot">
     <button id="create-custom-measure-submit" {{#unless canCreateMetric}}disabled{{/unless}}>
-      {{#if id}}Update{{else}}Create{{/if}}
+      {{#if id}}{{t 'update_verb'}}{{else}}{{t 'create_verb'}}{{/if}}
     </button>
-    <a href="#" class="js-modal-close" id="create-custom-measure-cancel">Cancel</a>
+    <a href="#" class="js-modal-close" id="create-custom-measure-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 3a91e24482c3b2674edfb1f75551a9aee4fc980a..91d1dbcfee54ac799466939277a17f67e5ada17f 100644 (file)
@@ -1,6 +1,6 @@
 <footer class="spacer-top note text-center">
-  {{count}}/{{total}} shown
+  {{tp 'x_of_y_shown' count total}}
   {{#if more}}
-    <a id="custom-measures-fetch-more" class="spacer-left" href="#">show more</a>
+    <a id="custom-measures-fetch-more" class="spacer-left" href="#">{{t 'show_more'}}</a>
   {{/if}}
 </footer>
index 7e26438880c14ca296cffa8cc27026dc6b002a2b..8efd57f4c110a54ac62a2c44e985916672fed075 100644 (file)
 
 <td class="">
   {{#if updatedAt }}
-    Updated on <span class="js-custom-measure-created-at">{{d updatedAt}}</span>
+    {{t 'updated_on'}} <span class="js-custom-measure-created-at">{{d updatedAt}}</span>
   {{else}}
     {{#if createdAt }}
-      Created on <span class="js-custom-measure-created-at">{{d createdAt}}</span>
+      {{t 'created_on'}} <span class="js-custom-measure-created-at">{{d createdAt}}</span>
     {{else}}
-      Created 
+      {{t 'created'}} 
     {{/if}}
   {{/if}}
-  by <span class="js-custom-measure-user">{{user.name}}</span>
+  {{t 'by_'}} <span class="js-custom-measure-user">{{user.name}}</span>
 </td>
 
 <td class="thin nowrap">
index c01d062cd6c5836b0b91432f69e016da917d3a37..20ca1491fa3e09687574b338278e4d8fe27593a3 100644 (file)
@@ -1,10 +1,10 @@
 <table class="data zebra">
   <thead>
   <tr>
-    <th>Metric</th>
-    <th>Value</th>
-    <th>Description</th>
-    <th>Date</th>
+    <th>{{t 'custom_measures.metric'}}</th>
+    <th>{{t 'value'}}</th>
+    <th>{{t 'description'}}</th>
+    <th>{{t 'date'}}</th>
     <th>&nbsp;</th>
   </tr>
   </thead>
index 30628d56777188ff7466341f8143bdf3e257fef7..00d92c0a9836d2e59f5c88400cd0aa6cb7c00da8 100644 (file)
@@ -1,13 +1,13 @@
 <form id="delete-group-form" autocomplete="off">
   <div class="modal-head">
-    <h2>Delete Group</h2>
+    <h2>{{t 'groups.delete_group'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
-    <div class="js-modal-text">Are you sure you want to delete "{{name}}"?</div>
+    <div class="js-modal-text">{{tp 'groups.delete_group.confirmation' name}}</div>
   </div>
   <div class="modal-foot">
-    <button id="delete-group-submit">Delete</button>
-    <a href="#" class="js-modal-close" id="delete-group-cancel">Cancel</a>
+    <button id="delete-group-submit">{{t 'delete'}}</button>
+    <a href="#" class="js-modal-close" id="delete-group-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index a0927b33a7322ee9ed8a724dc05464a60d852d70..c31e8598cd75dfe21b08e25149a524d4a0b9d795 100644 (file)
@@ -1,24 +1,24 @@
 <form id="create-group-form" autocomplete="off">
   <div class="modal-head">
-    <h2>{{#if id}}Update{{else}}Create{{/if}} Group</h2>
+    <h2>{{#if id}}{{t 'groups.update_group'}}{{else}}{{t 'groups.create_group'}}{{/if}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
     <div class="modal-field">
-      <label for="create-group-name">Name<em class="mandatory">*</em></label>
+      <label for="create-group-name">{{t 'name'}}<em class="mandatory">*</em></label>
       {{! keep this fake field to hack browser autofill }}
       <input id="create-group-name-fake" name="name-fake" type="text" class="hidden">
       <input id="create-group-name" name="name" type="text" size="50" maxlength="255" required value="{{name}}">
     </div>
     <div class="modal-field">
-      <label for="create-group-description">Description</label>
+      <label for="create-group-description">{{t 'description'}}</label>
       {{! keep this fake field to hack browser autofill }}
       <textarea id="create-group-description-fake" name="description-fake" class="hidden"></textarea>
       <textarea id="create-group-description" name="description">{{description}}</textarea>
     </div>
   </div>
   <div class="modal-foot">
-    <button id="create-group-submit">{{#if id}}Update{{else}}Create{{/if}}</button>
-    <a href="#" class="js-modal-close" id="create-group-cancel">Cancel</a>
+    <button id="create-group-submit">{{#if id}}{{t 'update_verb'}}{{else}}{{t 'create'}}{{/if}}</button>
+    <a href="#" class="js-modal-close" id="create-group-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 94cf4a1ec34a6f9239cc045d5ec71076e82a4b4c..3a63842e3c21a559bb4957cd8d65023258a927d8 100644 (file)
@@ -3,7 +3,7 @@
   <i class="spinner hidden"></i>
   <div class="page-actions">
     <div class="button-group">
-      <button id="groups-create">Create Group</button>
+      <button id="groups-create">{{t 'groups.create_group'}}</button>
     </div>
   </div>
   <p class="page-description">{{t 'user_groups.page.description'}}</p>
index 841ab40ecd99ba01b66f47f1990c714bde8d109c..16d1bdec7f56fbd55eebcf73d80d73ff0f813339 100644 (file)
@@ -1,6 +1,6 @@
 <footer class="spacer-top note text-center">
-  {{count}}/{{total}} shown
+  {{tp 'x_of_y_shown' count total}}
   {{#if more}}
-    <a id="groups-fetch-more" class="spacer-left" href="#">show more</a>
+    <a id="groups-fetch-more" class="spacer-left" href="#">{{t 'show_more'}}</a>
   {{/if}}
 </footer>
index 85306c7f827ddb049951667a20eb1c699a8fbcdf..9f6bab623214accd3b725fe3c857dadd5e2409ea 100644 (file)
@@ -1,7 +1,7 @@
 <div class="pull-right big-spacer-left nowrap">
   {{#unless default}}
-    <a class="js-group-update icon-edit little-spacer-right" title={{t 'users.update_details'}} data-toggle="tooltip" href="#"></a>
-    <a class="js-group-delete icon-delete" title={{t 'delete'}} data-toggle="tooltip" href="#"></a>
+    <a class="js-group-update icon-edit little-spacer-right" title="{{t 'update_details'}}" data-toggle="tooltip" href="#"></a>
+    <a class="js-group-delete icon-delete" title="{{t 'delete'}}" data-toggle="tooltip" href="#"></a>
   {{/unless}}
 </div>
 
@@ -19,7 +19,7 @@
   <div class="overflow-hidden bordered-left">
     <span class="spacer-left spacer-right">{{membersCount}}</span>
     {{#unless default}}
-      <a class="js-group-users icon-bullet-list" title={{t 'users.update'}} data-toggle="tooltip" href="#"></a>
+      <a class="js-group-users icon-bullet-list" title="{{t 'users.update'}}" data-toggle="tooltip" href="#"></a>
     {{/unless}}
   </div>
 </div>
index 3db5500c5cc1dcf4f01059bf79ac8478de0e1f82..b96143e7caa11cbfb02d04b2ad73cecb2dd455a3 100644 (file)
@@ -2,7 +2,7 @@
   {{#isNull organization}}
     <div class="panel panel-vertical js-anyone">
       <div class="display-inline-block text-top width-20">
-        <strong class="js-group-name">Anyone</strong>
+        <strong class="js-group-name">{{t 'groups.anyone'}}</strong>
       </div>
 
       <div class="display-inline-block text-top big-spacer-left width-25">
index 5e81ec0b32a855c92584015de57ed97803e03774..013f7cba90abcce1568cf8206e2ee5c73aa8a803 100644 (file)
@@ -1,6 +1,6 @@
 <div class="panel panel-vertical bordered-bottom spacer-bottom">
   <form id="groups-search-form" class="search-box">
     <button id="groups-search-submit" class="search-box-submit button-clean"><i class="icon-search"></i></button>
-    <input id="groups-search-query" class="search-box-input" type="search" name="q" placeholder="Search" maxlength="100">
+    <input id="groups-search-query" class="search-box-input" type="search" name="q" placeholder="{{t 'search_verb'}}" maxlength="100">
   </form>
 </div>
index eb346c0e31bad72ca3898ab00f7dab1f25f89072..7f9db589a3e8bd15b833c1bf311f4a1c32795012 100644 (file)
@@ -1,10 +1,10 @@
 <div class="modal-head">
-  <h2>Update users</h2>
+  <h2>{{t 'users.update'}}</h2>
 </div>
 <div class="modal-body">
   <div class="js-modal-messages"></div>
   <div id="groups-users"></div>
 </div>
 <div class="modal-foot">
-  <a href="#" class="js-modal-close" id="groups-users-done">Done</a>
+  <a href="#" class="js-modal-close" id="groups-users-done">{{t 'Done'}}</a>
 </div>
index 2392a0f243eddbc5d79d232d48b342e84e4f94ed..ab1421b6b7ed750b1f635c8efbbc857c2d767135 100644 (file)
@@ -1,2 +1,2 @@
-<h1 class="maintenance-title text-danger">Upgrade Failed</h1>
-<p class="maintenance-text">Database connection cannot be established. Please check database status and JDBC settings.</p>
+<h1 class="maintenance-title text-danger">{{t 'maintenance.upgrade_failed'}}</h1>
+<p class="maintenance-text">{{t 'maintenance.upgrade_failed.text'}}</p>
index c139aa32211acc4c345c8bdd4c6fd96402dbc51e..6d023044313dbc9411bad7110e3f1e5138d24d77 100644 (file)
@@ -1,2 +1,2 @@
-<h1 class="maintenance-title text-danger">Migration not supported</h1>
-<p>Migration is not supported on embedded databases.</p>
+<h1 class="maintenance-title text-danger">{{t 'maintenance.migration_not_supported'}}</h1>
+<p>{{t 'maintenance.migration_not_supported.text'}}</p>
index 3830c20044ce9e3463e2a332bfa2713db907942e..3236ff5a80f91ad01c65dee937a02bb6404b5983 100644 (file)
@@ -1,7 +1,7 @@
-<h1 class="maintenance-title">Upgrade Database</h1>
-<p class="maintenance-text">The database upgrade can take several minutes.</p>
-<p class="maintenance-text">It is mandatory to <strong>back up database</strong> before upgrading.</p>
-<p class="maintenance-text">Make sure you have followed the steps from the <a target="_blank" href="https://redirect.sonarsource.com/doc/upgrading.html">SonarQube Upgrade guide</a>.</p>
+<h1 class="maintenance-title">{{t 'maintenance.upgrade_database'}}</h1>
+<p class="maintenance-text">{{t 'maintenance.upgrade_database.1'}}</p>
+<p class="maintenance-text">{{t 'maintenance.upgrade_database.2'}}</p>
+<p class="maintenance-text">{{t 'maintenance.upgrade_database.3'}}</p>
 <div class="maintenance-spinner">
-  <button id="start-migration">Upgrade</button>
+  <button id="start-migration">{{t 'maintenance.upgrade'}}</button>
 </div>
index 52702e27c3187022b20d5e409b660ecdcfd5d7db..c69baef7434d8d8ad81877d37a1e750022a02e1e 100644 (file)
@@ -1,10 +1,10 @@
-<h1 class="maintenance-title">Database Migration</h1>
+<h1 class="maintenance-title">{{t 'maintenance.database_migration'}}</h1>
 {{#if message}}
   <p class="maintenance-text text-center">{{message}}</p>
 {{/if}}
 {{#if startedAt}}
   <p class="maintenance-text text-center">
-    Started {{fromNow startedAt}}<br>
+    {{t 'background_tasks.table.started'}} {{fromNow startedAt}}<br>
     <small class="text-muted">{{dt startedAt}}</small>
   </p>
 {{/if}}
index 4f94bf53f34e53c25aefbc022f141819522b5b64..7e70e68cf301df6838baee70a44260d5e02191e7 100644 (file)
@@ -1,4 +1,4 @@
-<h1 class="maintenance-title text-success">Database is up-to-date</h1>
+<h1 class="maintenance-title text-success">{{t 'maintenance.database_is_up_to_date'}}</h1>
 <p class="maintenance-text text-center">
-  <a href="{{link '/'}}">Home</a>
+  <a href="{{link '/'}}">{{t 'layout.home'}}</a>
 </p>
index ba0912953886b25d9a0ac962a2cea305e9b6c742..6c30631c9a5fe8694f5ef9c86a36afb515116929 100644 (file)
@@ -1,4 +1,4 @@
-<h1 class="maintenance-title">Database is up-to-date</h1>
+<h1 class="maintenance-title">{{t 'maintenance.database_is_up_to_date'}}</h1>
 <p class="maintenance-text text-center">
-  <a href="{{link '/'}}">Home</a>
+  <a href="{{link '/'}}">{{t 'layout.home'}}</a>
 </p>
index 6507cbafa2ee7f04fbab21dd95c841058e78c565..811aa16ef5b2038a5ba4039b2c881b42dcbfa015 100644 (file)
@@ -1,5 +1,5 @@
-<h1 class="maintenance-title text-danger">SonarQube is down</h1>
-<p class="maintenance-text">Something went wrong. Please contact your system administrator.</p>
+<h1 class="maintenance-title text-danger">{{t 'maintenance.sonarqube_is_down'}}</h1>
+<p class="maintenance-text">{{t 'maintenance.sonarqube_is_down.text'}}</p>
 <p class="maintenance-text text-center">
-  <a href="{{link '/'}}">Try Again</a>
+  <a href="{{link '/'}}">{{t 'maintenance.try_again'}}</a>
 </p>
index 267107206aa8a3df21175a7bb1d4d9a58efebd16..f51f4c72475fb546abd97f83b16813f8176f513c 100644 (file)
@@ -1,7 +1,3 @@
-<h1 class="maintenance-title">SonarQube is under maintenance</h1>
-<p class="maintenance-text">While waiting, you might want to investigate
-  <a href="https://redirect.sonarsource.com/doc/plugin-library.html">new plugins</a> to extend the current functionality.
-</p>
-<p class="maintenance-text">If you are an administrator and have no idea why this message is being shown, you should
-  read the <a href="https://redirect.sonarsource.com/doc/upgrading.html">upgrade guide</a>.
-</p>
+<h1 class="maintenance-title">{{t 'maintenance.sonarqube_is_under_maintenance'}}</h1>
+<p class="maintenance-text">{{{t 'maintenance.sonarqube_is_under_maintenance.1'}}}</p>
+<p class="maintenance-text">{{{t 'maintenance.sonarqube_is_under_maintenance.2'}}}</p>
index 263a3ff9a2facc6010bdb4fed0004e16a6b6866d..96f7d89f1224a559734e4eb113d0997ab89115a7 100644 (file)
@@ -1,2 +1,2 @@
-<h1 class="maintenance-title">SonarQube is starting</h1>
+<h1 class="maintenance-title">{{t 'maintenance.sonarqube_is_starting'}}</h1>
 <p class="maintenance-spinner"><i class="spinner"></i></p>
index 170edf144a2bf1844c805eb742da4ee9ce5e6cfe..e97b550f3422e434c9384b46f05060147e6d2489 100644 (file)
@@ -1,5 +1,5 @@
-<h1 class="maintenance-title">SonarQube is up</h1>
-<p class="maintenance-text text-center">All systems operational.</p>
+<h1 class="maintenance-title">{{t 'maintenance.sonarqube_is_up'}}</h1>
+<p class="maintenance-text text-center">{{t 'maintenance.all_systems_opetational'}}</p>
 <p class="maintenance-text text-center">
-  <a href="{{link '/'}}">Home</a>
+  <a href="{{link '/'}}">{{t 'layout.home'}}</a>
 </p>
index 73cddffcbf0497c8bd2ed81944c8a7ead0c9d7b1..e6bf9ff5323fc2c7c62016830e71e6d674c287a2 100644 (file)
@@ -1,13 +1,13 @@
 <form id="delete-metric-form">
   <div class="modal-head">
-    <h2>Delete Metric</h2>
+    <h2>{{t 'custom_metrics.delete_metric'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
-    Are you sure you want to delete metric "{{name}}"?
+    {{tp 'custom_metrics.delete_metric.confirmation' name}}
   </div>
   <div class="modal-foot">
-    <button id="delete-metric-submit" class="button-red">Delete</button>
-    <a href="#" class="js-modal-close" id="delete-metric-cancel">Cancel</a>
+    <button id="delete-metric-submit" class="button-red">{{t 'delete'}}</button>
+    <a href="#" class="js-modal-close" id="delete-metric-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index e7f23e20e5e49383052c90cbe1b63824db44ab8e..55c9c9d4936fd2fe540ab500b904841a15d4b24e 100644 (file)
@@ -1,27 +1,27 @@
 <form id="create-metric-form" autocomplete="off">
   <div class="modal-head">
-    <h2>{{#if id}}Update{{else}}Create{{/if}} Metric</h2>
+    <h2>{{#if id}}{{t 'custom_metrics.update_metric'}}{{else}}{{t 'custom_metrics.create_metric'}}{{/if}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
     <div class="modal-field">
-      <label for="create-metric-key">Key<em class="mandatory">*</em></label>
+      <label for="create-metric-key">{{t 'key'}}<em class="mandatory">*</em></label>
       <input id="create-metric-key" name="key" type="text" maxlength="200" required value="{{key}}">
     </div>
     <div class="modal-field">
-      <label for="create-metric-name">Name<em class="mandatory">*</em></label>
+      <label for="create-metric-name">{{t 'name'}}<em class="mandatory">*</em></label>
       <input id="create-metric-name" name="name" type="text" maxlength="200" required value="{{name}}">
     </div>
     <div class="modal-field">
-      <label for="create-metric-description">Description</label>
+      <label for="create-metric-description">{{t 'description'}}</label>
       <textarea id="create-metric-description" name="description">{{description}}</textarea>
     </div>
     <div class="modal-field">
-      <label for="create-metric-domain">Domain</label>
+      <label for="create-metric-domain">{{t 'custom_metrics.domain'}}</label>
       <input id="create-metric-domain" name="domain" type="text" maxlength="200" value="{{this.domain}}">
     </div>
     <div class="modal-field">
-      <label for="create-metric-type">Type<em class="mandatory">*</em></label>
+      <label for="create-metric-type">{{t 'type'}}<em class="mandatory">*</em></label>
       <select id="create-metric-type" name="type">
         {{#each types}}
           <option value="{{this}}" {{#eq this ../type}}selected{{/eq}}>{{t 'metric.type' this}}</option>
@@ -30,7 +30,7 @@
     </div>
   </div>
   <div class="modal-foot">
-    <button id="create-metric-submit">{{#if id}}Update{{else}}Create{{/if}}</button>
-    <a href="#" class="js-modal-close" id="create-metric-cancel">Cancel</a>
+    <button id="create-metric-submit">{{#if id}}{{t 'update_verb'}}{{else}}{{t 'create'}}{{/if}}</button>
+    <a href="#" class="js-modal-close" id="create-metric-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 05ef5f04fad2a1a8ced81533e8f2d4e3434ced69..fc2d4d1e08023ac8ec8c36553001f8b25bfbd9cb 100644 (file)
@@ -1,10 +1,9 @@
 <header class="page-header">
-  <h1 class="page-title">Custom Metrics</h1>
+  <h1 class="page-title">{{t 'custom_metrics.page'}}</h1>
   <div class="page-actions">
     <div class="button-group">
-      <button id="metrics-create">Create Metric</button>
+      <button id="metrics-create">{{t 'custom_metrics.create_metric'}}</button>
     </div>
   </div>
-  <p class="page-description">These metrics are available for all projects. Manual measures can be set at project level
-    via the configuration interface.</p>
+  <p class="page-description">{{t 'custom_metrics.page.description'}}</p>
 </header>
index c389b85f818e9c805c4bec5761fde25185fe3222..fe8af8e8aef5cff988496d5a5b06317a1a970e80 100644 (file)
@@ -1,6 +1,6 @@
 <footer class="spacer-top note text-center">
-  {{count}}/{{total}} shown
+  {{tp 'x_of_y_shown' count total}}
   {{#if more}}
-    <a id="metrics-fetch-more" class="spacer-left" href="#">show more</a>
+    <a id="metrics-fetch-more" class="spacer-left" href="#">{{t 'show_more'}}</a>
   {{/if}}
 </footer>
index 26b784ea30398aa91f343f6f31642c9e2ac0ce7f..cb25af27f9436c632972fbb8434986465302cdb0 100644 (file)
@@ -1,6 +1,6 @@
 <div class="pull-right big-spacer-left nowrap">
-  <a class="js-metric-update icon-edit" title="Update" data-toggle="tooltip" href="#"></a>
-  <a class="js-metric-delete icon-delete" title="Delete" data-toggle="tooltip" href="#"></a>
+  <a class="js-metric-update icon-edit" title="{{t 'update_verb'}}" data-toggle="tooltip" href="#"></a>
+  <a class="js-metric-delete icon-delete" title="{{t 'delete'}}" data-toggle="tooltip" href="#"></a>
 </div>
 
 <div class="display-inline-block text-top width-30">
index 3e3759dfb33a6d4cd5372bb5303f731f2165ec2c..15104554cc679e21b2470ea964100934f0f06791 100644 (file)
@@ -34,7 +34,7 @@ import {
   getShortType,
   getRatingTooltip
 } from '../../../helpers/measures';
-import { translateWithParameters } from '../../../helpers/l10n';
+import { translateWithParameters, getLocalizedMetricName } from '../../../helpers/l10n';
 import { getPeriodDate } from '../../../helpers/periods';
 import {
   getComponentDrilldownUrl,
@@ -93,7 +93,7 @@ export default function enhance(ComposedComponent) {
           </div>
 
           <div className="overview-domain-measure-label offset-left">
-            {measure.metric.name}
+            {getLocalizedMetricName(measure.metric)}
             {this.renderHistoryLink(measure.metric.key)}
           </div>
         </div>
index c2b33c0356d827f93fcf23d8ce2f22d04ad8a454..1c2e6f0618b655eef2c78f9843ef398bc5b3eb32 100644 (file)
@@ -162,7 +162,7 @@ export default class ActionsCell extends React.PureComponent {
             <li>
               <Link to={{ pathname, query: { id: t.id } }}>
                 {this.renderDropdownIcon(<i className="icon-edit" />)}
-                Edit Permissions
+                {translate('edit_permissions')}
               </Link>
             </li>
           )}
@@ -170,7 +170,7 @@ export default class ActionsCell extends React.PureComponent {
           <li>
             <a href="#" className="js-update" onClick={this.handleUpdateClick.bind(this)}>
               {this.renderDropdownIcon(<i className="icon-edit" />)}
-              Update Details
+              {translate('update_details')}
             </a>
           </li>
 
index 454b269f85a326f4671c6f0e8f33b5bfcd271c03..c4faebbdd44b0b4d9abf8dce7f491b8cae09bedb 100644 (file)
@@ -20,7 +20,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import { sortBy } from 'lodash';
-import { translate } from '../../../helpers/l10n';
+import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { PermissionTemplateType } from '../propTypes';
 
 export default class Defaults extends React.PureComponent {
@@ -42,7 +42,7 @@ export default class Defaults extends React.PureComponent {
     return (
       <div>
         <span className="badge spacer-right">
-          {translate('default')} for {qualifiers}
+          {translateWithParameters('permission_template.default_for', qualifiers)}
         </span>
       </div>
     );
index 7dfea41232b56b177d18d9395c1eed480919f13a..971db48df4b3372d5a9d8e30616df2e341e4092f 100644 (file)
@@ -31,19 +31,19 @@ export default class ListHeader extends React.PureComponent {
   renderTooltip = permission =>
     permission.key === 'user' || permission.key === 'codeviewer' ? (
       <div>
-        {permission.description}
+        {translate('projects_role', permission.key, 'desc')}
         <div className="alert alert-warning spacer-top">
           {translate('projects_role.public_projects_warning')}
         </div>
       </div>
     ) : (
-      permission.description
+      translate('projects_role', permission.key, 'desc')
     );
 
   render() {
     const cells = this.props.permissions.map(permission => (
       <th key={permission.key} className="permission-column">
-        {permission.name}
+        {translate('projects_role', permission.key)}
         <Tooltip overlay={this.renderTooltip(permission)}>
           <i className="icon-help little-spacer-left" />
         </Tooltip>
index 1d800c22ce50760b971eff244386a1e8460e31db..9319abafef289d0aa9d787a8ad6107cde23a8644 100644 (file)
@@ -5,9 +5,7 @@ exports[`should render one qualifier 1`] = `
   <span
     className="badge spacer-right"
   >
-    default
-     for 
-    qualifiers.DEV
+    permission_template.default_for.qualifiers.DEV
   </span>
 </div>
 `;
@@ -17,9 +15,7 @@ exports[`should render only projects for custom organization 1`] = `
   <span
     className="badge spacer-right"
   >
-    default
-     for 
-    qualifiers.TRK
+    permission_template.default_for.qualifiers.TRK
   </span>
 </div>
 `;
@@ -29,9 +25,7 @@ exports[`should render several qualifiers 1`] = `
   <span
     className="badge spacer-right"
   >
-    default
-     for 
-    qualifiers.TRK, qualifiers.VW
+    permission_template.default_for.qualifiers.TRK, qualifiers.VW
   </span>
 </div>
 `;
@@ -41,9 +35,7 @@ exports[`should render several qualifiers for default organization 1`] = `
   <span
     className="badge spacer-right"
   >
-    default
-     for 
-    qualifiers.TRK, qualifiers.VW
+    permission_template.default_for.qualifiers.TRK, qualifiers.VW
   </span>
 </div>
 `;
index 178214f7ba0ddb19bded4fc55f6e31df217a668b..6cdf78a14a09a4a2bd663681875f5c4e623c200b 100644 (file)
@@ -1,13 +1,13 @@
 <form id="delete-permission-template-form">
   <div class="modal-head">
-    <h2>Delete Permission Template</h2>
+    <h2>{{t 'permission_template.delete_confirm_title'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
-    Are you sure you want to delete permission template "{{name}}"?
+    {{tp 'permission_template.do_you_want_to_delete_template_xxx' name}}
   </div>
   <div class="modal-foot">
-    <button id="delete-permission-template-submit" class="button-red">Delete</button>
-    <a href="#" class="js-modal-close" id="delete-permission-template-cancel">Cancel</a>
+    <button id="delete-permission-template-submit" class="button-red">{{t 'delete'}}</button>
+    <a href="#" class="js-modal-close" id="delete-permission-template-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 02ef40047477e452b8c0241c724ab919a58c07db..b88decef2e47333f3e45e8537d6e014e7d7d1e61 100644 (file)
@@ -1,34 +1,34 @@
 <form id="permission-template-form" autocomplete="off">
   <div class="modal-head">
-    <h2>{{#if id}}Update{{else}}Create{{/if}} Permission Template</h2>
+    <h2>{{#if id}}{{t 'permission_template.edit_template'}}{{else}}{{t 'permission_template.new_template'}}{{/if}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
 
     <div class="modal-field">
-      <label for="permission-template-name">Name<em class="mandatory">*</em></label>
+      <label for="permission-template-name">{{t 'name'}}<em class="mandatory">*</em></label>
       <input id="permission-template-name" name="name" type="text" maxlength="256" required value="{{name}}">
       <div class="modal-field-description">
-        Should be unique.
+        {{t 'should_be_unique'}}
       </div>
     </div>
 
     <div class="modal-field">
-      <label for="permission-template-description">Description</label>
+      <label for="permission-template-description">{{t 'description'}}</label>
       <textarea id="permission-template-description" name="description" maxlength="4000" rows="5">{{description}}</textarea>
     </div>
 
     <div class="modal-field">
-      <label for="permission-template-project-key-pattern">Project Key Pattern</label>
+      <label for="permission-template-project-key-pattern">{{t 'permission_template.key_pattern'}}</label>
       <input id="permission-template-project-key-pattern" name="keyPattern" type="text" maxlength="500"
              value="{{projectKeyPattern}}">
       <div class="modal-field-description">
-        Should be a valid regular expression.
+        {{t 'permission_template.key_pattern.description'}}
       </div>
     </div>
   </div>
   <div class="modal-foot">
-    <button id="permission-template-submit">{{#if id}}Update{{else}}Create{{/if}}</button>
-    <a href="#" class="js-modal-close" id="permission-template-cancel">Cancel</a>
+    <button id="permission-template-submit">{{#if id}}{{t 'update_verb'}}{{else}}{{t 'create'}}{{/if}}</button>
+    <a href="#" class="js-modal-close" id="permission-template-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 3df9dbd8fc374b739b211fa4b1ecacd818766f61..659c166d752f86de9a70e63f0f9aa11651c120e5 100644 (file)
@@ -75,7 +75,7 @@ export default class PageHeader extends React.PureComponent {
         {canApplyPermissionTemplate && (
           <div className="page-actions">
             <button className="js-apply-template" onClick={this.handleApplyTemplate}>
-              Apply Template
+              {translate('projects_role.apply_template')}
             </button>
           </div>
         )}
index 82c157e5d535d6f846838dbe0667f81fc9fbf509..37e8ff307e5c8be18cb7a0cc122c94ccff2a7609 100644 (file)
@@ -1,6 +1,6 @@
 <form id="project-permissions-apply-template-form" autocomplete="off">
   <div class="modal-head">
-    <h2>Apply Permission Template to "{{project.name}}"</h2>
+    <h2>{{tp 'projects_role.apply_template_to_xxx' project.name}}</h2>
   </div>
 
   <div class="modal-body">
@@ -16,7 +16,7 @@
       {{#notNull permissionTemplates}}
         <div class="modal-field">
           <label for="project-permissions-template">
-            Template<em class="mandatory">*</em>
+            {{t 'template'}}<em class="mandatory">*</em>
           </label>
           <select id="project-permissions-template">
             {{#each permissionTemplates}}
@@ -33,9 +33,9 @@
   <div class="modal-foot">
     {{#unless done}}
       {{#notNull permissionTemplates}}
-        <button id="project-permissions-apply-template">Apply</button>
+        <button id="project-permissions-apply-template">{{t 'apply'}}</button>
       {{/notNull}}
     {{/unless}}
-    <a href="#" class="js-modal-close">Close</a>
+    <a href="#" class="js-modal-close">{{t 'close'}}</a>
   </div>
 </form>
index cde163b432cd622a6b0bcc2488d784e92932ee59..da8bc9aa11f2b9bc9812fec9a9a68b55920099c9 100644 (file)
@@ -22,7 +22,7 @@ import PropTypes from 'prop-types';
 import UserHolder from './UserHolder';
 import GroupHolder from './GroupHolder';
 import Tooltip from '../../../../components/controls/Tooltip';
-import { translate } from '../../../../helpers/l10n';
+import { translate, translateWithParameters } from '../../../../helpers/l10n';
 
 export default class HoldersList extends React.PureComponent {
   static propTypes = {
@@ -69,7 +69,8 @@ export default class HoldersList extends React.PureComponent {
           backgroundColor: p.key === selectedPermission ? '#d9edf7' : 'transparent'
         }}>
         <div className="permission-column-inner">
-          <Tooltip overlay={`Filter by "${p.name}" permission`}>
+          <Tooltip
+            overlay={translateWithParameters('global_permissions.filter_by_x_permission', p.name)}>
             <a data-key={p.key} href="#" onClick={this.handlePermissionClick}>
               {p.name}
             </a>
index f20431a06b80a55ac9f713cbb6d5ad8b28ecdc07..14c6018180f82ae71597b5543e603072265a4651 100644 (file)
@@ -53,9 +53,9 @@ export default class SearchForm extends React.PureComponent {
     const { query, filter } = this.props;
 
     const filterOptions = [
-      { value: 'all', label: 'All' },
-      { value: 'users', label: 'Users' },
-      { value: 'groups', label: 'Groups' }
+      { value: 'all', label: translate('all') },
+      { value: 'users', label: translate('users.page') },
+      { value: 'groups', label: translate('user_groups.page') }
     ];
 
     return (
index 99e083ce7b296db6ebf9047841133c4c96d2030c..d41a5c5e1bb7d7414be1e1f74c998e87cd3fc555 100644 (file)
@@ -217,7 +217,7 @@ export default class Search extends React.PureComponent<Props, State> {
                     ref={node => (this.input = node!)}
                     className="search-box-input input-medium"
                     type="search"
-                    placeholder="Search"
+                    placeholder={translate('search_verb')}
                   />
                 </form>
               </td>
index bf2fb591f4a36a6612faf8e310c1bfee8f295480..bef6016eadcff964af4155274b9b91bd7205604e 100644 (file)
@@ -168,7 +168,7 @@ exports[`render qualifiers filter 1`] = `
             <input
               className="search-box-input input-medium"
               onChange={[Function]}
-              placeholder="Search"
+              placeholder="search_verb"
               type="search"
               value=""
             />
@@ -270,7 +270,7 @@ exports[`renders 1`] = `
             <input
               className="search-box-input input-medium"
               onChange={[Function]}
-              placeholder="Search"
+              placeholder="search_verb"
               type="search"
               value=""
             />
index 9c91e098135180c5b4443a541be8dace51ae14db..288529c6c633d090275796df8f95a2101624ac0a 100644 (file)
@@ -45,14 +45,14 @@ export default class ChangelogSearch extends React.PureComponent<Props> {
         <DateInput
           name="since"
           value={this.formatDate(this.props.fromDate)}
-          placeholder="From"
+          placeholder={translate('from')}
           onChange={this.props.onFromDateChange}
         />
         {' â€” '}
         <DateInput
           name="to"
           value={this.formatDate(this.props.toDate)}
-          placeholder="To"
+          placeholder={translate('to')}
           onChange={this.props.onToDateChange}
         />
         <button className="spacer-left" onClick={this.handleResetClick.bind(this)}>
index 37711f160a2eaf205de3636490bc591c4a27a2be..bee2e948e07351b0f2cf48363fd45698e4ff6a98 100644 (file)
@@ -46,6 +46,7 @@ export default class ComparisonForm extends React.PureComponent<Props> {
         <Select
           value={withKey}
           options={options}
+          placeholder={translate('select_verb')}
           clearable={false}
           className="input-large"
           onChange={this.handleChange.bind(this)}
index e62b431277c6c4c077c942ab7da4787e180b3386..5b9655f86dc688b931722729ded3fbb70099d52e 100644 (file)
@@ -19,6 +19,7 @@
  */
 import React from 'react';
 import PropTypes from 'prop-types';
+import { translate } from '../../../helpers/l10n';
 
 export default class EncryptionForm extends React.PureComponent {
   static propTypes = {
@@ -42,9 +43,7 @@ export default class EncryptionForm extends React.PureComponent {
   render() {
     return (
       <div id="encryption-form-container">
-        <div className="spacer-bottom">
-          Secret key is registered. You can encrypt any property value with the following form:
-        </div>
+        <div className="spacer-bottom">{translate('encryption.form_intro')}</div>
 
         <form
           id="encryption-form"
@@ -59,12 +58,13 @@ export default class EncryptionForm extends React.PureComponent {
             value={this.state.value}
             onChange={e => this.setState({ value: e.target.value })}
           />
-          <button className="spacer-left">Encrypt</button>
+          <button className="spacer-left">{translate('encryption.encrypt')}</button>
         </form>
 
         {this.props.encryptedValue != null && (
           <div>
-            Encrypted Value:{' '}
+            {translate('encryption.encrypted_value')}
+            {': '}
             <input
               id="encrypted-value"
               className="input-clear input-code input-super-large"
@@ -76,16 +76,12 @@ export default class EncryptionForm extends React.PureComponent {
         )}
 
         <div className="huge-spacer-top bordered-top">
-          <div className="big-spacer-top spacer-bottom">
-            Note that the secret key can be changed, but all the encrypted properties will have to
-            be updated.{' '}
-            <a href="https://redirect.sonarsource.com/doc/settings-encryption.html">
-              More information
-            </a>
-          </div>
-
+          <div
+            className="big-spacer-top spacer-bottom"
+            dangerouslySetInnerHTML={{ __html: translate('encryption.form_note') }}
+          />
           <form id="encryption-new-key-form" onSubmit={e => this.handleGenerateNewKey(e)}>
-            <button>Generate New Secret Key</button>
+            <button>{translate('encryption.generate_new_secret_key')}</button>
           </form>
         </div>
       </div>
index 899c60dcaf0f6bd29e43820fb688ba81cf72c69c..867019a09354fbc60537d8d29ec4bcba1b90fc83 100644 (file)
@@ -19,6 +19,7 @@
  */
 import React from 'react';
 import PropTypes from 'prop-types';
+import { translate } from '../../../helpers/l10n';
 
 export default class GenerateSecretKeyForm extends React.PureComponent {
   static propTypes = {
@@ -37,7 +38,7 @@ export default class GenerateSecretKeyForm extends React.PureComponent {
         {this.props.secretKey != null ? (
           <div>
             <div className="big-spacer-bottom">
-              <h3 className="spacer-bottom">Secret Key</h3>
+              <h3 className="spacer-bottom">{translate('encryption.secret_key')}</h3>
               <input
                 id="secret-key"
                 className="input-large"
@@ -47,43 +48,22 @@ export default class GenerateSecretKeyForm extends React.PureComponent {
               />
             </div>
 
-            <h3 className="spacer-bottom">How To Use</h3>
+            <h3 className="spacer-bottom">{translate('encryption.how_to_use')}</h3>
 
-            <ul className="list-styled markdown">
-              <li className="spacer-bottom">
-                Store the secret key in the file <code>~/.sonar/sonar-secret.txt</code> of the
-                server. This file can be relocated by defining the property{' '}
-                <code>sonar.secretKeyPath</code> in <code>conf/sonar.properties</code>
-              </li>
-              <li className="spacer-bottom">
-                Restrict access to this file by making it readable and by owner only
-              </li>
-              <li className="spacer-bottom">
-                Restart the server if the property <code>sonar.secretKeyPath</code> has been set or
-                changed.
-              </li>
-              <li className="spacer-bottom">
-                Copy this file on all the machines that execute code inspection. Define the property{' '}
-                <code>sonar.secretKeyPath</code> on those machines if the path is not{' '}
-                <code>~/.sonar/sonar-secret.txt</code>.
-              </li>
-              <li>
-                For each property that you want to encrypt, generate the encrypted value and replace
-                the original value wherever it is stored (configuration files, command lines).
-              </li>
-            </ul>
+            <div
+              className="markdown"
+              dangerouslySetInnerHTML={{ __html: translate('encryption.how_to_use.content') }}
+            />
           </div>
         ) : (
           <div>
-            <p className="spacer-bottom">
-              Secret key is required to be able to encrypt properties.{' '}
-              <a href="https://redirect.sonarsource.com/doc/settings-encryption.html">
-                More information
-              </a>
-            </p>
+            <p
+              className="spacer-bottom"
+              dangerouslySetInnerHTML={{ __html: translate('ecryption.secret_key_description') }}
+            />
 
             <form id="generate-secret-key-form" onSubmit={e => this.handleSubmit(e)}>
-              <button>Generate Secret Key</button>
+              <button>{translate('encryption.generate_secret_key')}s</button>
             </form>
           </div>
         )}
index 2edff5822cdc41f6b8e78ddcecff3e19193dd3c4..98e9226835e1f190b63a506b74f64482d340ec9b 100644 (file)
@@ -87,7 +87,7 @@ export default class ServerIdApp extends React.PureComponent {
 
         {this.state.serverId != null && (
           <div className={this.state.invalidServerId ? 'panel panel-danger' : 'panel'}>
-            Server ID:
+            {translate('property.category.server_id')}:
             <input
               id="server-id-result"
               className="spacer-left input-large input-clear input-code"
index 5b67a9d6e48ac52297754cdf0984c54490bc629a..bda3b53a5d5ed6c2ee5c2a72b7a81035b9bf835b 100644 (file)
@@ -4,10 +4,10 @@
     <div class="button-group">
       {{#each updates}}
         {{#eq status 'COMPATIBLE'}}
-          <button class="js-update" data-verion="{{release.version}}">Update to {{release.version}}</button>
+          <button class="js-update" data-verion="{{release.version}}">{{tp 'update_center.update_to_x' release.version}}</button>
         {{/eq}}
       {{/each}}
-      <button class="js-uninstall button-red">Uninstall</button>
+      <button class="js-uninstall button-red">{{t 'update_center.uninstall'}}</button>
     </div>
 
   {{else}}
       <p class="little-spacer-bottom">
         <input class="js-terms" type="checkbox" name="plugin-terms" id="plugin-terms-{{key}}">
         <label for="plugin-terms-{{key}}">
-          I accept the
-          <a class="js-plugin-terms nowrap" href="{{termsAndConditionsUrl}}" target="_blank">Terms and Conditions</a>
+          {{t 'update_center.i_accept_the'}}
+          <a class="js-plugin-terms nowrap" href="{{termsAndConditionsUrl}}" target="_blank">{{t 'update_center.terms_and_conditions'}}</a>
         </label>
       </p>
-      <button class="js-install" disabled>Install</button>
+      <button class="js-install" disabled>{{t 'update_center.install'}}</button>
     {{else}}
-      <button class="js-install">Install</button>
+      <button class="js-install">{{t 'update_center.install'}}</button>
     {{/if}}
 
   {{/if}}
index fddb84bce8c8d30fcedd41afa1c8c875301444aa..a1ea88ce68000a9ff5bfcbca293227b5be15dc14 100644 (file)
@@ -7,7 +7,7 @@
   {{/notEq}}
   <span class="js-plugin-changelog-date note spacer-right">{{d release.date}}</span>
   {{#if release.changeLogUrl}}
-    <a class="js-plugin-changelog-link" href="{{release.changeLogUrl}}" target="_blank">Release Notes</a>
+    <a class="js-plugin-changelog-link" href="{{release.changeLogUrl}}" target="_blank">{{t 'update_center.release_notes'}}</a>
   {{/if}}
 </div>
 <div class="js-plugin-changelog-description">{{{release.description}}}</div>
index 861df44080591f4b7aea51e3c38af957aca3d81d..c2ce68490d78ef1d69422d52f6bc69adf3e88f07 100644 (file)
@@ -1,3 +1,3 @@
 <footer class="spacer-top note text-center">
-  {{total}} shown
+  {{tp 'x_show' total}}
 </footer>
index d70d165fd6b93eaef035ee8d7c6f20dfa2da0da0..e2eb7f9cefc4f40305bf63707c014171430e3e8a 100644 (file)
@@ -6,31 +6,31 @@
 {{#any installing updating uninstalling}}
   <div class="js-pending panel panel-warning big-spacer-bottom">
     <div class="display-inline-block">
-      <p>SonarQube needs to be restarted in order to</p>
+      <p>{{t 'update_center.sonarqube_needs_to_be_restarted_to'}}</p>
       <ul class="list-styled spacer-top">
         {{#if installing}}
           <li>
-            install
+            {{t 'update_center._install'}}
             <strong class="big text-success little-spacer-left little-spacer-right">{{installing}}</strong> plugins
           </li>
         {{/if}}
         {{#if updating}}
           <li>
-            update
+            {{t 'update_center._update'}}
             <strong class="big text-success little-spacer-left little-spacer-right">{{updating}}</strong> plugins
           </li>
         {{/if}}
         {{#if uninstalling}}
           <li>
-            uninstall
+            {{t 'update_center._uninstall'}}
             <strong class="big text-danger little-spacer-left little-spacer-right">{{uninstalling}}</strong> plugins
           </li>
         {{/if}}
       </ul>
     </div>
     <div class="pull-right">
-      <button class="js-restart">Restart</button>
-      <button class="js-cancel-all button-red">Revert</button>
+      <button class="js-restart">{{t 'update_center.restart'}}</button>
+      <button class="js-cancel-all button-red">{{t 'update_center.revert'}}</button>
     </div>
   </div>
 {{/any}}
index aed176b42d8654c36af653615001fd34b3b7a245..b75523b983ca416b54bccd75f9e8fc8f76f2133d 100644 (file)
@@ -1,5 +1,5 @@
 <div class="bubble-popup-container">
-  <div class="bubble-popup-title">Changelog</div>
+  <div class="bubble-popup-title">{{t 'changelog'}}</div>
 
   <ul class="js-plugin-changelog-list">
     {{#each previousUpdates}}
index fddd712d7edd0da228f1970d55d51e3fdd7fe0ad..0a6f40d4b1f625645813296e7dcee00b6a029e9f 100644 (file)
       <ul>
         {{#if version}}
           <li class="little-spacer-bottom">
-            <strong class="js-plugin-installed-version">{{version}}</strong>&nbsp;installed
+            <strong class="js-plugin-installed-version">{{version}}</strong>&nbsp;{{t 'update_center._installed'}}
           </li>
         {{/if}}
         {{#notEmpty updates}}
           <li class="little-spacer-bottom spacer-top">
-            <strong>Updates:</strong>
+            <strong>{{t 'update_center.updates'}}:</strong>
           </li>
           {{#each updates}}
             <li class="little-spacer-bottom">
@@ -48,7 +48,7 @@
               <button class="button-link js-changelog issue-rule icon-ellipsis-h" data-idx="{{@index}}"></button>
               {{#notEmpty update.requires}}
                 <p class="little-spacer-top">
-                  <strong>Installing this plugin will also install</strong>: {{#each update.requires}} {{name}}{{/each}}
+                  <strong>{{t 'update_center.installing_this_plugin_will_also_install'}}</strong>: {{#each update.requires}} {{name}}{{/each}}
                 </p>
               {{/notEmpty}}
             </div>
           <li class="little-spacer-bottom">
             <ul class="list-inline">
               {{#if homepageUrl}}
-                <li><a class="js-plugin-homepage" href="{{homepageUrl}}" target="_blank">Homepage</a></li>
+                <li><a class="js-plugin-homepage" href="{{homepageUrl}}" target="_blank">{{t 'update_center.homepage'}}</a></li>
               {{/if}}
               {{#if issueTrackerUrl}}
-                <li><a class="js-plugin-issues" href="{{issueTrackerUrl}}" target="_blank">Issue Tracker</a></li>
+                <li><a class="js-plugin-issues" href="{{issueTrackerUrl}}" target="_blank">{{t 'update_center.issue_tracker'}}</a></li>
               {{/if}}
             </ul>
           </li>
 
         {{#if license}}
           <li class="little-spacer-bottom text-limited" title="{{license}}">
-            Licensed under
+            {{t 'update_center.licensed_under'}}
             <span class="js-plugin-license">{{license}}</span>
           </li>
         {{/if}}
 
         {{#if organizationName}}
           <li class="little-spacer-bottom">
-            Developed by
+            {{t 'update_center.developed_by'}}
             {{#if organizationUrl}}
               <a class="js-plugin-organization" href="{{organizationUrl}}" target="_blank">{{organizationName}}</a>
             {{else}}
 
     <td class="text-top text-right width-20">
       {{#eq _status 'installing'}}
-        <p class="text-success">Install Pending</p>
+        <p class="text-success">{{t 'update_center.install_pending'}}</p>
       {{/eq}}
 
       {{#eq _status 'updating'}}
-        <p class="text-success">Update Pending</p>
+        <p class="text-success">{{t 'update_center.update_pending'}}</p>
       {{/eq}}
 
       {{#eq _status 'uninstalling'}}
-        <p class="text-danger">Uninstall Pending</p>
+        <p class="text-danger">{{t 'update_center.uninstall_pending'}}</p>
       {{/eq}}
 
       {{#eq _status 'failed'}}
index 7b8e410b18649eef5b07a30393f06b50a5f6949d..5a2b91a6d81666e9bad502c954d7a4829f970915 100644 (file)
@@ -4,22 +4,22 @@
       <li>
         <input type="radio" name="update-center-filter" value="installed" id="update-center-filter-installed"
                {{#eq state.section 'installed'}}checked{{/eq}}>
-        <label for="update-center-filter-installed">Installed</label>
+        <label for="update-center-filter-installed">{{t 'update_center.installed'}}</label>
       </li>
       <li>
         <input type="radio" name="update-center-filter" value="updates" id="update-center-filter-updates"
           {{#eq state.section 'updates'}}checked{{/eq}} {{#unless state.updateCenterActive}}disabled{{/unless}}>
         <label for="update-center-filter-updates"
-          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="Update Center is not activated."{{/unless}}>
-          Updates Only
+          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="{{t 'update_center.not_activated'}}"{{/unless}}>
+          {{t 'update_center.updates_only'}}
         </label>
       </li>
       <li>
         <input type="radio" name="update-center-filter" value="available" id="update-center-filter-available"
           {{#eq state.section 'available'}}checked{{/eq}} {{#unless state.updateCenterActive}}disabled{{/unless}}>
         <label for="update-center-filter-available"
-          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="Update Center is not activated."{{/unless}}>
-          Available
+          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="{{t 'update_center.not_activated'}}"{{/unless}}>
+          {{t 'update_center.available'}}
         </label>
       </li>
     </ul>
@@ -29,8 +29,8 @@
         <input type="radio" name="update-center-filter" value="system" id="update-center-filter-system"
           {{#eq state.section 'system'}}checked{{/eq}} {{#unless state.updateCenterActive}}disabled{{/unless}}>
         <label for="update-center-filter-system"
-          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="Update Center is not activated."{{/unless}}>
-          System Upgrades
+          {{#unless state.updateCenterActive}}data-toggle="tooltip" title="{{t 'update_center.not_activated'}}"{{/unless}}>
+          {{t 'update_center.system_upgrades'}}
         </label>
       </li>
     </ul>
@@ -40,7 +40,7 @@
     <form id="update-center-search-form" class="search-box display-inline-block text-top">
       <button id="update-center-search-submit" class="search-box-submit button-clean"><i class="icon-search"></i>
       </button>
-      <input id="update-center-search-query" class="search-box-input" type="search" name="q" placeholder="Search"
+      <input id="update-center-search-query" class="search-box-input" type="search" name="q" placeholder="{{t 'search_verb'}}"
              maxlength="100" autocomplete="off">
     </form>
   {{/notEq}}
index fca982cf447fa01dd0ba1d3ad7f8a0bf5b2194d9..0a8f1e1838a7af68be6c48937fe9aa88610125d2 100644 (file)
     <td class="text-top width-20 big-spacer-right">
       <div>
         <strong class="js-plugin-name">SonarQube {{version}}</strong>
-        <span class="js-plugin-category badge badge-success spacer-left">System Upgrade</span>
+        <span class="js-plugin-category badge badge-success spacer-left">{{t 'update_center.system_upgrade'}}</span>
       </div>
       <div class="js-plugin-description little-spacer-top">{{{description}}}</div>
 
       <ul class="big-spacer-top">
         {{#if changeLogUrl}}
           <li class="little-spacer-bottom">
-            <a class="js-plugin-release-notes" href="{{changeLogUrl}}" target="_blank">Release Notes</a>
+            <a class="js-plugin-release-notes" href="{{changeLogUrl}}" target="_blank">{{t 'update_center.release_notes'}}</a>
           </li>
         {{/if}}
         {{#if releaseDate}}
-          <li class="little-spacer-bottom">Released: <span class="js-plugin-date">{{d releaseDate}}</span></li>
+          <li class="little-spacer-bottom">{{t 'update_center.released'}}: <span class="js-plugin-date">{{d releaseDate}}</span></li>
         {{/if}}
       </ul>
     </td>
 
     <td class="text-top width-60">
       <div class="pull-left spacer-right">
-        <strong>How to upgrade</strong>
+        <strong>{{t 'update_center.how_to_upgrade'}}</strong>
       </div>
       <ol class="js-plugin-update-steps list-styled overflow-hidden bordered-left">
         <li class="little-spacer-bottom">
-          Download the new SonarQube version and start it on an empty DB (the bundled H2 DB for instance).
+          {{t 'update_center.how_to_upgrade.1'}}
         </li>
         <li class="little-spacer-bottom">
-          Install (from the update center) the plugins you want.
+          {{t 'update_center.how_to_upgrade.2'}}
         </li>
         <li class="little-spacer-bottom">
-          Install your custom plugins (if any).
+          {{t 'update_center.how_to_upgrade.3'}}
         </li>
         <li class="little-spacer-bottom">
-          Update the <code>conf/sonar.properties</code> file to use the relevant configurations from your old instance,
-          including the connection information for your production DB.
+          {{t 'update_center.how_to_upgrade.4'}}
         </li>
         <li class="little-spacer-bottom">
-          Stop your old SonarQube server.
+          {{t 'update_center.how_to_upgrade.5'}}
         </li>
         <li>
-          Restart the new SonarQube instance: you're done!
+          {{t 'update_center.how_to_upgrade.6'}}
         </li>
       </ol>
     </td>
index 90b7c8cb13895c1530ba2bed6e8d8f300b8a8f4c..020befdea88cb7dd2cf542e9181784f29d5bc429 100644 (file)
@@ -1,32 +1,32 @@
 <form id="change-user-password-form" autocomplete="off">
   <div class="modal-head">
-    <h2>Change Password</h2>
+    <h2>{{t 'my_profile.password.title'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
     {{#if isOwnPassword}}
       <div class="modal-field">
-        <label for="change-user-password-old-password">Old Password<em class="mandatory">*</em></label>
+        <label for="change-user-password-old-password">{{t 'my_profile.password.old'}}<em class="mandatory">*</em></label>
         {{! keep this fake field to hack browser autofill }}
         <input id="change-user-password-old-password-fake" name="old-password-fake" type="password" class="hidden">
         <input id="change-user-password-old-password" name="old-password" type="password" size="50" maxlength="50" required>
       </div>
     {{/if}}
     <div class="modal-field">
-      <label for="change-user-password-password">New Password<em class="mandatory">*</em></label>
+      <label for="change-user-password-password">{{t 'my_profile.password.new'}}<em class="mandatory">*</em></label>
       {{! keep this fake field to hack browser autofill }}
       <input id="change-user-password-password-fake" name="password-fake" type="password" class="hidden">
       <input id="change-user-password-password" name="password" type="password" size="50" maxlength="50" required>
     </div>
     <div class="modal-field">
-      <label for="change-user-password-password-confirmation">Confirm Password<em class="mandatory">*</em></label>
+      <label for="change-user-password-password-confirmation">{{t 'my_profile.password.confirm'}}<em class="mandatory">*</em></label>
       {{! keep this fake field to hack browser autofill }}
       <input id="change-user-password-password-confirmation-fake" name="password-confirmation-fake" type="password" class="hidden">
       <input id="change-user-password-password-confirmation" name="password-confirmation" type="password" size="50" maxlength="50" required>
     </div>
   </div>
   <div class="modal-foot">
-    <button id="change-user-password-submit">Change</button>
-    <a href="#" class="js-modal-close" id="change-user-password-cancel">Cancel</a>
+    <button id="change-user-password-submit">{{t 'change_verb'}}</button>
+    <a href="#" class="js-modal-close" id="change-user-password-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 4d92cfd6e72078722b97829bc3d18bb2fa2ccd6e..6ff6e8692e114d4ebff71385d755318ad3d00223 100644 (file)
@@ -1,13 +1,13 @@
 <form id="deactivate-user-form" autocomplete="off">
   <div class="modal-head">
-    <h2>Deactivate User</h2>
+    <h2>{{t 'users.deactivate_user'}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
-    Are you sure you want to deactivate "{{name}} ({{login}})"?
+    {{tp 'users.deactivate_user.confirmation' name login}}
   </div>
   <div class="modal-foot">
-    <button id="deactivate-user-submit">Deactivate</button>
-    <a href="#" class="js-modal-close" id="deactivate-user-cancel">Cancel</a>
+    <button id="deactivate-user-submit">{{t 'users.deactivate'}}</button>
+    <a href="#" class="js-modal-close" id="deactivate-user-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 0530a7459630d6b53ff08b10bd4b85c49b650ccd..908eefb5df4659285ca86558babfbc41d2d946b1 100644 (file)
@@ -1,41 +1,41 @@
 <form id="create-user-form" autocomplete="off">
   <div class="modal-head">
-    <h2>{{#if login}}Update{{else}}Create{{/if}} User</h2>
+    <h2>{{#if login}}{{t 'users.update_user'}}{{else}}{{t 'users.create_user'}}{{/if}}</h2>
   </div>
   <div class="modal-body">
     <div class="js-modal-messages"></div>
     {{#unless login}}
       <div class="modal-field">
-        <label for="create-user-login">Login<em class="mandatory">*</em></label>
+        <label for="create-user-login">{{t 'login'}}<em class="mandatory">*</em></label>
         {{! keep this fake field to hack browser autofill }}
         <input id="create-user-login-fake" name="login-fake" type="text" class="hidden">
         <input id="create-user-login" name="login" type="text" size="50" minlength="3" maxlength="255" required
             value="{{login}}">
-        <p class="note">Minimum 3 characters</p>
+        <p class="note">{{tp 'users.minimum_x_characters' 3}}</p>
       </div>
     {{/unless}}
     <div class="modal-field">
-      <label for="create-user-name">Name<em class="mandatory">*</em></label>
+      <label for="create-user-name">{{t 'name'}}<em class="mandatory">*</em></label>
       {{! keep this fake field to hack browser autofill }}
       <input id="create-user-name-fake" name="name-fake" type="text" class="hidden">
       <input id="create-user-name" name="name" type="text" size="50" maxlength="200" required value="{{name}}">
     </div>
     <div class="modal-field">
-      <label for="create-user-email">Email</label>
+      <label for="create-user-email">{{t 'users.email'}}</label>
       {{! keep this fake field to hack browser autofill }}
       <input id="create-user-email-fake" name="email-fake" type="email" class="hidden">
       <input id="create-user-email" name="email" type="email" size="50" maxlength="100" value="{{email}}">
     </div>
     {{#unless login}}
       <div class="modal-field">
-        <label for="create-user-password">Password<em class="mandatory">*</em></label>
+        <label for="create-user-password">{{t 'password'}}<em class="mandatory">*</em></label>
         {{! keep this fake field to hack browser autofill }}
         <input id="create-user-password-fake" name="password-fake" type="password" class="hidden">
         <input id="create-user-password" name="password" type="password" size="50" maxlength="50" required>
       </div>
     {{/unless}}
     <div class="modal-field">
-      <label>SCM Accounts</label>
+      <label>{{t 'my_profile.scm_accounts'}}</label>
       {{#each scmAccounts}}
         <input name="scmAccounts" type="text" size="50" maxlength="255" value="{{this}}">
       {{else}}
       {{/each}}
       <a id="create-user-add-scm-account" class="icon-plus" href="#" title="Add another SCM account"
          data-toggle="tooltip"></a>
-      <p class="note">Note that login and email are automatically considered as SCM accounts</p>
+      <p class="note">{{t 'user.login_or_email_used_as_scm_account'}}</p>
     </div>
   </div>
   <div class="modal-foot">
-    <button id="create-user-submit">{{#if login}}Update{{else}}Create{{/if}}</button>
-    <a href="#" class="js-modal-close" id="create-user-cancel">Cancel</a>
+    <button id="create-user-submit">{{#if login}}{{t 'update_verb'}}{{else}}{{t 'create'}}{{/if}}</button>
+    <a href="#" class="js-modal-close" id="create-user-cancel">{{t 'cancel'}}</a>
   </div>
 </form>
index 422716c7d9a7f43a0fc02e2b9c2cc78e33075c4e..d98651e8c114f01b7c303c8bc79e583e1bb6426f 100644 (file)
@@ -1,10 +1,10 @@
 <div class="modal-head">
-  <h2>Update Groups</h2>
+  <h2>{{t 'users.update_groups'}}</h2>
 </div>
 <div class="modal-body">
   <div class="js-modal-messages"></div>
   <div id="users-groups"></div>
 </div>
 <div class="modal-foot">
-  <a href="#" class="js-modal-close" id="users-groups-done">Done</a>
+  <a href="#" class="js-modal-close" id="users-groups-done">{{t 'Done'}}</a>
 </div>
index 66dff8a39b62dd00b9e67ebf4c5caef3f5b559ab..fbd2d43f5db909c69f09b43d391ec6008e85e096 100644 (file)
@@ -3,7 +3,7 @@
   <i class="spinner hidden"></i>
   <div class="page-actions">
     <div class="button-group">
-      <button id="users-create">Create User</button>
+      <button id="users-create">{{t 'users.create_user'}}</button>
     </div>
   </div>
   <p class="page-description">{{t 'users.page.description'}}</p>
index 3cf34d7be8f1f573b93add0cf9b7905ea115f5cf..28115fb9c9187c86fb2f950d04961b58121ab0f2 100644 (file)
@@ -1,6 +1,6 @@
 <footer class="spacer-top note text-center">
-  {{count}}/{{total}} shown
+  {{tp 'x_of_y_shown' count total}}
   {{#if more}}
-    <a id="users-fetch-more" class="spacer-left" href="#">show more</a>
+    <a id="users-fetch-more" class="spacer-left" href="#">{{t 'show_more'}}</a>
   {{/if}}
 </footer>
index 9e73394a88ccf723dd68d4c5f6154e58acae1fe7..44c303a7db1b9aa77789cb2f7cdf62bfbb6eeb21 100644 (file)
@@ -35,7 +35,7 @@
     {{/each}}
     {{#gt moreScmAccountsCount 0}}
       <li class="little-spacer-bottom">
-        <a class="js-user-more-scm" href="#">{{moreScmAccountsCount}} more</a>
+        <a class="js-user-more-scm" href="#">{{moreScmAccountsCount}} {{t 'more'}}</a>
       </li>
     {{/gt}}
   </ul>
@@ -49,9 +49,9 @@
       {{/each}}
       <li class="little-spacer-bottom">
         {{#gt moreGroupsCount 0}}
-          <a class="js-user-more-groups spacer-right" href="#">{{moreGroupsCount}} more</a>
+          <a class="js-user-more-groups spacer-right" href="#">{{moreGroupsCount}} {{t 'more'}}</a>
         {{/gt}}
-        <a class="js-user-groups icon-bullet-list" title="Update Groups" data-toggle="tooltip" href="#"></a>
+        <a class="js-user-groups icon-bullet-list" title="{{t 'users.update_groups'}}" data-toggle="tooltip" href="#"></a>
       </li>
     </ul>
   </td>
 
 <td>
   {{tokensCount}}
-  <a class="js-user-tokens spacer-left icon-bullet-list" title="Update Tokens" data-toggle="tooltip" href="#"></a>
+  <a class="js-user-tokens spacer-left icon-bullet-list" title="{{t 'users.update_tokens'}}" data-toggle="tooltip" href="#"></a>
 </td>
 
 <td class="thin nowrap text-right">
-  <a class="js-user-update icon-edit little-spacer-right" title="Update Details" data-toggle="tooltip" href="#"></a>
+  <a class="js-user-update icon-edit little-spacer-right" title="{{t 'update_details'}}" data-toggle="tooltip" href="#"></a>
   {{#if local}}
-    <a class="js-user-change-password icon-lock little-spacer-right" title="Change Password" data-toggle="tooltip"
+    <a class="js-user-change-password icon-lock little-spacer-right" title="{{t 'my_profile.password.title'}}" data-toggle="tooltip"
        href="#"></a>
   {{/if}}
-  <a class="js-user-deactivate icon-delete" title="Deactivate" data-toggle="tooltip" href="#"></a>
+  <a class="js-user-deactivate icon-delete" title="{{t 'users.deactivate'}}" data-toggle="tooltip" href="#"></a>
 </td>
index e619880b5849baf0c42037b11d6c77f677bde77f..e0c90491015ad97196eb0b0fcc074ea4c93ef514 100644 (file)
@@ -3,11 +3,11 @@
     <tr>
       <th>&nbsp;</th>
       <th class="nowrap">&nbsp;</th>
-      <th class="nowrap">SCM Accounts</th>
+      <th class="nowrap">{{t 'my_profile.scm_accounts'}}</th>
       {{#unless customOrganizations}}
-        <th class="nowrap">Groups</th>
+        <th class="nowrap">{{t 'my_profile.groups'}}</th>
       {{/unless}}
-      <th class="nowrap">Tokens</th>
+      <th class="nowrap">{{t 'users.tokens'}}</th>
       <th class="nowrap">&nbsp;</th>
     </tr>
   </thead>
index 625c81e15b94235872aa8d503a39f802a802cf05..4b879a050badf24efb3833bf2d8983fe48903eaf 100644 (file)
@@ -1,7 +1,7 @@
 <div class="panel panel-vertical bordered-bottom spacer-bottom">
   <form id="users-search-form" class="search-box">
     <button id="users-search-submit" class="search-box-submit button-clean"><i class="icon-search"></i></button>
-    <input id="users-search-query" class="search-box-input" type="search" name="q" placeholder="Search" maxlength="100">
+    <input id="users-search-query" class="search-box-input" type="search" name="q" placeholder="{{t 'search_verb'}}" maxlength="100">
     <span class="js-hint note spacer-left text-middle hidden">
       {{tp 'select2.tooShort' 2}}
     </span>
index 2e0b1ed9f356b40ebb290f3c5cf805e246ea42f1..1080f88a5bd364b72370c527911745df041e27dc 100644 (file)
@@ -1,5 +1,5 @@
 <div class="modal-head">
-  <h2>Tokens</h2>
+  <h2>{{t 'users.tokens'}}</h2>
 </div>
 
 <div class="modal-body">
@@ -9,8 +9,8 @@
     <table class="data zebra">
       <thead>
       <tr>
-        <th>Name</th>
-        <th class="text-right">Created</th>
+        <th>{{t 'name'}}</th>
+        <th class="text-right">{{t 'created'}}</th>
         <th>&nbsp;</th>
       </tr>
       </thead>
@@ -29,9 +29,9 @@
             <div class="big-spacer-left">
               <form class="js-revoke-token-form" data-token="{{name}}">
                 {{#if deleting}}
-                  <button class="button-red active input-small">Sure?</button>
+                  <button class="button-red active input-small">{{t 'users.tokens.sure'}}</button>
                 {{else}}
-                  <button class="button-red input-small">Revoke</button>
+                  <button class="button-red input-small">{{t 'users.tokens.revoke'}}</button>
                 {{/if}}
               </form>
             </div>
@@ -40,7 +40,7 @@
       {{else}}
         <tr>
           <td colspan="3">
-            <span class="note">No tokens</span>
+            <span class="note">{{t 'users.no_tokens'}}</span>
           </td>
         </tr>
       {{/each}}
 
   <hr class="big-spacer-top big-spacer-bottom">
 
-  <h3 class="spacer-bottom">Generate Tokens</h3>
+  <h3 class="spacer-bottom">{{t 'users.generate_tokens'}}</h3>
 
   {{#each errors}}
     <div class="alert alert-danger">{{msg}}</div>
   {{/each}}
 
   <form class="js-generate-token-form">
-    <input type="text" required maxlength="100" placeholder="Enter Token Name">
-    <button>Generate</button>
+    <input type="text" required maxlength="100" placeholder="{{t 'users.enter_token_name'}}">
+    <button>{{t 'users.generate'}}</button>
   </form>
 
   {{#if newToken}}
     <div class="panel panel-white big-spacer-top">
       <div class="alert alert-warning">
-        New token "{{limitString newToken.name}}" has been created. Make sure you copy it now, you won’t be able to see it again!
+        {{tp 'users.tokens.new_token_created' newToken.name}}
       </div>
 
       <table class="data">
         <tr>
 
           <td class="thin">
-            <button class="js-copy-to-clipboard" data-clipboard-text="{{newToken.token}}">Copy</button>
+            <button class="js-copy-to-clipboard" data-clipboard-text="{{newToken.token}}">{{t 'copy'}}</button>
           </td>
           <td class="nowrap">
             <code class="text-success">{{newToken.token}}</code>
@@ -83,5 +83,5 @@
 </div>
 
 <div class="modal-foot">
-  <a href="#" class="js-modal-close">Done</a>
+  <a href="#" class="js-modal-close">{{t 'Done'}}</a>
 </div>
index 01889e1d848c982613b2bca04ffb9081806a4c85..fb9434142c0bf932850dc0ca15533d3a3cc97aeb 100644 (file)
@@ -22,6 +22,7 @@ import Clipboard from 'clipboard';
 import Modal from '../../components/common/modals';
 import Template from './templates/users-tokens.hbs';
 import { getTokens, generateToken, revokeToken } from '../../api/user-tokens';
+import { translate } from '../../helpers/l10n';
 
 export default Modal.extend({
   template: Template,
@@ -84,7 +85,11 @@ export default Modal.extend({
       const clipboard = new Clipboard(copyButton.get(0));
       clipboard.on('success', () => {
         copyButton
-          .tooltip({ title: 'Copied!', placement: 'bottom', trigger: 'manual' })
+          .tooltip({
+            title: translate('users.tokens.copied'),
+            placement: 'bottom',
+            trigger: 'manual'
+          })
           .tooltip('show');
         setTimeout(() => copyButton.tooltip('hide'), 1000);
       });
index e2ab2a305cd1873e45aebd229b2e7a0f4fd49bfa..e30f3d8fcd1057de96e5656a61ae32163553e6ef 100644 (file)
@@ -25,6 +25,7 @@ import ModalView from '../../common/modals';
 import Template from './templates/source-viewer-measures.hbs';
 import { getMeasures } from '../../../api/measures';
 import { getMetrics } from '../../../api/metrics';
+import { getLocalizedMetricName, getLocalizedMetricDomain } from '../../../helpers/l10n';
 import { formatMeasure } from '../../../helpers/measures';
 
 const severityComparator = severity => {
@@ -134,11 +135,13 @@ export default ModalView.extend({
   },
 
   prepareMetrics(metrics) {
-    metrics = metrics.filter(metric => metric.value != null);
+    metrics = metrics
+      .filter(metric => metric.value != null)
+      .map(metric => ({ ...metric, name: getLocalizedMetricName(metric) }));
     return sortBy(
       toPairs(groupBy(metrics, 'domain')).map(domain => {
         return {
-          name: domain[0],
+          name: getLocalizedMetricDomain(domain[0]),
           metrics: domain[1]
         };
       }),
index f6119c38fb68496447632186ea1f232696e5bef8..596e7d21650f0c89dfdd24635376f8747dc0ed9e 100644 (file)
@@ -10,7 +10,7 @@
       </div>
       <div class="measure measure-big" data-metric="duplicated_lines_density">
         <span class="measure-value">{{measures.duplicated_lines_density}}</span>
-        <span class="measure-name">Duplications</span>
+        <span class="measure-name">{{t 'metric.duplicated_lines_density.short_name'}}</span>
       </div>
     </div>
 
index f0c81d0349b15830f1e7da7b03a41afe586802a6..28464266c796fd367925ed79c32a58fb2453bdd0 100644 (file)
@@ -9,7 +9,7 @@
       <span class="measure-value">{{measures.ncloc}}</span>
     </div>
     <div class="measure measure-one-line" data-metric="comment_lines">
-      <span class="measure-name">Comments</span>
+      <span class="measure-name">{{t 'metric.comment_lines_density.short_name'}}</span>
       <span class="measure-value">{{measures.comment_lines_density}} / {{measures.comment_lines}}</span>
     </div>
   </div>
index 5f553cff29771b24c54647f21bc3796ba26f9928..f47db92d842e1b811e722fcf5e44e18d37a21e71 100644 (file)
@@ -6,18 +6,12 @@
 
 action=Action
 actions=Actions
-activate_all=Activate all
-activation=Activation
 active=Active
 add_verb=Add
-age=Age
 apply=Apply
-assigned_to_me=Assigned to me
-association=Association
 all=All
 and=And
 any=Any
-anytime=Anytime
 ascending=Ascending
 assignee=Assignee
 author=Author
@@ -25,12 +19,10 @@ back=Back
 backup=Backup
 backup_verb=Back up
 best=Best
-biggest=Biggest
 blocker=Blocker
 bold=Bold
 branch=Branch
-build_date=Build date
-build_time=Build time
+by_=by
 calendar=Calendar
 cancel=Cancel
 category=Category
@@ -44,13 +36,13 @@ code=Code
 color=Color
 compare=Compare
 component=Component
-configurable=Configurable
 configure=Configure
 confirm=Confirm
 continue=Continue
 copy=Copy
 create=Create
 created=Created
+created_on=Created on
 critical=Critical
 customize=Customize
 date=Date
@@ -72,15 +64,12 @@ favorite=Favorite
 file=File
 files=Files
 filters=Filters
-filter_verb=Filter
 follow=Follow
 from=From
 global=Global
 help=Help
 hide=Hide
-identifier_abbreviated=Id
 inactive=Inactive
-including_abbreviated=incl.
 info=Info
 issue=Issue
 issues=Issues
@@ -95,7 +84,6 @@ login=Login
 major=Major
 manual=Manual
 max=Max
-max_items_reached=Only the first {0} components are displayed
 max_results_reached=Only the first {0} results are displayed
 me=Me
 members=Members
@@ -103,11 +91,9 @@ min=Min
 minor=Minor
 more=More
 more_actions=More Actions
-moreCriteria=+ More Criteria
 my_favorite=My Favorite
 my_favorites=My Favorites
 name=Name
-name_too_long_x=Name is too long (maximum is {0} characters)
 navigation=Navigation
 never=Never
 new_name=New name
@@ -117,18 +103,13 @@ off=Off
 on=On
 organization_key=Organization Key
 open=Open
-open_verb=Open
-operations=Operations
 optional=Optional
 order=Order
 owner=Owner
-package=Package
-packages=Packages
 parameters=Parameters
 password=Password
 path=Path
 permalink=Permanent Link
-permalinks=Permalinks
 plugin=Plugin
 project=Project
 projects=Projects
@@ -151,50 +132,36 @@ result=Result
 results=Results
 x_results={0} results
 review=Review
-reviews=Reviews
-review_verb=Review
 rule=Rule
 rules=Rules
 save=Save
-save_as=Save As
 search_verb=Search
 see_all=See All
-select_all=Select all
 select_verb=Select
 set=Set
 severity=Severity
-severity_abbreviated=Se.
 shared=Shared
-show_verb=Show
+x_show={0} shown
 x_of_y_shown={0} of {1} shown
 size=Size
-smallest=Smallest
 status=Status
-status_abbreviated=St.
-sub_project=Sub-project
-sub_projects=Sub-projects
-sub_view=Sub-view
-sub_views=Sub-views
 table=Table
+tags=Tags
 technical_debt=Technical Debt
 template=Template
-the_end=The End
 title=Title
 to=To
-to.downcase=to
 total=Total
 treemap=Treemap
 true=True
 type=Type
 unassigned=Not assigned
-unfollow=Unfollow
 unit_test=Unit test
 unit_tests=Unit tests
 unknown=Unknown
 unresolved=Unresolved
-unselect_all=Unselect all
-unselect_verb=Unselect
 updated=Updated
+updated_on=Updated on
 update_verb=Update
 updating=Updating
 user=User
@@ -217,86 +184,36 @@ yes=Yes
 #
 #------------------------------------------------------------------------------
 
-add_a_column=Add a column
-added_over_x_days=Added over {0} days
-added_since=Added since {0}
-added_since_previous_analysis=Added since previous analysis
-added_since_previous_analysis_detailed=Added since previous analysis ({0})
-added_since_previous_version=Added since previous version
-added_since_previous_version_detailed=Added since previous version ({0})
-added_since_version=Added since version {0}
-all_violations=All violations
-all_issues=All issues
 and_worse=and worse
 are_you_sure=Are you sure?
 assigned_to=Assigned to
 bulk_change=Bulk Change
 bulleted_point=Bulleted point
-buy_developer_pack=Buy Developer Pack now
-check_project=Check project
 coding_rules=Rules
 clear=Clear
 clear_all_filters=Clear All Filters
-click_to_add_to_favorites=Click to add to favorites
-click_to_remove_from_favorites=Click to remove from favorites
-contact_admin=Please contact your administrator.
 created_by=Created by
-deactivate_all=Deactivate all
 default_error_message=The request cannot be processed. Try again later.
 default_severity=Default severity
-default_sort_on=Default sort on
-disable_treemap=Disable treemap
 edit_permissions=Edit Permissions
-enable_treemap=Enable treemap
-equals=Equals
 false_positive=False positive
-false_positives_only=False positives only
-full_source=Full source
-greater_or_equals=Greater or equals
-greater_than=Greater than
-help_tips=Help tips
 last_analysis_before=Last analysis before
-learn_more=Learn more
-less_or_equals=Less or equals
-less_than=Less than
 logging_out=You're logging out, please wait...
 manage=Manage
-move_left=Move left
-move_right=Move right
+management=Management
 my_organizations=My Organizations
-new_issues=New issues
 new_violations=New violations
 new_window=New window
 no_data=No data
-no_lines_match_your_filter_criteria=No lines match your filter criteria.
 no_results=No results
 no_results_for_x=No results for "{0}"
 no_results_search=We couldn't find any results matching selected criteria.
 no_results_search.2=Try to change filters to get some results.
-not_authorized=You are not authorized to access this page.
-not_authorized_to_access_project=You are not authorized to access to this '{0}' project
-over_x_days=over {0} days
-over_x_days.short={0} days
-over_x_days_detailed=over {0} days ({1})
-over_x_days_detailed.short={0} days ({1})
-page_size=Page size
 page_extension_failed=Page extension failed.
-paging_first=First
-paging_last=Last
-paging_next=Next
-paging_previous=Previous
-project_name=Project name
-remove_column=Remove this column
-results_not_display_due_to_security=Due to security settings, some results are not being displayed.
-save_and_preview=Save & Preview
-select_a_metric=Select a metric
 set_as_default=Set as Default
 unset_as_default=Unset as Default
-shared_by=Shared by
-show_less=Show Less
 show_more=Show More
-since_x=since {0}
-since_x.short={0}
+should_be_unique=Should be unique
 since_previous_analysis=since previous analysis
 since_previous_analysis_detailed=since previous analysis ({0})
 since_previous_analysis.short=\u0394 last
@@ -311,7 +228,7 @@ since_previous_version_detailed=since previous version ({0} - {1})
 since_previous_version_with_only_date=since previous version ({0})
 since_previous_version_detailed.short=\u0394 version ({0})
 this_name_is_already_taken=This name is already taken.
-time_changes=Time changes
+update_details=Update details
 work_duration.x_days={0}d
 work_duration.x_hours={0}h
 work_duration.x_minutes={0}min
@@ -500,14 +417,7 @@ layout.login=Log in
 layout.logout=Log out
 layout.measures=Measures
 layout.settings=Administration
-layout.print=Print
-layout.permalink=Permalink
 layout.sonar.slogan=Continuous Code Quality
-layout.dashboards=Dashboards
-layout.configuration=Project Configuration
-layout.projects=Projects
-layout.recent_projects=Recent Projects
-layout.user_panel.my_profile=My profile
 
 sidebar.projects=Projects
 sidebar.project_settings=Configuration
@@ -538,21 +448,9 @@ visibility.private.description.short=Only authorized users can browse and see th
 #
 #------------------------------------------------------------------------------
 
-all_rules.page=All Rules
-analysis_reports.page=Project Computation
 coding_rules.page=Rules
 global_permissions.page=Global Permissions
 global_permissions.page.description=Grant and revoke permissions to make changes at the global level. These permissions include editing quality profiles, sharing dashboards, and performing global system administration.
-custom_metrics.page=Custom Metrics
-manual_metrics.page=Manual Metrics
-manual_metrics.page.description=These metrics are available for all projects. Manual measures can be set at project level via the configuration interface.
-manual_metrics.add_manual_metric=Add New Manual Metric
-manual_metrics.delete_manual_metric=Delete Manual Metric
-manual_metrics.delete_manual_metric_message=Are you sure that you want to delete manual metric "{0}"? \n Warning: all the associated manual measures will be deleted.
-manual_measures.page=Manual Measures
-manual_measures.page.description=Update the values of manual metrics for this project. Changes will take effect at the project's next analysis. Manual Metrics must be created at the global level.
-custom_measures.page=Custom Measures
-custom_measures.page.description=Update the values of custom metrics for this project. Changes will take effect at the project's next analysis. Custom metrics must be created at the global level.
 organization_permissions.page.description=Grant and revoke organization permissions. Permissions can be granted to groups or individual users.
 roles.page=Project Permissions
 roles.page.description2=Grant and revoke project-level permissions. Permissions can be granted to groups or individual users.
@@ -561,36 +459,20 @@ project_settings.page=General Settings
 project_settings.page.description=Edit project settings.
 project_links.page=Links
 project_links.page.description=Edit some links associated with this project.
-project_history.page=History
-project_history.page.description=Edit snapshot metadata, or delete snapshots from the project history.
-project_roles.page=Project Permissions
-project_roles.page.description=Grant and revoke permissions to this project to Browse (view a project's metrics), See Source Code, and Administer. Permissions can be granted to groups or individual users.
-project_roles.page.description2=Grant and revoke project-level permissions. Permissions can be granted to groups or individual users.
 projects_management.page.description=Use this page to delete multiple projects at once, or to provision projects if you would like to configure them before the first analysis. Note that once a project is provisioned, you have access to perform all project configurations on it.
 settings.page=General Settings
 settings.page.description=Edit global settings for this SonarQube instance.
 system_info.page=System Info
-users.page=Users
-users.page.description=Create and administer individual users.
-user_groups.page=Groups
-user_groups.page.description=Create and administer groups of users.
-user_groups.anyone.description=Anybody (authenticated or not) who browses the application belongs to this group
-update_center.page=Update Center
-update_center.page.description=Install, uninstall and delete plugins. You can also download SonarQube updates from the System Updates tab on this page.
 project_quality_profiles.page=Quality Profiles
 project_quality_profiles.page.description=Choose which profile is associated with this project on a language-by-language basis. (Note that you will only need to select profiles for multiple languages for multi-language projects.)
 project_quality_gate.page=Quality Gate
 project_quality_gate.page.description=Choose which quality gate is associated with this project.
-bulk_deletion.page=Bulk Deletion
-bulk_deletion.page.description=Use this page to delete multiple projects at once.
 update_key.page=Update Key
 update_key.page.description=Edit the keys of a project and/or its modules. Key changes must be made here BEFORE analyzing the project with the new keys, otherwise the analysis will simply create another project with the new key, rather than updating the existing project.
 deletion.page=Deletion
 project_deletion.page.description=Delete this project. The operation cannot be undone.
 portfolio_deletion.page.description=Delete this portfolio. Component projects and Local Reference Portfolios will not be deleted, but component Standard Portfolios will be deleted. This operation cannot be undone.
 application_deletion.page.description=Delete this application. Application projects will not be deleted. This operation cannot be undone.
-provisioning.page=Provisioning
-provisioning.page.description=Use this page to initialize projects if you would like to configure them before the first analysis. Once a project is provisioned, you have access to perform all project configurations on it.
 project_branches.page=Branches
 project_branches.page.description=Use this page to manage project branches.
 project_branches.page.life_time=Short living branches are permanently deleted when there is no analysis for {days} days.
@@ -602,26 +484,12 @@ project_branches.page.life_time.admin=Short living branches are permanently dele
 #
 #------------------------------------------------------------------------------
 
-clouds.page=Clouds
 overview.page=Overview
 code.page=Code
-components.page=Components
-coverage.page=Coverage
-default_dashboards.page=Default Dashboards
-dependencies.page=Dependencies
-duplications.page=Duplications
-email_configuration.page=Email Settings
-event_categories.page=Event Categories
-filters.page=Filters
-my_profile.page=My Profile
 permissions.page=Permissions
 quality_profiles.page=Quality Profiles
 quality_gates.page=Quality Gates
 issues.page=Issues
-issues_drilldown.page=Issues Drilldown
-source.page=Source
-timemachine.page=Time Machine
-comparison.page=Compare
 view_projects.page=Projects
 portfolios.page=Portfolios
 project_activity.page=Activity
@@ -644,12 +512,6 @@ process.fail=Failed
 #------------------------------------------------------------------------------
 
 sessions.log_in=Log in
-sessions.new_account=Not a member? <a href="{0}" tabindex="-1">Sign up</a> for an account.
-sessions.confirm_password=Confirm password
-sessions.sign_up=Sign up
-sessions.old_account=<a href="{0}" tabindex="-1">Log in</a> if you already have an account.
-session.flash_notice.authentication_failed=Authentication failed.
-session.flash_notice.logged_out=You have been logged out.
 
 
 #------------------------------------------------------------------------------
@@ -662,16 +524,11 @@ issue.add_tags=Add Tags
 issue.remove_tags=Remove Tags
 issue.no_tag=No tags
 issue.assign.formlink=Assign
-issue.assign.submit=Assign
-issue.unassign.submit=Unassign
 issue.assign.to_me=to me
 issue.comment.formlink=Comment
 issue.comment.submit=Comment
 issue.comment.tell_why=Please tell why?
-issue.comment.delete_confirm_title=Delete Comment
 issue.comment.delete_confirm_message=Do you want to delete this comment?
-issue.comment.delete_confirm_button=Delete
-issue.details=Details
 issue.rule_details=Rule Details
 issue.send_notifications=Send Notifications
 issue.transition=Transition
@@ -690,7 +547,6 @@ issue.transition.close.description=
 issue.transition.wontfix=Resolve as won't fix
 issue.transition.wontfix.description=This issue can be ignored because the rule is irrelevant in this context. Its effort won't be counted.
 issue.set_severity=Change Severity
-issue.set_severity.submit=Change Severity
 issue.set_type=Change Type
 
 issue.type.CODE_SMELL=Code Smell
@@ -722,31 +578,13 @@ issue.resolution.REMOVED=Removed
 issue.resolution.REMOVED.description=Either the rule or the resource was changed (removed, relocated, parameters changed, etc.) so that analysis no longer finds these issues.
 issue.unresolved.description=Unresolved issues have not been addressed in any way.
 
-issue.updated=Updated:
-issue.manual.missing_rule=Missing rule
-issue.reported_by=Reported by
-issue.authorLogin=Author:
-issue.component_deleted=Removed
 issue.effort=Effort:
 issue.x_effort={0} effort
-issue.creation_date=Created
 issue.filter_similar_issues=Filter Similar Issues
 issue.this_issue_involves_x_code_locations=This issue involves {0} code location(s)
 issues.return_to_list=Return to List
-issues.issues_limit_reached=For usability reasons, only the {0} issues are displayed.
 issues.bulk_change=All Issues ({0})
 issues.bulk_change_selected=Selected Issues ({0})
-issues.home.recent_issues=Recent Issues
-issues.home.my_recent_issues=My Recent Issues
-issues.home.over_last_week=Over Last Week
-issues.home.my_filters=My Filters
-issues.home.projects=Projects
-issues.home.authors=Authors
-issues.home.tags=Tags
-issues.home.new_search=New Search
-issues.toggle_selection_tooltip=(De-)Select all currently visible issues
-issues.ordered=ordered
-issues.by_creation_date=by creation date
 issues.issues=issues
 issues.to_select_issues=to select issues
 issues.to_navigate=to navigate
@@ -777,63 +615,6 @@ issue.changelog.field.type=Type
 issue.changelog.field.file=File
 
 
-#------------------------------------------------------------------------------
-#
-# ISSUE FILTERS
-#
-#------------------------------------------------------------------------------
-issue_filter.new_search=New Search
-issue_filter.header.assignee=Assignee
-issue_filter.header.creation_date=Created
-issue_filter.header.resolution=Resolution
-issue_filter.header.update_date=Updated
-issue_filter.criteria.assignee=Assignee
-issue_filter.criteria.created=Created
-issue_filter.criteria.created_at=Created at
-issue_filter.criteria.created_after=Created since
-issue_filter.criteria.created_before=Created before
-issue_filter.criteria.date_format=year-month-day (2013-01-31)
-issue_filter.criteria.project=Project
-issue_filter.criteria.resolution=Resolution
-issue_filter.criteria.rule=Rule
-issue_filter.criteria.severity=Severity
-issue_filter.criteria.status=Status
-issue_filter.filter_list=Issues Filters
-issue_filter.max_results_reached=Only the first {0} issues matching the search criteria have been retrieved. Add some additional criteria to get fewer results to be able to sort this list.
-issue_filter.no_result=No matching issues found.
-issue_filter.no_result.help=Status of the related issues may have changed since the last analysis.
-issue_filter.save_filter=Save Filter
-issue_filter.edit_filter=Edit Filter
-issue_filter.copy_filter=Copy Filter
-issue_filter.form.name=Name
-issue_filter.form.description=Description
-issue_filter.form.share=Shared with all users
-issue_filter.form.owner=Owner
-issue_filter.more_criteria=+ More Criteria
-issue_filter.favourite_filters=Favourite Filters
-issue_filter.manage.my_filters=My Issues Filters
-issue_filter.private=Private
-issue_filter.shared=Shared
-issue_filter.shared_with_all_users=Shared with all users
-issue_filter.sharing=Sharing
-issue_filter.no_issues=No Issues
-
-
-#------------------------------------------------------------------------------
-#
-# ISSUE FILTERS
-#
-#------------------------------------------------------------------------------
-issues.sort.creation_date=Creation Date
-issues.sort.update_date=Update Date
-issues.sort.close_date=Close Date
-issues.sort.assignee=Assignee
-issues.sort.severity=Severity
-issues.sort.status=Status
-issues.ordered_by=Ordered by
-issues.found=Found
-
-
 #------------------------------------------------------------------------------
 #
 # ISSUES FACETS
@@ -873,8 +654,6 @@ issue_bulk_change.form.title=Change {0} issues
 issue_bulk_change.comment.help=This comment will be applied only to issues that will effectively be modified
 issue_bulk_change.max_issues_reached=As too many issues have been selected, only the first {0} issues will be updated.
 issue_bulk_change.x_issues={0} issues
-issue_bulk_change.error.empty_issues=Issues must not be empty
-issue_bulk_change.error.need_one_action=At least one action must be provided
 
 
 
@@ -884,11 +663,7 @@ issue_bulk_change.error.need_one_action=At least one action must be provided
 #
 #------------------------------------------------------------------------------
 
-all-projects.cols.name=Name
-all-projects.results_not_display_due_to_security=Due to security settings, some results are not being displayed.
-
 projects.page=Projects
-projects.page.description=Explore projects by coverage, duplications or size.
 projects._projects=projects
 projects.no_projects.empty_instance=Once you analyze some projects, they will show up here.
 projects.no_favorite_projects=You don't have any favorite projects yet.
@@ -899,7 +674,6 @@ projects.no_leak_period=Project has no leak data yet.
 projects.leak_period_x=Leak Period started: {0}
 projects.last_analysis_on_x=Last analysis: {0}
 projects.search=Search by project name or key
-projects.sort_list=Sort list by
 projects.perspective=Perspective
 projects.sort_by=Sort by
 projects.sort_ascending=Result sorted in ascending order
@@ -919,9 +693,6 @@ projects.sorting.new_maintainability=Maintainability
 projects.sorting.new_coverage=Coverage
 projects.sorting.new_duplications=Duplications
 projects.sorting.new_lines=New Lines
-projects.sorting.on_new_code=on New Code
-projects.sorting.on_new_lines=on New Lines
-projects.view_settings=Settings
 projects.view.overall=Overall Status
 projects.view.leak=Leak
 projects.worse_of_reliablity_and_security=Worse of Reliability and Security
@@ -958,46 +729,12 @@ projects.sort.size=by size (smallest first)
 projects.sort.-size=by size (biggest first)
 
 
-#------------------------------------------------------------------------------
-#
-# COMPARISON
-#
-#------------------------------------------------------------------------------
-
-comparison.compare=Compare
-comparison.add_metric=Add metric
-comparison.add_project=Add project
-comparison.select_version=Select a version
-comparison.suppress_column=Suppress column
-comparison.suppress_line=Suppress line
-comparison.move_left=Move left
-comparison.move_right=Move right
-comparison.move_down=Move down
-comparison.move_up=Move up
-comparison.version.latest=LATEST
-
-
-#------------------------------------------------------------------------------
-#
-# DEPENDENCIES
-#
-#------------------------------------------------------------------------------
-
-dependencies.search_library=Search library
-dependencies.search_help=Find out which projects depend on a given library.<br/>Search by group, artifact or name. E.g.: org.apache.struts, struts-core or Struts
-dependencies.select_library=Select library
-dependencies.select_version=Select version
-dependencies.used_by=Used by
-dependencies.not_used=Not used
-
-
 #------------------------------------------------------------------------------
 #
 # DASHBOARD
 #
 #------------------------------------------------------------------------------
 
-dashboard.no_dashboard=No dashboard
 dashboard.project_not_found=The requested project does not exist.
 dashboard.project_not_found.2=Either it has never been analyzed successfully or it has been deleted.
 
@@ -1007,8 +744,6 @@ dashboard.project_not_found.2=Either it has never been analyzed successfully or
 # SETTINGS
 #
 #------------------------------------------------------------------------------
-settings.add=Add value
-settings.save_category=Save {0} Settings
 settings.key_x=Key: {0}
 settings.default_x=Default: {0}
 settings.not_set=(not set)
@@ -1080,13 +815,12 @@ property.category.scm=SCM
 property.sonar.leak.period.description=Period used to compare measures and track new issues. Values are:<ul class='bullet'><li>Number of days before  analysis, for example 5.</li><li>A custom date. Format is yyyy-MM-dd, for example 2010-12-25</li><li>'previous_version' to compare to the previous version in the project history</li><li>A version, for example '1.2' or 'BASELINE'</li></ul><p>When specifying a number of days or a date, the snapshot selected for comparison is the first one available inside the corresponding time range. </p><p>Changing this property only takes effect after subsequent project inspections.<p/>
 property.sonar.branch.longLivedBranches.regex.description=Regular expression used to detect whether a branch is a long living branch (as opposed to short living branch), based on its name. This applies only during first analysis, the type of a branch cannot be changed later.
 
+
 #------------------------------------------------------------------------------
 #
 # SEARCH ENGINE FOR RESOURCES
 #
 #------------------------------------------------------------------------------
-search.results=results
-search.duration=({0} seconds)
 search.shortcut_hint=Hint: Press {0} from anywhere to open this search bar.
 search.show_more.hint=Press {0} to display
 search.placeholder=Search for projects, sub-projects and files...
@@ -1110,7 +844,6 @@ shortcuts.section.issues.navigate_between_issues=navigate between issues
 shortcuts.section.issues.open_details=go from the list of issues to the source code
 shortcuts.section.issues.return_to_list=return back to the list
 
-shortcuts.section.issue.select=select an issue
 shortcuts.section.issue.do_transition=do an issue transition
 shortcuts.section.issue.assign=assign issue
 shortcuts.section.issue.assign_to_me=assign issue to the current user
@@ -1126,9 +859,6 @@ shortcuts.section.rules.return_to_list=return back to the list
 shortcuts.section.rules.activate=activate selected rule
 shortcuts.section.rules.deactivate=deactivate selected rule
 
-shortcuts.section.code=Code Page
-shortcuts.section.code.search=search components in the project scope
-
 tutorials.onboarding=Analyze a new project
 tutorials.skip=Skip this tutorial
 tutorials.finish=Finish this tutorial
@@ -1145,162 +875,38 @@ select2.searching=Searching...
 select2.tooShort=Please enter at least {0} characters
 
 
-#------------------------------------------------------------------------------
-#
-# COMPONENTS
-#
-#------------------------------------------------------------------------------
-
-components.no_projects_have_been_analysed=No projects have been analysed.
-components.explanation_launch_sonar_to_have_results=If Maven and SonarQube are installed with default parameters on the same box, just launch the command <code>mvn sonar:sonar</code> to analyse your first project. In any other case, please refer to the <a href="http://www.sonarsource.org/documentation">documentation</a>.
-components.note_changes_impact_all_users=Note that these changes will impact all users and all projects.
-
-
-#------------------------------------------------------------------------------
-#
-# DRILLDOWN
-#
-#------------------------------------------------------------------------------
-
-drilldown.drilldown_on=Drilldown on
-issues_drilldown.col.severity=Severity
-issues_drilldown.col.rule=Rule
-issues_drilldown.no_issue=No issue
-drilldown.no_items_found=No items found
-
-
-#------------------------------------------------------------------------------
-#
-# RESOURCE VIEWER
-#
-#------------------------------------------------------------------------------
-
-resource_viewer.resource_deleted=This resource has been deleted.
-
-
-#------------------------------------------------------------------------------
-#
-# ISSUES VIEWER
-#
-#------------------------------------------------------------------------------
-
-issues_viewer.issue_filter.false_positives=False positives
-issues_viewer.issue_filter.unassigned=Not assigned
-
-
 #------------------------------------------------------------------------------
 #
 # DUPLICATION VIEWER
 #
 #------------------------------------------------------------------------------
-
-duplications.no_duplicated_block=No duplicated blocks.
 duplications.dups_found_on_deleted_resource=This file contains duplicated blocks with some deleted resources. This project should be reanalyzed to remove these obsolete duplicated blocks.
-duplications.block_was_duplicated_by_a_deleted_resource=This block was duplicated by a resource that has been deleted.
-duplications.old_format_should_reanalyze=This file contains duplications but a new analysis must be done in order to be able to display them.
-duplications.blocks=Blocks
-duplications.number_of_lines=Nb Lines
-duplications.from_line=From line
-duplications.file=File
-duplications.details=Details
-duplications.expand=Expand
-duplications.collapse=Collapse
-
 
-#------------------------------------------------------------------------------
-#
-# COVERAGE VIEWER
-#
-#------------------------------------------------------------------------------
-coverage_viewer.on_new_code=On new code
-coverage_viewer.by=by tests
-it_coverage_viewer.by=by integration tests
-overall_coverage_viewer.by=by all tests
-coverage_viewer.unit_tests=Tests
-coverage_viewer.integration_tests=Integration Tests
-coverage_viewer.overall_tests=All Tests
-coverage_viewer.per_test=Per test
-coverage_viewer.lines_covered_per_test=Covered lines
-coverage_viewer.select_test=Select a test
-coverage_viewer.line_covered_by_x_tests=Line is covered by {0} tests
-coverage_viewer.x_covered_conditions={0} conditions are covered by tests
 
 #------------------------------------------------------------------------------
 #
 # GENERIC CODE VIEWER
 #
 #------------------------------------------------------------------------------
-code_viewer.no_info_displayed_due_to_security=Due to security settings, no information can be displayed.
 code_viewer.no_source_code_displayed_due_to_security=Due to security settings, no source code can be displayed.
 code_viewer.no_source_code_displayed_due_to_source_removed=The file was removed, no source code can be displayed.
 
 
-#------------------------------------------------------------------------------
-#
-# TESTS VIEWER
-#
-#------------------------------------------------------------------------------
-test_viewer.tests=Tests
-test_viewer.failures=Failures
-test_viewer.errors=Errors
-test_viewer.duration=Duration
-test_viewer.unit_test_name=Unit test name
-test_viewer.skipped=skipped
-test_viewer.expand=expand
-test_viewer.collapse=collapse
-test_viewer.covered_lines=Covered Lines
-test_viewer.tests_covering=Tests covering <b>{0}</b> on line <b>{1}</b>
-test_viewer.files_covered_by=Files covered by <b>{0}</b> ({1})
-
-
-#------------------------------------------------------------------------------
-#
-# MANUAL MEASURES
-#
-#------------------------------------------------------------------------------
-
-manual_measures.add_measure=Add Manual Measure
-manual_measures.manage_metrics=Manage Metrics
-manual_measures.col.domain=Domain
-manual_measures.col.metric=Metric
-manual_measures.col.value=Value
-manual_measures.col.description=Description
-manual_measures.col.author=Author
-manual_measures.col.date=Date
-manual_measures.col.operations=Operations
-manual_measures.col.last_change=Last change
-manual_measures.col.last_change_label=By {0} at {1}
-manual_measures.create_measure=Create Manual Measure
-manual_measures.delete_measure=Delete Manual Measure
-manual_measures.delete_measure.desc=Are you sure that you want to delete manual measure "{0}"?
-manual_measures.edit_measure=Edit Manual Measure: {0}
-manual_measures.save_button=Save
-manual_measures.save_and_add_button=Save & Add new
-manual_measures.pending_message=Pending measures are marked with orange box. Their values will be integrated to project during next analysis.
-manual_measures.no_more_available_metric=All available manual metrics have a measure.
-manual_measures.to_define_new_manual_metric_il_require=You can define new manual metrics if required.
-
-
 #------------------------------------------------------------------------------
 #
 # CUSTOM MEASURES
 #
 #------------------------------------------------------------------------------
-
+custom_measures.page=Custom Measures
+custom_measures.page.description=Update the values of custom metrics for this project. Changes will take effect at the project's next analysis. Custom metrics must be created at the global level.
 custom_measures.pending=Pending
 custom_measures.pending_tooltip=The value will be integrated to project during next analysis.
 custom_measures.all_metrics_taken=There are already measures on all available custom metrics.
-
-
-
-#------------------------------------------------------------------------------
-#
-# MANUAL MEASURES
-#
-#------------------------------------------------------------------------------
-
-manual_rules.should_provide_real_description=Rule created on the fly. A description should be provided.
-manual_rules.add_manual_rule=Add Manual Rule
+custom_measures.delete_custom_measure=Delete Custom Measure
+custom_measures.delete_custom_measure.confirmation=Are you sure you want to delete custom measure "{0}"?
+custom_measures.create_custom_measure=Create Custom Measure
+custom_measures.update_custom_measure=Update Custom Measure
+custom_measures.metric=Metric
 
 
 #------------------------------------------------------------------------------
@@ -1339,36 +945,6 @@ project_activity.graphs.custom.type_x_message=Only "{0}" metrics are available w
 
 project_activity.custom_metric.covered_lines=Covered Lines
 
-project_history.col.year=Year
-project_history.col.month=Month
-project_history.col.day=Day
-project_history.col.time=Time
-project_history.col.events=Events
-project_history.col.action=Action
-project_history.col.version=Version
-project_history.col.alert=Quality Gate Status
-project_history.col.profile=Profile
-project_history.delete=Delete
-project_history.last_snapshot=Last Analysis
-project_history.delete_snapshot=Delete
-project_history.snapshot_deleted=The snapshot is deleted.
-project_history.are_you_sure_delete_snapshot_x=Are you sure you want to delete the snapshot created on '{0}'?
-project_history.rename_version=Rename
-project_history.create_version=Create
-project_history.remove_version=Remove
-project_history.do_you_want_to_remove_version=Are you sure you want to remove '{0}' from this snapshot?
-project_history.version_updated=Version was updated to '{0}' for current project.
-project_history.version_created=Version '{0}' was created for current project.
-project_history.version_removed=Version '{0}' was removed from current project.
-project_history.version_already_exists=Version '{0}' already exists.
-project_history.rename_event=Rename
-project_history.create_event=Create
-project_history.remove_event=Remove
-project_history.event_updated=Event was successfully updated.
-project_history.event_deleted=Event '{0}' was deleted.
-project_history.event_created=Event '{0}' was created.
-project_history.event_already_exists=Event '{0}' already exists.
-
 
 #------------------------------------------------------------------------------
 #
@@ -1423,118 +999,40 @@ projects_management.delete_selected_warning=You're about to delete {0} selected
 projects_management.delete_all_warning=You're about to delete all {0} items.
 
 
-#------------------------------------------------------------------------------
-#
-# TIME MACHINE
-#
-#------------------------------------------------------------------------------
-
-time_machine.show_date=Show date
-time_machine.show_event=Show event
-time_machine.distributions=Distributions
-time_machine.distribution_chart=Distribution chart
-time_machine.compare_on_chart=Compare on chart
-time_machine.set_as_default_for_all_users=Set as default (for all users)
-
-
-#------------------------------------------------------------------------------
-#
-# CLOUDS
-#
-#------------------------------------------------------------------------------
-
-cloud.quick_wins=Quick wins
-cloud.top_risk=Top risk
-
-
 #------------------------------------------------------------------------------
 #
 # QUALITY PROFILES
 #
 #------------------------------------------------------------------------------
 
-quality_profiles.quality_profiles=Quality Profiles
 quality_profiles.new_profile=New Profile
-quality_profiles.compare_profiles=Compare Profiles
 quality_profiles.compare_with=Compare with
 quality_profiles.restore_profile=Restore Profile
-quality_profiles.restore_submit=Restore
 quality_profiles.restore_profile.success={1} rule(s) restored in profile "{0}"
 quality_profiles.restore_profile.warning={1} rule(s) restored, {2} rule(s) ignored in profile "{0}"
-quality_profiles.x_language_profiles={0} Profiles
 quality_profiles.optional_configuration_file=Optional configuration file
-quality_profiles.create_x_language_profile=Create {0} Profile
-quality_profiles.are_you_sure_want_x_profile_as_default=Are you sure that you want to set the profile "{0}" as default?
-quality_profiles.profile_x_created=Profile "{0}" created. Set it as default or link it to a project to use it for next measures.
-quality_profiles.already_exists=This profile already exists.
-quality_profiles.profile_x_already_exists=Profile "{0}" already exists.
-quality_profiles.please_type_profile_name=Please type a profile name.
-quality_profiles.profile_x_deleted=Profile "{0}" is deleted.
-quality_profiles.default_profile_is_x=Default profile is "{0}".
-quality_profiles.profile_x_not_activated=Profile "{0}" is created but not activated.
-quality_profiles.please_upload_backup_file=Please upload a backup file.
-quality_profiles.profile_x_associated_to_x_projects=Profile "{0}" associated to {1} projects.
-quality_profiles.profile_name_cant_be_blank=Profile name can not be blank.
 quality_profiles.new_name=New name
-quality_profiles.name_for_new_profile=Name for the new profile
 quality_profiles.delete_confirm_title=Delete Profile
 quality_profiles.are_you_sure_want_delete_profile_x=Are you sure that you want to delete the profile "{0}"?
 quality_profiles.are_you_sure_want_delete_profile_x_and_descendants=Are you sure that you want to delete the profile "{0}" and all its descendants?
 quality_profiles.this_profile_has_descendants=This profile has descendants.
-quality_profiles.editing_profile=Editing profile
 quality_profiles.profile_inheritance=Inheritance
-quality_profiles.available_projects=Available projects
-quality_profiles.associated_projects=Associated projects
 quality_profiles.no_projects_associated_to_profile=No projects are explicitly associated to the profile.
-quality_profiles.projects_warning=List of projects explicitly associated to this Quality profile :
-quality_profiles.including_x_overriding.suffix=, incl. {0} overriding
-quality_profiles.set_parent=Set parent
 quality_profiles.parent=Parent:
-quality_profiles.inherit_rules_from_profile=Inherit rules configuration from the profile
-quality_profiles.no_version=no version
-quality_profiles.last_version_x_with_date=last version {0} ({1})
-quality_profiles.version_x_with_date=version {0} ({1})
-quality_profiles.version_x=version {0}
 quality_profiles.parameter_set_to=Parameter {0} set to {1}
-quality_profiles.only_in_profile_x=Only in {0}
-quality_profiles.with_different_configuration=With different configuration
-quality_profiles.with_same_configuration=With same configuration
 quality_profiles.x_rules_only_in={0} rules only in
 quality_profiles.x_rules_have_different_configuration={0} rules have a different configuration
-quality_profiles.remove_project_action=Remove
-quality_profiles.remove_projects_action=Remove All
-quality_profiles.add_project_action=Add Project
-quality_profiles.remove_project_confirm_title=Remove Project from Profile
-quality_profiles.remove_project_confirm_message=Are you sure that you want to dissociate the project "{0}" from this profile? The default profile will be used during next analysis of this project.
-quality_profiles.remove_project_confirm_button=Remove
-quality_profiles.remove_projects_confirm_title=Remove All Projects from Profile
-quality_profiles.remove_projects_confirm_message=Are you sure that you want to dissociate all the projects from this profile? The default profile will be used during next analysis of these projects.
-quality_profiles.remove_projects_confirm_button=Remove All
 quality_profiles.copy_x_title=Copy Profile {0} - {1}
 quality_profiles.copy_new_name=New name
-quality_profiles.copy_overwrite_x=You are about to copy this quality profile into the existing "{0}" profile, which will fully overwrite it. Please confirm the name if you want to overwrite, or choose another name.
-quality_profiles.copy_x_overwritten=Profile '{0}' has been overwritten.
 quality_profiles.rename_x_title=Rename Profile {0} - {1}
-quality_profiles.restore_built_in_profiles=Restore Built-in Profiles
-quality_profiles.restore_built_in_profiles_confirmation=Are you sure you want to restore {0} built-in profiles?
-quality_profiles.restore_built_in_profiles_success_message={0} built-in profiles have been restored.
-quality_profiles.including=including
 quality_profiles.deprecated=deprecated
-quality_profiles.manage_rules_tooltip=Manage rules of this profile
-quality_profiles.manage_rules_tooltip_x_profile=Manage rules of profile '{0}'
-quality_profiles.see_rules_tooltip=See rules of this profile
-quality_profiles.see_rules_tooltip_x_profile=See rules of profile '{0}'
 quality_profiles.severity_set_to=Severity set to
-quality_profiles.changelog_from=Changelog from
-quality_profiles.changelog.empty=No changes have been done.
 quality_profiles.changelog.ACTIVATED=Activated
 quality_profiles.changelog.DEACTIVATED=Deactivated
 quality_profiles.changelog.UPDATED=Updated
 quality_profiles.changelog.parameter_reset_to_default_value=Parameter {0} reset to default value
 quality_profiles.deleted_profile=The profile {0} doesn't exist anymore
 quality_profiles.projects_for_default=Every project not specifically associated with a quality profile will be associated to this one by default.
-quality_profiles.projects_for_default.edit=You must not select specific projects for the default quality profile.
-quality_profiles.inherits=Inherits "{0}"
 quality_profile.x_rules={0} rule(s)
 quality_profile.x_active_rules={0} active rules
 quality_profiles.x_overridden_rules={0} overridden rules
@@ -1542,23 +1040,17 @@ quality_profiles.change_parent=Change Parent
 quality_profiles.all_profiles=All Profiles
 quality_profiles.x_profiles={0} profile(s)
 quality_profiles.x_Profiles={0} Profiles
-quality_profiles.x_projects={0} projects
-quality_profiles.no_results=No profiles found. Try installing a language plugin.
 quality_profiles.projects.select_hint=Click to associate this project with the quality profile
 quality_profiles.projects.deselect_hint=Click to remove association between this project and the quality profile
-quality_profiles.no_profiles_for_comparison=There are no profiles for comparison
 quality_profile.empty_comparison=The quality profiles are equal.
 quality_profiles.activate_more=Activate More
 quality_profiles.activate_more_rules=Activate More Rules
 quality_profiles.intro1=Quality Profiles are collections of rules to apply during an analysis.
 quality_profiles.intro2=For each language there is a default profile. All projects not explicitly assigned to some other profile will be analyzed with the default.
-quality_profiles.list.profile=Profile
-quality_profiles.list.inheritance=Inheritance
 quality_profiles.list.projects=Projects
 quality_profiles.list.rules=Rules
 quality_profiles.list.updated=Updated
 quality_profiles.list.used=Used
-quality_profiles.x_activated_out_of_y={0} rules activated out of {1} available
 quality_profiles.x_updated_on_y={0}, updated on {1}
 quality_profiles.change_projects=Change Projects
 quality_profiles.not_found=The requested quality profile was not found.
@@ -1594,7 +1086,6 @@ quality_profiles.search_description=Search users by login or name, and groups by
 #
 #------------------------------------------------------------------------------
 
-quality_gates.noQualityGates=No Quality Gates
 quality_gates.create=Create Quality Gate
 quality_gates.rename=Rename Quality Gate
 quality_gates.delete=Delete Quality Gate
@@ -1606,8 +1097,6 @@ quality_gates.condition.leak.never=Never
 quality_gates.no_conditions=No Conditions
 quality_gates.introduction=Only project measures are checked against thresholds. Sub-projects, directories and files are ignored.
 quality_gates.health_icons=Project health icons represent:
-quality_gates.metric=Metric
-quality_gates.threshold=Threshold
 quality_gates.projects_for_default=Every project not specifically associated to a quality gate will be associated to this one by default.
 quality_gates.projects_for_default.edit=You must not select specific projects for the default quality gate.
 quality_gates.projects.with=With
@@ -1632,9 +1121,6 @@ quality_gates.delete.confirm.message=Are you sure you want to delete the "{0}" q
 quality_gates.delete.confirm.default=Are you sure you want to delete the "{0}" quality gate, which is the default quality gate?
 quality_gates.delete_condition=Delete Condition
 quality_gates.delete_condition.confirm.message=Are you sure you want to delete the "{0}" condition?
-quality_gates.project_period=over period {0} - defined at project level
-quality_gates.warning_tooltip=Warning Threshold
-quality_gates.error_tooltip=Error Threshold
 quality_gates.condition.leak.yes=Yes
 quality_gates.condition.leak.no=No
 quality_gates.condition.leak.unconditional=Always
@@ -1652,10 +1138,7 @@ quality_gates.intro.2=It is possible to set a default Quality Gate, which will b
 # RULES DOCUMENTATION PAGE
 #
 #------------------------------------------------------------------------------
-rules.more_about_rule_on_profile_x=More about this rule on profile "{0}"
-rules.identification=Identification
 rules.parameters=Parameters
-rules.not_found=The rule "{0}" does not exist
 rules.status.beta=Beta
 rules.status.BETA=Beta
 rules.status.deprecated=Deprecated
@@ -1673,17 +1156,11 @@ coding_rules.active_in_all_profiles=The rule is already activated on all availab
 coding_rules.activate=Activate
 coding_rules.activate_in=Activate In
 coding_rules.activate_in_quality_profile=Activate In Quality Profile
-coding_rules.activate_in_all_quality_profiles=Activate In All {0} Profiles
-coding_rules.add_note=Add Note
-coding_rules.add_tags=Add Tags
 coding_rules.available_since=Available Since
 coding_rules.bulk_change=Bulk Change
 coding_rules.bulk_change.success={2} rule(s) changed in profile {0} - {1}
 coding_rules.bulk_change.warning={2} rule(s) changed, {3} rule(s) ignored in profile {0} - {1}
 coding_rules.can_not_deactivate=This rule is inherited and can not be deactivated.
-coding_rules.change_severity=Change Severity
-coding_rules.change_severity_in=Change Severity In
-coding_rules.change_details=Change Details of Quality Profile
 coding_rules.create=Create
 coding_rules.create_custom_rule=Create Custom Rule
 coding_rules.custom_rule=Custom Rule
@@ -1696,25 +1173,18 @@ coding_rules.extend_description=Extend Description
 coding_rules.deactivate_in=Deactivate In
 coding_rules.deactivate=Deactivate
 coding_rules.deactivate.confirm=Are you sure you want to deactivate this rule in the profile?
-coding_rules.deactivate_in_quality_profile=Deactivate In Quality Profile
 coding_rules.deactivate_in_all_quality_profiles=Deactivate In All {0} Profiles
-coding_rules.found=Found
 coding_rules.inherits="{0}" inherits from "{1}"
 coding_rules.issues=Issues
-coding_rules.key=Key:
 coding_rules.most_violating_projects=Most Violating Projects
 coding_rules.new_search=New Search
 coding_rules.no_results=No Coding Rules
 coding_rules.no_tags=No tags
-coding_rules.order=Order
-coding_rules.ordered_by=Ordered By
 coding_rules.original=Original:
 coding_rules.overrides="{0}" overrides "{1}"
-coding_rules.overwrite=Overwrite
 coding_rules.parameter.empty=(empty)
 coding_rules.parameters=Parameters
 coding_rules.parameters.default_value=Default Value:
-coding_rules.permalink=Permalink
 coding_rules.quality_profiles=Quality Profiles
 coding_rules.quality_profiles.template_caption=This rule template was activated on the following profiles in previous versions of SonarQube. It is not possible anymore to do so. Instead, please create a custom rule.
 coding_rules.quality_profile=Quality Profile
@@ -1722,18 +1192,15 @@ coding_rules.reactivate=Reactivate
 coding_rules.reactivate.help=A rule with the same key has been previously deleted. Please reactivate the existing rule or modify the key to create a new rule.
 coding_rules.return_to_list=Return to List
 coding_rules.remove_extended_description.confirm=Are you sure you want to remove the extended description?
-coding_rules.repository=Repository:
 coding_rules.revert_to_parent_definition=Revert to Parent Definition
 coding_rules.revert_to_parent_definition.confirm=This rule will be reverted to the parameters defined in profile {0}. Are you sure?
 coding_rules.rule_template=Rule Template
 coding_rules.rule_template.title=This rule can be used as a template to create custom rules,\nit cannot be activated on a profile
 coding_rules._rules=rules
-coding_rules.select_tag=Select Tag
 coding_rules.show_template=Show Template
 coding_rules.type.tooltip.CODE_SMELL=Code Smell Detection Rule
 coding_rules.type.tooltip.BUG=Bug Detection Rule
 coding_rules.type.tooltip.VULNERABILITY=Vulnerability Detection Rule
-coding_rules.noncharacterized=Uncharacterized
 coding_rules.update_custom_rule=Update Custom Rule
 coding_rules.filter_similar_rules=Filter Similar Rules
 
@@ -1782,10 +1249,6 @@ coding_rules.facets.tags=Tags
 coding_rules.facets.repositories=Repositories
 coding_rules.facets.top=Top {0}
 
-coding_rules.sort.creation_date=Creation Date
-coding_rules.sort.name=Name
-coding_rules.sort.relevance=Relevance
-
 coding_rules.remediation_function=Remediation function
 coding_rules.remediation_function.LINEAR=Linear
 coding_rules.remediation_function.LINEAR_OFFSET=Linear with offset
@@ -1799,33 +1262,12 @@ coding_rules.remediation_function.constant=Constant
 # EMAIL CONFIGURATION
 #
 #------------------------------------------------------------------------------
-email_configuration.smtp_host=SMTP host
-email_configuration.smtp_host.description=For example "smtp.gmail.com". Leave blank to disable email sending.
-email_configuration.smtp_port=SMTP port
-email_configuration.smtp_port.description=Port number to connect with SMTP server.
-email_configuration.smtp_secure_connection=Use secure connection
-email_configuration.smtp_secure_connection.description=Whether to use secure connection and its type.
-email_configuration.smtp_username=SMTP username
-email_configuration.smtp_username.description=Optional - if you use authenticated SMTP, enter your username.
-email_configuration.smtp_password=SMTP password
-email_configuration.smtp_password.description=Optional - as above, enter your password if you use authenticated SMTP.
-email_configuration.from_address=From address
-email_configuration.from_address.description=Emails will come from this address. For example - "noreply@sonarsource.com". Note that server may ignore this setting (like does GMail).
-email_configuration.email_prefix=Email prefix
-email_configuration.email_prefix.description=This prefix will be prepended to all outgoing email subjects.
-email_configuration.save_settings=Save Email Settings
-email_configuration.saving_settings=Saving
-email_configuration.settings_saved=Settings are saved.
-
 email_configuration.test.title=Test Configuration
 email_configuration.test.to_address=To
-email_configuration.test.to_address_required=You must provide address where to send test email
 email_configuration.test.subject=Subject
-email_configuration.test.subject_text=Test Message from SonarQube
 email_configuration.test.message=Message
 email_configuration.test.message_text=This is a test message from SonarQube.
 email_configuration.test.send=Send Test Email
-email_configuration.test.sending=Sending Test Email
 email_configuration.test.email_was_sent_to_x=Email was sent to {0}
 
 
@@ -1837,8 +1279,8 @@ email_configuration.test.email_was_sent_to_x=Email was sent to {0}
 property.category.licenses=Licenses
 property.category.licenses.description=In case of any issue or question about licenses, please send an email to <a href="mailto:contact@sonarsource.com?subject=Question about license">contact@sonarsource.com</a>.
 property.category.licenses.server_id=Server ID
+
 server_id_configuration.generate_button=Generate ID
-server_id_configuration.generating_button=Generating ID...
 server_id_configuration.bad_key=The ID is not valid anymore. Please check the organization and the IP address.
 server_id_configuration.information=The Server ID is a unique identifier of this SonarQube instance. It is used for example to obtain a license key for the SonarSource's commercial plugins. Two fields have to be provided to generate the ID : organization name and one of the IP addresses of the machine that hosts this server. There is no need to restart the server after generating a new server ID.
 server_id_configuration.organisation.title=Organization
@@ -1846,9 +1288,7 @@ server_id_configuration.organisation.desc=Name of the organization
 server_id_configuration.organisation.pattern=Only letters, digits and whitespaces are allowed.
 server_id_configuration.ip.title=Fixed IP Address
 server_id_configuration.ip.desc=A server ID is linked to the IP address of the hosting machine that runs SonarQube. If the server IP address was to change, the server ID will have to be regenerated. The valid addresses are :
-server_id_configuration.generation_error=Organization and/or IP address are not valid.
-server_id_configuration.fields_cannot_be_blank=Organization and IP address cannot be blank.
-server_id_configuration.does_not_match_organisation_pattern=Organization does not match the required pattern.
+
 licenses.list.product=Product
 licenses.list.organization=Organization
 licenses.list.expiration=Expiration
@@ -1884,38 +1324,22 @@ notification.dispatcher.CeReportTaskFailure.project=Background tasks in failure
 #
 #------------------------------------------------------------------------------
 
-alerts.no_alerts=No alerts.
-alerts.notes.description=<p>Only project measures are checked against thresholds. Modules, packages and classes are ignored.</p>Project health icons represent :
 alerts.notes.ok=at least one threshold is defined, no threshold is reached.
 alerts.notes.warn=at least one warning threshold is reached, no error threshold is reached.
 alerts.notes.error=at least one error threshold is reached.
-alerts.select_metric=Select a metric
 alerts.operator.<=is less than
 alerts.operator.>=is greater than
 alerts.operator.\==equals
 alerts.operator.!\==is not
 
-#------------------------------------------------------------------------------
-#
-# EVENTS
-#
-#------------------------------------------------------------------------------
-
-events.add_an_event=Add an event
-events.name_required=Name (required)
 
 #------------------------------------------------------------------------------
 #
 # USER
 #
 #------------------------------------------------------------------------------
-user.bad_login=Use only letters, numbers, and .-_@ please.
 user.password_doesnt_match_confirmation=Password doesn't match confirmation.
-user.reactivated=The user '{0}' has been reactivated.
-user.add_scm_account=Add SCM account
-user.scm_account_already_used=The scm account '{0}' is already used by user(s) : '{1}'
 user.login_or_email_used_as_scm_account=Login and email are automatically considered as SCM accounts
-user.password_cant_be_changed_on_external_auth=Password cannot be changed when external authentication is used
 
 login.login_to_sonarqube=Log In to SonarQube
 login.more_options=More options
@@ -1941,8 +1365,6 @@ groups.remove.confirmation=Are you sure you want to remove group "{user}"?
 # MY PROFILE & MY ACCOUNT
 #
 #------------------------------------------------------------------------------
-my_profile.login=Login
-my_profile.name=Name
 my_profile.email=Email
 my_profile.groups=Groups
 my_profile.scm_accounts=SCM Accounts
@@ -1952,66 +1374,27 @@ my_profile.password.new=New Password
 my_profile.password.confirm=Confirm Password
 my_profile.password.submit=Change password
 my_profile.password.changed=The password has been changed!
-my_profile.password.empty=Password can not be empty
-my_profile.password.wrong_old=Wrong old password
 my_profile.notifications.submit=Save changes
 my_profile.overall_notifications.title=Overall notifications
 my_profile.per_project_notifications.title=Notifications per project
-my_profile.add_project=Add project
-my_profile.remove_this_line=Remove this line
-my_profile.favorites.title=Favorites
 
 my_account.page=My Account
-my_account.favorite_components=Favorite Components
-my_account.no_favorite_components=You do not have favorite components yet.
-my_account.no_favorite_issue_filters=You do not have favorite issue filters yet.
 my_account.notifications=Notifications
 my_account.no_project_notifications=You have not set project notifications yet.
 my_account.profile=Profile
 my_account.security=Security
 my_account.tokens_description=If you want to enforce security by not providing credentials of a real SonarQube user to run your code scan or to invoke web services, you can provide a User Token as a replacement of the user login. This will increase the security of your installation by not letting your analysis user's password going through your network.
-my_account.my_issues=My Issues
-my_account.issue_widget.leak_last_week=Leak Last Week
-my_account.issue_widget.by_project=My Issues by Project
-my_account.issue_widget.by_severity=My Issues by Severity
-my_account.to_fix=To Fix
 my_account.projects=Projects
 my_account.projects.description=Those projects are the ones you are administering.
 my_account.projects.no_results=You are not administering any project yet.
 my_account.projects.analyzed_x=Analyzed {0}
 my_account.projects.never_analyzed=Never analyzed
-my_account.projects.x_characters_min=({0} characters min)
 my_account.organizations=Organizations
 my_account.organizations.description=Those organizations are the ones you are administering.
 my_account.organizations.no_results=You are not administering any organizations yet.
 my_account.create_organization=Create Organization
-
-
-
-#------------------------------------------------------------------------------
-#
-# BULK RESOURCE DELETION
-#
-#------------------------------------------------------------------------------
-bulk_deletion.resource.projects=Projects
-bulk_deletion.resource.views=Portfolios
-bulk_deletion.resource.devs=Developers
-bulk_deletion.resource_name_filter_by_name=Filter by name:
-bulk_deletion.filter=Filter
-bulk_deletion.page_size=Page size
-bulk_deletion.select_all=Select all
-bulk_deletion.select_all_x_resources=Select all {0} components
-bulk_deletion.clear_selection=Clear selection of all {0} components
-bulk_deletion.following_deletions_failed=The following components could not be deleted. Please check the logs to know more about it.
-bulk_deletion.hide_message=Hide message
-bulk_deletion.sure_to_delete_the_resources=Are you sure you want to delete the selected components?
-bulk_deletion.please_select_at_least_one_resource=Please select at least one component to delete.
-bulk_deletion.deletion_manager.deleting_resources=Deleting components...
-bulk_deletion.deletion_manager.no_resource_to_delete=No results.
-bulk_deletion.deletion_manager.currently_deleting_x_out_of_x=Currently deleting components... ({0} out of {1})
-bulk_deletion.deletion_manager.deletion_completed=Component deletion completed.
-bulk_deletion.deletion_manager.however_failures_occurred=However, some failures occurred.
-bulk_deletion.started_since_x=Started {0} ago
+my_account.search_project=Search Project
+my_account.set_notifications_for=Set notifications for
 
 
 #------------------------------------------------------------------------------
@@ -2019,9 +1402,6 @@ bulk_deletion.started_since_x=Started {0} ago
 # PROJECT PROVISIONING
 #
 #------------------------------------------------------------------------------
-provisioning.no_results=There is currently no provisioned project.
-provisioning.missing.key=Key is missing
-provisioning.missing.name=Name is missing
 provisioning.no_analysis=No analysis has been performed since creation. The only available section is the configuration.
 provisioning.no_analysis.delete=Either you should retry analysis or simply {0}.
 provisioning.no_analysis.delete_project=delete the project
@@ -2137,6 +1517,7 @@ metric.comment_lines.description=Number of comment lines
 metric.comment_lines.name=Comment Lines
 metric.comment_lines_density.description=Comments balanced by ncloc + comment lines
 metric.comment_lines_density.name=Comments (%)
+metric.comment_lines_density.short_name=Comments
 metric.complexity.abbreviation=Cmpx
 metric.complexity.description=Cyclomatic complexity
 metric.complexity.name=Complexity
@@ -2547,6 +1928,7 @@ global_permissions.scan=Execute Analysis
 global_permissions.scan.desc=Ability to get all settings required to perform an analysis (including the secured settings like passwords) and to push analysis results to the SonarQube server.
 global_permissions.provisioning=Create Projects
 global_permissions.provisioning.desc=Ability to initialize a project so its settings can be configured before the first analysis.
+global_permissions.filter_by_x_permission=Filter by "{0}" permission
 
 
 
@@ -2618,21 +2000,15 @@ permission_templates.page.description=Manage templates of project permission set
 permission_templates.set_default=Set Default
 permission_templates.set_default_for=Set Default For
 permission_template.new_template=Create Permission Template
-permission_template.create_template=Create
 permission_template.delete_confirm_title=Delete Permission Template
 permission_template.do_you_want_to_delete_template_xxx=Are you sure that you want to delete permission template "{0}"?
-permission_template.delete_template=Delete
 permission_template.edit_template=Edit Permission Template
-permission_template.update_template=Update
 permission_template.edit_permissions=Edit Permissions: {0}
-permission_template.update_permissions=Save
-permission_template.no_results=No template to display
-permission_template.set_default_templates=Set Default Templates
 permission_template.key_pattern=Project key pattern
+permission_template.key_pattern.description=Should be a valid regular expression
 permission_template.default_for=Default for {0}
 permission_templates.project_creators=Project Creators
 permission_templates.project_creators.explanation=When a new project is created, the user who creates the project will receive this permission on the project.
-permission_templates.grant_permission_to_project_creators=Grant the "{0}" permission to project creators
 permission_templates.bulk_apply_permission_template=Bulk Apply Permission Template
 permission_templates.bulk_apply_permission_template.apply_to_selected=You're about to apply the selected permission template to {0} selected item(s).
 permission_templates.bulk_apply_permission_template.apply_to_all=You're about to apply the selected permission template to {0} item(s).
@@ -2668,36 +2044,8 @@ duration.years={0} years
 # COMPONENT VIEWER
 #
 #------------------------------------------------------------------------------
-component_viewer.measure_section.size=Size
-component_viewer.measure_section.complexity=Complexity
-component_viewer.measure_section.structure=Structure
-component_viewer.measure_section.documentation=Documentation
-component_viewer.measure_section.filters=Filters
-component_viewer.measure_section.severities=Severities
-component_viewer.measure_section.rules=Rules
-component_viewer.measure_section.issues=Issues
-component_viewer.measure_section.sqale=SQALE
 component_viewer.measure_section.unit_tests=Tests
-component_viewer.measure_section.tests=Tests
-component_viewer.measure_section.test_cases=Test Cases
-component_viewer.measure_section.integration_tests=Integration Tests
-component_viewer.measure_section.overall=Overall
-
-component_viewer.issues.current_issue=Current Issue
-component_viewer.issues.unresolved_issues=Unresolved Issues
-component_viewer.issues.fixed_issues=Fixed Issues
-component_viewer.issues.false_positive_issues=False Positive Issues
-component_viewer.issues.open_issues=Open/Reopened Issues
-
-component_viewer.header.debt=Debt
-component_viewer.header.toggle_issues=Toggle issues
-component_viewer.header.toggle_coverage=Toggle coverage
-component_viewer.header.toggle_duplications=Toggle duplications
-component_viewer.header.toggle_scm=Toggle SCM
-
-component_viewer.scm.modified_lines=Modified Lines
-
-component_viewer.transition.coverage=Covered By
+
 component_viewer.transition.covers=Covers
 component_viewer.transition.duplication=Duplicated By
 
@@ -2708,31 +2056,16 @@ component_viewer.tests.status=status
 
 component_viewer.x_lines_are_covered={0} lines are covered
 component_viewer.details=Details
-component_viewer.line_actions=Line Actions
-component_viewer.no_issues=No Issues
-component_viewer.no_coverage=No Coverage
-component_viewer.time_changes=Time Changes
-component_viewer.added=Added
-component_viewer.extensions=Extensions
-component_viewer.show_full_source=Show Full Source
 component_viewer.show_raw_source=Show Raw Source
 component_viewer.more_actions=More Actions
 component_viewer.new_window=Open in New Window
 component_viewer.open_in_workspace=Pin This File
 component_viewer.get_permalink=Get Permalink
 component_viewer.covered_lines=Covered Lines
-component_viewer.issues_limit_reached=For usability reasons, only the {0} first issues will be fully displayed. Remaining issues will simply be underlined.
-component_viewer.issues_limit_reached_tooltip={0}\n\nRefine your filter to be able to see the details of this issue.
-component_viewer.cannot_show=We're sorry, but something went wrong. Please try back in a few minutes and contact support if the problem persists.
 component_viewer.show_details=Show Measures
 component_viewer.show_all_measures=Show all measures
 component_viewer.no_component=The component has been removed or never existed.
 
-component_viewer.workspace=Workspace
-component_viewer.workspace.tooltip=Keeps track of history of navigation
-component_viewer.workspace.show_workspace=Show workspace
-component_viewer.workspace.hide_workspace=Hide workspace
-
 source_viewer.covered=Covered by tests
 source_viewer.not_covered=Not covered by tests
 source_viewer.conditions=conditions
@@ -2742,27 +2075,11 @@ source_viewer.tooltip.duplicated_block=Duplicated block. Click for details.
 source_viewer.tooltip.covered=Fully covered by tests. Click for details.
 source_viewer.tooltip.partially-covered=Partially covered by tests. Click for details.
 source_viewer.tooltip.uncovered=Not covered by tests.
-source_viewer.tooltip.new_code=New {0}.
 
 source_viewer.load_more_code=Load More Code
 source_viewer.loading_more_code=Loading More Code...
 
 
-
-#------------------------------------------------------------------------------
-#
-# Analysis Reports
-#
-#------------------------------------------------------------------------------
-analysis_reports.past_reports=Past Reports
-analysis_reports.show_past_reports=Show Past Reports
-analysis_reports.current_activity=Current Activity
-analysis_reports.show_current_activity=Show Current Activity
-analysis_reports.x_reports={0} reports
-
-
-
-
 #------------------------------------------------------------------------------
 #
 # WORKSPACE
@@ -2775,17 +2092,53 @@ workspace.close=Remove from the list of pinned files
 workspace.no_rule=The rule has been removed or never existed.
 
 
-
 #------------------------------------------------------------------------------
 #
 # UPDATE CENTER
 #
 #------------------------------------------------------------------------------
+update_center.page=Update Center
+update_center.page.description=Install, uninstall and delete plugins. You can also download SonarQube updates from the System Updates tab on this page.
 update_center.status.COMPATIBLE=Compatible
 update_center.status.INCOMPATIBLE=Incompatible
 update_center.status.REQUIRES_SYSTEM_UPGRADE=Requires system update
 update_center.status.DEPS_REQUIRE_SYSTEM_UPGRADE=Some of dependencies requires system update
-
+update_center.update_to_x=Update to {0}
+update_center.uninstall=Uninstall
+update_center.i_accept_the=I accept the
+update_center.terms_and_conditions=Terms and Conditions
+update_center.install=Install
+update_center.release_notes=Release Notes
+update_center.sonarqube_needs_to_be_restarted_to=SonarQube needs to be restarted in order to
+update_center._install=install
+update_center._update=update
+update_center._uninstall=uninstall
+update_center.restart=Restart
+update_center.revert=Revert
+update_center.installed=Installed
+update_center._installed=installed
+update_center.updates=Updates
+update_center.installing_this_plugin_will_also_install=Installing this plugin will also install
+update_center.homepage=Homepage
+update_center.issue_tracker=Issue Tracker
+update_center.licensed_under=Licensed under
+update_center.developed_by=Developed by
+update_center.install_pending=Install Pending
+update_center.update_pending=Update Pending
+update_center.uninstall_pending=Uninstall Pending
+update_center.updates_only=Updates Only
+update_center.available=Available
+update_center.not_activated=Update Center is not activated.
+update_center.system_upgrade=System Upgrade
+update_center.system_upgrades=System Upgrades
+update_center.released=Released
+update_center.how_to_upgrade=How to upgrade
+update_center.how_to_upgrade.1=Download the new SonarQube version and start it on an empty DB (the bundled H2 DB for instance).
+update_center.how_to_upgrade.2=Install (from the update center) the plugins you want.
+update_center.how_to_upgrade.3=Install your custom plugins (if any).
+update_center.how_to_upgrade.4=Update the conf/sonar.properties file to use the relevant configurations from your old instance, including the connection information for your production DB.
+update_center.how_to_upgrade.5=Stop your old SonarQube server.
+update_center.how_to_upgrade.6=Restart the new SonarQube instance: you're done!
 
 
 #------------------------------------------------------------------------------
@@ -2794,11 +2147,8 @@ update_center.status.DEPS_REQUIRE_SYSTEM_UPGRADE=Some of dependencies requires s
 #
 #------------------------------------------------------------------------------
 component_navigation.status.failed=The last analysis has failed.
-component_navigation.status.failed.admin=The last analysis has failed. More details available on the {url} page.
 component_navigation.status.pending=There is a pending analysis.
-component_navigation.status.pending.admin=There is a pending analysis. More details available on the {url} page.
 component_navigation.status.in_progress=The analysis is in progress.
-component_navigation.status.in_progress.admin=The analysis is in progress. More details available on the {url} page.
 
 background_task.status.ALL=All
 background_task.status.PENDING=Pending
@@ -2831,7 +2181,6 @@ background_tasks.table.started=Started
 background_tasks.table.finished=Finished
 background_tasks.table.duration=Duration
 
-background_tasks.logs=Logs
 background_tasks.filter_by_component_x=Filter by Component "{0}"
 background_tasks.cancel_task=Cancel Task
 background_tasks.cancel_all_tasks=Cancel All Pending Tasks
@@ -2842,13 +2191,13 @@ background_tasks.error_message=Error Message
 background_tasks.error_stacktrace=Error Details
 background_tasks.pending=pending
 background_tasks.failures=still failing
-background_tasks.in_progress_duration=Duration of the current task in progress.
 
 background_tasks.number_of_workers=Number of Workers:
 background_tasks.number_of_workers.warning=Configuring additional workers without first vertically scaling your server could have negative performance impacts.
 background_tasks.change_number_of_workers=Edit CE Workers
 background_tasks.change_number_of_workers.hint=If your queue backs up behind the analysis reports from large projects, increasing the number of Compute Engine workers will allow you to take full advantage of having configured increased Compute Engine memory on a multi-core server (vertical scaling).
 background_tasks.add_more_with_governance=Add more with Governance
+background_tasks.search_by_task_or_component=Search by Task or Component
 
 
 
@@ -2935,8 +2284,6 @@ overview.complexity_tooltip.file={0} files have complexity around {1}
 overview.deprecated_profile=This quality profile uses {0} deprecated rules and should be updated.
 
 widget.as_calculated_on_x=As calculated on {0}
-widget.events.name=Events
-widget.events.show_all=Show All
 
 
 #------------------------------------------------------------------------------
@@ -2974,22 +2321,16 @@ code.open_component_page=Open Component's Page
 # COMPONENT MEASURES
 #
 #------------------------------------------------------------------------------
-component_measures.all_measures=All Measures
-component_measures.domain_measures={0} Measures
 component_measures.domain_x_overview={0} Overview
 component_measures.domain_overview=Overview
-component_measures.back_to_list=Back to List
 component_measures.files=files
 component_measures.show_metric_history=Show history of this metric
 component_measures.tab.tree=Tree
 component_measures.tab.list=List
-component_measures.tab.bubbles=Bubble Chart
 component_measures.tab.treemap=Treemap
-component_measures.tab.history=History
 component_measures.legend.color_x=Color: {0}
 component_measures.legend.size_x=Size: {0}
 component_measures.legend.worse_of_x_y=Worse of {0} and {1}
-component_measures.x_of_y={0} of {1}
 component_measures.no_history=There is no historical data.
 component_measures.not_found=The requested measure was not found.
 component_measures.to_select_files=to select files
@@ -3020,7 +2361,6 @@ component_measures.facet_category.tests_category=Tests
 #
 #------------------------------------------------------------------------------
 about_page.projects_analyzed=Projects Analyzed
-about_page.issues_found=Issues Found
 about_page.read_more=Read More
 about_page.read_documentation=Read documentation
 
@@ -3202,8 +2542,6 @@ onboarding.project_watcher.failed=Something went wrong, please check the analysi
 #------------------------------------------------------------------------------
 branches.learn_how_to_analyze=Learn how to analyze branches in SonarQube
 branches.learn_how_to_analyze.text=Quickly setup branch analysis and get separate insights for each of your branches and pull requests.
-branches.no_support.header=Get the most out of SonarQube with branches analysis
-branches.no_support.header.text=Analyze each branch of your project separately with our Developer Pack.
 branches.delete=Delete Branch
 branches.delete.are_you_sure=Are you sure you want to delete branch "{0}"?
 branches.rename=Rename Branch
@@ -3229,3 +2567,108 @@ portfolio.x_in_y={projects} in {rating}
 portfolio.empty=This portfolio is empty.
 portfolio.empty.hint=This portfolio has no projects, or none of associated projects has lines of code.
 portfolio.not_computed=This portfolio is not yet computed.
+
+
+#------------------------------------------------------------------------------
+#
+# ENCRYPTION
+#
+#------------------------------------------------------------------------------
+encryption.form_intro=Secret key is registered. You can encrypt any property value with the following form:
+encryption.form_note=Note that the secret key can be changed, but all the encrypted properties will have to be updated. <a href="https://redirect.sonarsource.com/doc/settings-encryption.html">More information</a>
+encryption.encrypted_value=Encrypted Value
+encryption.generate_secret_key=Generate Secret Key
+encryption.generate_new_secret_key=Generate New Secret Key
+encryption.encrypt=Encrypt
+ecryption.secret_key_description=Secret key is required to be able to encrypt properties. <a href="https://redirect.sonarsource.com/doc/settings-encryption.html">More information</a>
+encryption.secret_key=Secret Key
+encryption.how_to_use=How To Use
+encryption.how_to_use.content=<ul><li>Store the secret key in the file <code>~/.sonar/sonar-secret.txt</code> of the server. This file can be relocated by defining the property <code>sonar.secretKeyPath</code> in <code>conf/sonar.properties</code></li><li>Restrict access to this file by making it readable and by owner only</li><li>Restart the server if the property <code>sonar.secretKeyPath</code> has been set or changed.</li><li>Copy this file on all the machines that execute code inspection. Define the property <code>sonar.secretKeyPath</code> on those machines if the path is not <code>~/.sonar/sonar-secret.txt</code>.</li><li>For each property that you want to encrypt, generate the encrypted value and replace the original value wherever it is stored (configuration files, command lines).</li></ul>
+
+
+#------------------------------------------------------------------------------
+#
+# CUSTOM METRICS
+#
+#------------------------------------------------------------------------------
+custom_metrics.page=Custom Metrics
+custom_metrics.page.description=These metrics are available for all projects. Manual measures can be set at project level via the configuration interface.
+custom_metrics.delete_metric=Delete Metric
+custom_metrics.delete_metric.confirmation=Are you sure you want to delete metric "{0}"?
+custom_metrics.update_metric=Update Metric
+custom_metrics.create_metric=Create Metric
+custom_metrics.domain=Domain
+
+
+#------------------------------------------------------------------------------
+#
+# USERS
+#
+#------------------------------------------------------------------------------
+users.page=Users
+users.page.description=Create and administer individual users.
+users.deactivate=Deactivate
+users.deactivate_user=Deactivate User
+users.deactivate_user.confirmation=Are you sure you want to deactivate "{0} ({1})"?
+users.create_user=Create User
+users.update_user=Update User
+users.minimum_x_characters=Minimum {0} characters
+users.email=Email
+users.update_groups=Update Groups
+users.update_tokens=Update Tokens
+users.add=Add user
+users.remove=Remove user
+users.search_description=Search users by login or name
+users.update=Update users
+users.tokens=Tokens
+users.tokens.sure=Sure?
+users.tokens.revoke=Revoke
+users.no_tokens=No tokens
+users.generate=Generate
+users.generate_tokens=Generate Tokens
+users.enter_token_name=Enter Token Name
+users.tokens.new_token_created=New token "{0}" has been created. Make sure you copy it now, you won’t be able to see it again!
+users.tokens.copied=Copied!
+users.generate_new_token=Generate New Token
+
+
+#------------------------------------------------------------------------------
+#
+# GROUPS
+#
+#------------------------------------------------------------------------------
+user_groups.page=Groups
+user_groups.page.description=Create and administer groups of users.
+user_groups.anyone.description=Anybody (authenticated or not) who browses the application belongs to this group
+groups.delete_group=Delete Group
+groups.delete_group.confirmation=Are you sure you want to delete "{0}"?
+groups.create_group=Create Group
+groups.update_group=Update Group
+groups.anyone=Anyone
+
+
+#------------------------------------------------------------------------------
+#
+# MAINTENANCE
+#
+#------------------------------------------------------------------------------
+maintenance.upgrade_failed=Upgrade Failed
+maintenance.upgrade_failed.text=Database connection cannot be established. Please check database status and JDBC settings.
+maintenance.migration_not_supported=Migration not supported
+maintenance.migration_not_supported.text=Migration is not supported on embedded databases.
+maintenance.upgrade_database=Upgrade Database
+maintenance.upgrade_database.1=The database upgrade can take several minutes.
+maintenance.upgrade_database.2=It is mandatory to back up database before upgrading.
+maintenance.upgrade_database.3=Make sure you have followed the steps from the SonarQube Upgrade guide.
+maintenance.upgrade=Upgrade
+maintenance.database_migration=Database Migration
+maintenance.database_is_up_to_date=Database is up-to-date
+maintenance.sonarqube_is_down=SonarQube is down
+maintenance.sonarqube_is_down.text=Something went wrong. Please contact your system administrator.
+maintenance.try_again=Try Again
+maintenance.sonarqube_is_under_maintenance=SonarQube is under maintenance
+maintenance.sonarqube_is_under_maintenance.1=While waiting, you might want to investigate <a href="https://redirect.sonarsource.com/doc/plugin-library.html">new plugins</a> to extend the current functionality.
+maintenance.sonarqube_is_under_maintenance.2=If you are an administrator and have no idea why this message is being shown, you should read the <a href="https://redirect.sonarsource.com/doc/upgrading.html">upgrade guide</a>.
+maintenance.sonarqube_is_starting=SonarQube is starting
+maintenance.sonarqube_is_up=SonarQube is up
+maintenance.all_systems_opetational=All systems operational.
index 985810e8cb61578e01c81c428de601d9276f4f2a..e310d4c97ff9e361cdabceb041c47ac868da578c 100644 (file)
@@ -156,7 +156,7 @@ public class DefaultI18nTest {
 
   @Test
   public void format_message_with_parameters() {
-    assertThat(underTest.message(Locale.ENGLISH, "name_too_long_x", null, "10")).isEqualTo("Name is too long (maximum is 10 characters)");
+    assertThat(underTest.message(Locale.ENGLISH, "x_results", null, "10")).isEqualTo("10 results");
   }
 
   @Test