]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22361 Update .NET tutorial to be consistent with SonarCloud
authorLucas Paulger <lucas.paulger@sonarsource.com>
Tue, 11 Jun 2024 12:45:10 +0000 (15:45 +0300)
committersonartech <sonartech@sonarsource.com>
Fri, 14 Jun 2024 20:02:40 +0000 (20:02 +0000)
14 files changed:
server/sonar-web/src/main/js/components/tutorials/components/CompilationInfo.tsx
server/sonar-web/src/main/js/components/tutorials/jenkins/__tests__/__snapshots__/JenkinsTutorial-it.tsx.snap
server/sonar-web/src/main/js/components/tutorials/jenkins/buildtool-steps/DotNetCore.tsx
server/sonar-web/src/main/js/components/tutorials/jenkins/buildtool-steps/DotNetFramework.tsx
server/sonar-web/src/main/js/components/tutorials/jenkins/buildtool-steps/DotNetPrereqsScanner.tsx
server/sonar-web/src/main/js/components/tutorials/other/DoneNextSteps.tsx
server/sonar-web/src/main/js/components/tutorials/other/__tests__/DoneNextSteps-it.tsx [new file with mode: 0644]
server/sonar-web/src/main/js/components/tutorials/other/commands/DotNetCore.tsx
server/sonar-web/src/main/js/components/tutorials/other/commands/DotNetExecute.tsx
server/sonar-web/src/main/js/components/tutorials/other/commands/DotNetFramework.tsx
server/sonar-web/src/main/js/components/tutorials/other/commands/ExecScanner.tsx
server/sonar-web/src/main/js/components/tutorials/other/commands/JavaGradle.tsx
server/sonar-web/src/main/js/components/tutorials/other/commands/JavaMaven.tsx
sonar-core/src/main/resources/org/sonar/l10n/core.properties

index 199326e947d1a64b3d279e6a094f9ccd5a2ffbb0..8fb49d3c82f287e9bd501f73b8b7fcb424787d80 100644 (file)
@@ -18,7 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-import { FlagMessage, Link } from 'design-system';
+import { LinkStandalone as Link } from '@sonarsource/echoes-react';
+import { FlagMessage } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { DocLink } from '../../../helpers/doc-links';
index 5dd2df6b18d8507b82c25a98748b1ef9ce190813..e540489c9a73536ba934771adab6ae6e36715a44 100644 (file)
@@ -239,7 +239,7 @@ exports[`bitbucket: can select devops platform and complete all the steps with c
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       sh "dotnet \${scannerHome}/SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       sh "dotnet build"
@@ -276,7 +276,7 @@ exports[`bitbucket: can select devops platform and complete all the steps with c
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "dotnet \${scannerHome}\\\\SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       bat "dotnet build"
@@ -294,7 +294,7 @@ exports[`bitbucket: can select devops platform and complete all the steps with c
   }
   stage('SonarQube Analysis') {
     def msbuildHome = tool 'Default MSBuild'
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "\\"\${scannerHome}\\\\SonarScanner.MSBuild.exe\\" begin /k:\\"my-project\\""
       bat "\\"\${msbuildHome}\\\\MSBuild.exe\\" /t:Rebuild"
@@ -544,7 +544,7 @@ exports[`bitbucketcloud: can select devops platform and complete all the steps w
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       sh "dotnet \${scannerHome}/SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       sh "dotnet build"
@@ -581,7 +581,7 @@ exports[`bitbucketcloud: can select devops platform and complete all the steps w
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "dotnet \${scannerHome}\\\\SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       bat "dotnet build"
@@ -599,7 +599,7 @@ exports[`bitbucketcloud: can select devops platform and complete all the steps w
   }
   stage('SonarQube Analysis') {
     def msbuildHome = tool 'Default MSBuild'
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "\\"\${scannerHome}\\\\SonarScanner.MSBuild.exe\\" begin /k:\\"my-project\\""
       bat "\\"\${msbuildHome}\\\\MSBuild.exe\\" /t:Rebuild"
@@ -849,7 +849,7 @@ exports[`github: can select devops platform and complete all the steps with copy
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       sh "dotnet \${scannerHome}/SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       sh "dotnet build"
@@ -886,7 +886,7 @@ exports[`github: can select devops platform and complete all the steps with copy
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "dotnet \${scannerHome}\\\\SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       bat "dotnet build"
@@ -904,7 +904,7 @@ exports[`github: can select devops platform and complete all the steps with copy
   }
   stage('SonarQube Analysis') {
     def msbuildHome = tool 'Default MSBuild'
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "\\"\${scannerHome}\\\\SonarScanner.MSBuild.exe\\" begin /k:\\"my-project\\""
       bat "\\"\${msbuildHome}\\\\MSBuild.exe\\" /t:Rebuild"
@@ -1154,7 +1154,7 @@ exports[`gitlab: can select devops platform and complete all the steps with copy
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       sh "dotnet \${scannerHome}/SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       sh "dotnet build"
@@ -1191,7 +1191,7 @@ exports[`gitlab: can select devops platform and complete all the steps with copy
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "dotnet \${scannerHome}\\\\SonarScanner.MSBuild.dll begin /k:\\"my-project\\""
       bat "dotnet build"
@@ -1209,7 +1209,7 @@ exports[`gitlab: can select devops platform and complete all the steps with copy
   }
   stage('SonarQube Analysis') {
     def msbuildHome = tool 'Default MSBuild'
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "\\"\${scannerHome}\\\\SonarScanner.MSBuild.exe\\" begin /k:\\"my-project\\""
       bat "\\"\${msbuildHome}\\\\MSBuild.exe\\" /t:Rebuild"
index 61287f945f1e4dda4071cbb1e7b5c9190a5b46f1..111a36ef891a15d0d8050f620829d5aafaf80bb1 100644 (file)
@@ -34,7 +34,7 @@ const jenkinsfileSnippet = (key: string, shell: OSDotNet) => `node {
     checkout scm
   }
   stage('SonarQube Analysis') {
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       ${OSS_DEP[shell].shell} "dotnet \${scannerHome}${OSS_DEP[shell].pathSeparator}SonarScanner.MSBuild.dll begin /k:\\"${key}\\""
       ${OSS_DEP[shell].shell} "dotnet build"
index d16cf1f323d5e75477b68440ce1f107c14b74c11..e4a744adcc4b276746308723cdf01c34771a4f5f 100644 (file)
@@ -30,7 +30,7 @@ const jenkinsfileSnippet = (key: string) => `node {
   }
   stage('SonarQube Analysis') {
     def msbuildHome = tool 'Default MSBuild'
-    def scannerHome = tool 'SonarScanner for MSBuild'
+    def scannerHome = tool 'SonarScanner for .NET'
     withSonarQubeEnv() {
       bat "\\"\${scannerHome}\\\\SonarScanner.MSBuild.exe\\" begin /k:\\"${key}\\""
       bat "\\"\${msbuildHome}\\\\MSBuild.exe\\" /t:Rebuild"
index 1a1469c17337f16365d2b510eaafa8b92be6717a..702613124bfdfc69c213fc4fe07a8dbce27b8d45 100644 (file)
@@ -58,11 +58,8 @@ export default function DotNetPrereqsScanner() {
             highlightKeys={['name']}
             translationKey="onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step3"
           />
-          <InlineSnippet className="sw-ml-1" snippet="SonarScanner for MSBuild" />
-          <ClipboardIconButton
-            className="sw-ml-2 sw-align-sub"
-            copyValue="SonarScanner for MSBuild"
-          />
+          <InlineSnippet className="sw-ml-1" snippet="SonarScanner for .NET" />
+          <ClipboardIconButton className="sw-ml-2 sw-align-sub" copyValue="SonarScanner for .NET" />
         </ListItem>
         <ListItem>
           <SentenceWithHighlights
index f97fca6d662d5c7be09200422b0ec59c306a65b7..141f04dc95e3c9be7fc82f2c13d50751e9227f76 100644 (file)
 
 import styled from '@emotion/styled';
 import { animated, config, useSpring } from '@react-spring/web';
-import { BasicSeparator, FlagVisual, Link } from 'design-system';
+import { LinkStandalone as Link } from '@sonarsource/echoes-react';
+import { BasicSeparator, FlagVisual } from 'design-system';
 import * as React from 'react';
+import { FormattedMessage } from 'react-intl';
+import withAppStateContext from '../../../app/components/app-state/withAppStateContext';
 import { DocLink } from '../../../helpers/doc-links';
 import { useDocUrl } from '../../../helpers/docs';
 import { translate } from '../../../helpers/l10n';
 import useIntersectionObserver from '../../../hooks/useIntersectionObserver';
-import { Component } from '../../../types/types';
+import { AppState } from '../../../types/appstate';
+import { EditionKey } from '../../../types/editions';
 
-export interface DoneNextStepsProps {
-  component: Component;
+export interface Props {
+  appState: AppState;
 }
 
-export default function DoneNextSteps({ component }: DoneNextStepsProps) {
-  const isProjectAdmin = component.configuration?.showSettings;
+function DoneNextSteps({ appState }: Readonly<Props>) {
   const outroRef = React.useRef<HTMLDivElement>(null);
-
+  const hasLicensedEdition = appState.edition && appState.edition !== EditionKey.community;
   const intersectionEntry = useIntersectionObserver(outroRef, { freezeOnceVisible: true });
 
   const outroAnimation = useSpring({
@@ -64,40 +67,69 @@ export default function DoneNextSteps({ component }: DoneNextStepsProps) {
           </strong>
           {translate('onboarding.analysis.auto_refresh_after_analysis.auto_refresh')}
         </p>
-        <p className="sw-mt-4">
-          {isProjectAdmin
-            ? translate(
-                'onboarding.analysis.auto_refresh_after_analysis.set_up_pr_deco_and_ci.admin',
-              )
-            : translate('onboarding.analysis.auto_refresh_after_analysis.set_up_pr_deco_and_ci')}
-        </p>
         <div className="sw-mt-4">
-          <span>
-            {translate('onboarding.analysis.auto_refresh_after_analysis.check_these_links')}
-          </span>
-          <ul className="sw-flex sw-flex-col sw-gap-2 sw-mt-2">
-            <li>
-              <Link to={docUrl(DocLink.BranchAnalysis)}>
-                {translate(
-                  'onboarding.analysis.auto_refresh_after_analysis.check_these_links.branches',
-                )}
-              </Link>
-            </li>
+          {hasLicensedEdition ? (
+            <>
+              <span>
+                {translate('onboarding.analysis.auto_refresh_after_analysis.check_these_links')}
+              </span>
+              <ul className="sw-flex sw-flex-col sw-gap-2 sw-mt-2">
+                <li>
+                  <Link to={docUrl(DocLink.BranchAnalysis)}>
+                    {translate(
+                      'onboarding.analysis.auto_refresh_after_analysis.check_these_links.branches',
+                    )}
+                  </Link>
+                </li>
 
-            <li>
-              <Link to={docUrl(DocLink.PullRequestAnalysis)}>
-                {translate(
-                  'onboarding.analysis.auto_refresh_after_analysis.check_these_links.pr_analysis',
-                )}
-              </Link>
-            </li>
-          </ul>
+                <li>
+                  <Link to={docUrl(DocLink.PullRequestAnalysis)}>
+                    {translate(
+                      'onboarding.analysis.auto_refresh_after_analysis.check_these_links.pr_analysis',
+                    )}
+                  </Link>
+                </li>
+              </ul>
+            </>
+          ) : (
+            <FormattedMessage
+              defaultMessage={translate(
+                'onboarding.analysis.auto_refresh_after_analysis.community.check_these_links',
+              )}
+              id="onboarding.analysis.auto_refresh_after_analysis.community.check_these_links"
+              values={{
+                edition: (
+                  <Link to="https://www.sonarsource.com/plans-and-pricing/developer/">
+                    {translate(
+                      'onboarding.analysis.auto_refresh_after_analysis.community.check_these_links.edition',
+                    )}
+                  </Link>
+                ),
+                branches: (
+                  <Link to={docUrl(DocLink.BranchAnalysis)}>
+                    {translate(
+                      'onboarding.analysis.auto_refresh_after_analysis.check_these_links.branches',
+                    )}
+                  </Link>
+                ),
+                pull_requests: (
+                  <Link to={docUrl(DocLink.PullRequestAnalysis)}>
+                    {translate(
+                      'onboarding.analysis.auto_refresh_after_analysis.check_these_links.pr_analysis',
+                    )}
+                  </Link>
+                ),
+              }}
+            />
+          )}
         </div>
       </StyledDiv>
     </animated.div>
   );
 }
 
+export default withAppStateContext(DoneNextSteps);
+
 const StyledDiv = styled.div`
   width: 840px;
   margin: auto;
diff --git a/server/sonar-web/src/main/js/components/tutorials/other/__tests__/DoneNextSteps-it.tsx b/server/sonar-web/src/main/js/components/tutorials/other/__tests__/DoneNextSteps-it.tsx
new file mode 100644 (file)
index 0000000..eabfd98
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+import React from 'react';
+import { byRole, byText } from '~sonar-aligned/helpers/testSelector';
+import { mockAppState } from '../../../../helpers/testMocks';
+import { renderApp } from '../../../../helpers/testReactTestingUtils';
+import { EditionKey } from '../../../../types/editions';
+import DoneNextSteps from '../DoneNextSteps';
+
+const ui = {
+  analysisDone: byText('onboarding.analysis.auto_refresh_after_analysis.done'),
+  autoRefresh: byText('onboarding.analysis.auto_refresh_after_analysis.auto_refresh'),
+  licensedNextStep: byText('onboarding.analysis.auto_refresh_after_analysis.check_these_links'),
+  communityNextStep: byText(
+    'onboarding.analysis.auto_refresh_after_analysis.community.check_these_links',
+  ),
+  nextStepLinks: byRole('link'),
+};
+
+describe('Community Edition', () => {
+  it('should inform the user about available next steps', async () => {
+    renderDoneNextSteps();
+
+    expect(await ui.analysisDone.find()).toBeInTheDocument();
+    expect(await ui.autoRefresh.find()).toBeInTheDocument();
+    expect(await ui.communityNextStep.find()).toBeInTheDocument();
+    expect(await ui.nextStepLinks.findAll()).toHaveLength(3);
+  });
+});
+
+describe('Licensed Edition', () => {
+  it('should inform the user about available next steps', async () => {
+    renderDoneNextSteps(mockAppState({ edition: EditionKey.enterprise }));
+
+    expect(await ui.analysisDone.find()).toBeInTheDocument();
+    expect(await ui.autoRefresh.find()).toBeInTheDocument();
+    expect(await ui.licensedNextStep.find()).toBeInTheDocument();
+    expect(await ui.nextStepLinks.findAll()).toHaveLength(2);
+  });
+});
+
+function renderDoneNextSteps(appState = mockAppState()) {
+  return renderApp('/', <DoneNextSteps />, { appState });
+}
index c174c50054b197b46849ca42fb5c07a14724b159..c48c32e4dbedea1fb12c103e6da763476d037b33 100644 (file)
@@ -46,7 +46,7 @@ export default function DotNetCore(props: DotNetProps) {
       <FlagMessage className="sw-mt-2" variant="info">
         {translate('onboarding.analysis.dotnetcore.global.text.path')}
       </FlagMessage>
-      <DotNetExecute commands={commands} component={component} />
+      <DotNetExecute commands={commands} />
     </div>
   );
 }
index ca6335d88d2555a9da4772ce260376c0249468fa..feaffb6accbc600cab4fa86a210cc8fdb9578cc1 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-import { CodeSnippet, Link, SubHeading } from 'design-system';
+import { LinkStandalone as Link } from '@sonarsource/echoes-react';
+import { CodeSnippet, SubHeading } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { DocLink } from '../../../../helpers/doc-links';
 import { useDocUrl } from '../../../../helpers/docs';
 import { translate } from '../../../../helpers/l10n';
-import { Component } from '../../../../types/types';
 import InstanceMessage from '../../../common/InstanceMessage';
 import DoneNextSteps from '../DoneNextSteps';
 
 export interface DotNetExecuteProps {
   commands: string[];
-  component: Component;
 }
 
-export default function DotNetExecute({ commands, component }: DotNetExecuteProps) {
+export default function DotNetExecute({ commands }: Readonly<DotNetExecuteProps>) {
   const docUrl = useDocUrl(DocLink.SonarScannerDotNet);
 
   return (
@@ -64,7 +63,7 @@ export default function DotNetExecute({ commands, component }: DotNetExecuteProp
           }}
         />
       </p>
-      <DoneNextSteps component={component} />
+      <DoneNextSteps />
     </>
   );
 }
index fd9ef57f29bd6cdf546501135027da37aa5d4abf..63258d75f16b8f8825925c396a30535c7661ca2a 100644 (file)
@@ -18,7 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-import { Link, SubHeading } from 'design-system';
+import { LinkStandalone as Link } from '@sonarsource/echoes-react';
+import { SubHeading } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { DocLink } from '../../../../helpers/doc-links';
@@ -50,14 +51,15 @@ export default function DotNetFramework(props: DotNetProps) {
             defaultMessage={translate('onboarding.analysis.msbuild.text')}
             id="onboarding.analysis.msbuild.text"
             values={{
-              code: <InlineSnippet snippet="%PATH%" />,
+              code: <InlineSnippet snippet="SonarScanner.MSBuild.exe" />,
+              path: <InlineSnippet snippet="%PATH%" />,
               link: <Link to={docUrl}>{translate('onboarding.analysis.msbuild.docs_link')}</Link>,
             }}
           />
         </p>
       </div>
 
-      <DotNetExecute commands={commands} component={component} />
+      <DotNetExecute commands={commands} />
     </div>
   );
 }
index 5a1d49f1384d4c2c98ab547a59d4dba71c9f1a21..d59b4006abb293c599cd4cb0bd877bc6c6974c0e 100644 (file)
@@ -74,7 +74,7 @@ export default function ExecScanner(props: ExecScannerProps) {
           }}
         />
       </p>
-      <DoneNextSteps component={component} />
+      <DoneNextSteps />
     </div>
   );
 }
index 21270d3a3d8d9fb18adaeb8bfa1ca2c945641f04..b37180da5ada9e818766378b9e92f8325323a155 100644 (file)
@@ -117,7 +117,7 @@ export default function JavaGradle(props: JavaGradleProps) {
           }}
         />
       </p>
-      <DoneNextSteps component={component} />
+      <DoneNextSteps />
     </div>
   );
 }
index 8b51d1b33fab3ceeab4388d27752e680ccc9b712..df8f19ce85ecd19d5e16a8e5c72f723f6327552c 100644 (file)
@@ -64,7 +64,7 @@ export default function JavaMaven(props: JavaMavenProps) {
           }}
         />
       </p>
-      <DoneNextSteps component={component} />
+      <DoneNextSteps />
     </div>
   );
 }
index 92a15722ac3ddd9d4ef0070e2dcc682c71cf30ba..345ead342337a7449e556920ebfe361158626b2f 100644 (file)
@@ -4536,11 +4536,11 @@ onboarding.tutorial.env_variables.token_generator.value=an existing token, or a
 onboarding.analysis.header=Run analysis on your project
 onboarding.analysis.auto_refresh_after_analysis.done=Is my analysis done?
 onboarding.analysis.auto_refresh_after_analysis.auto_refresh=If your analysis is successful, this page will automatically refresh in a few moments.
-onboarding.analysis.auto_refresh_after_analysis.set_up_pr_deco_and_ci.admin=You can set up Pull Request Decoration under the project settings. To set up analysis with your favorite CI tool, see the tutorials.
-onboarding.analysis.auto_refresh_after_analysis.set_up_pr_deco_and_ci=You can request from a project administrator to set up Pull Request Decoration. To set up analysis with your favorite CI tool, see the tutorials.
-onboarding.analysis.auto_refresh_after_analysis.check_these_links=Check these useful links while you wait:
+onboarding.analysis.auto_refresh_after_analysis.check_these_links=While you're waiting, check out these links to learn how to configure Branch Analysis and Pull Request Analysis:
 onboarding.analysis.auto_refresh_after_analysis.check_these_links.pr_analysis=Pull Request Analysis
 onboarding.analysis.auto_refresh_after_analysis.check_these_links.branches=Branch Analysis
+onboarding.analysis.auto_refresh_after_analysis.community.check_these_links=While you're waiting, why not consider upgrading to our {edition}?  It offers additional features such as {branches} and {pull_requests}.
+onboarding.analysis.auto_refresh_after_analysis.community.check_these_links.edition=Developer Edition
 
 onboarding.build=What option best describes your project?
 onboarding.build.maven=Maven
@@ -4554,7 +4554,7 @@ onboarding.build.cpp=C or C++
 onboarding.build.objectivec=Objective-C
 onboarding.build.other=Other (for JS, TS, Go, Python, PHP, ...)
 
-onboarding.build.dotnet.variant=Choose your build tool
+onboarding.build.dotnet.variant=Which framework do you use?
 onboarding.build.dotnet.variant.dotnet_core=.NET Core
 onboarding.build.dotnet.variant.dotnet_framework=.NET Framework
 
@@ -4592,18 +4592,18 @@ onboarding.analysis.java.gradle.text.2=and run the following command:
 onboarding.analysis.java.gradle.latest_version=You can find the latest version of the Gradle plugin {link}.
 onboarding.analysis.java.gradle.docs_link=official documentation of the Scanner for Gradle
 
-onboarding.analysis.msbuild.header=Download and unzip the Scanner for .NET
-onboarding.analysis.msbuild.text=Visit the {link} to download the latest version, and add the executable's directory to the {code} environment variable
-onboarding.analysis.msbuild.execute=Execute the Scanner for .NET
-onboarding.analysis.msbuild.execute.text=Running a {instance} analysis is straighforward. You just need to execute the following commands at the root of your solution.
-onboarding.analysis.msbuild.docs_link=official documentation of the Scanner for .NET
+onboarding.analysis.msbuild.header=Download and unzip the SonarScanner for .NET
+onboarding.analysis.msbuild.text=Visit the {link} to download the latest version for .NET framework. Make sure to add the directory containing {code} to the {path} environment variable.
+onboarding.analysis.msbuild.execute=Execute the SonarScanner for .NET
+onboarding.analysis.msbuild.execute.text=Running a {instance} analysis is straightforward. You just need to execute the following commands at the root of your solution.
+onboarding.analysis.msbuild.docs_link=documentation of the SonarScanner for .NET
 
 onboarding.analysis.sq_scanner.header.linux=Download and unzip the Scanner for Linux
 onboarding.analysis.sq_scanner.header.win=Download and unzip the Scanner for Windows
 onboarding.analysis.sq_scanner.header.mac=Download and unzip the Scanner for macOS
 onboarding.analysis.sq_scanner.text=Visit the {link} to download the latest version, and add the {dir} directory to the {env_var} environment variable
 onboarding.analysis.sq_scanner.execute=Execute the Scanner
-onboarding.analysis.sq_scanner.execute.text=Running a {instance} analysis is straighforward. You just need to execute the following commands in your project's folder.
+onboarding.analysis.sq_scanner.execute.text=Running a {instance} analysis is straightforward. You just need to execute the following commands in your project's folder.
 onboarding.analysis.sq_scanner.execute.text.custom=Run the following commands in your project's folder.
 onboarding.analysis.sq_scanner.docs=Please visit the {link} for more details.
 onboarding.analysis.sq_scanner.docs_use_case=Please visit the {link} for more details, and the {useCaseLink} to know more about this use case.
@@ -4614,7 +4614,7 @@ onboarding.analysis.sq_scanner.sonar_token_env.var_value=Give it the following v
 onboarding.analysis.sqscanner.docs.gradle.title=official documentation of the Scanner for Gradle
 onboarding.analysis.sqscanner.docs.gradle.example_project.title=live Gradle-based example project
 
-onboarding.analysis.dotnetcore.global=Scanner .NET Core Global Tool
+onboarding.analysis.dotnetcore.global=Install the SonarScanner .NET Core Global Tool
 onboarding.analysis.dotnetcore.global.text=As a prerequisite you need to have the sonarscanner tool installed globally using the following command:
 onboarding.analysis.dotnetcore.global.text.path=Make sure dotnet tools folder is in your path. See dotnet global tools documentation for more information.
 
@@ -4939,13 +4939,13 @@ onboarding.tutorial.with.jenkins.dotnet.msbuild.prereqs.step3.sentence.name=Name
 
 
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.title.sentence=Prerequisite: Add a {default_scanner} tool.
-onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.title.sentence.default_scanner=SonarScanner for MSBuild
+onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.title.sentence.default_scanner=SonarScanner for .NET
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.info=This step needs to be done only once per jenkins instance or if you need different scanner versions.
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step1.sentence=In Jenkins, navigate to {path}.
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step1.sentence.path=Manage Jenkins > Global Tool Configuration
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step2.sentence=Under {default_scanner} click on {add_scanner_for_msbuild}.
-onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step2.sentence.default_scanner=SonarScanner for MSBuild
-onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step2.sentence.add_scanner_for_msbuild=Add SonarScanner for MSBuild
+onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step2.sentence.default_scanner=SonarScanner for .NET
+onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step2.sentence.add_scanner_for_msbuild=Add SonarScanner for .NET
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step3.sentence=Choose a {name} that will be used in the last step:
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step3.sentence.name=Name
 onboarding.tutorial.with.jenkins.dotnet.scanner.prereqs.step4.sentence=Check {install_auto}