diff --git a/src/Microsoft.DotNet.Cli.Utils/Command.cs b/src/Microsoft.DotNet.Cli.Utils/Command.cs
index 59918cd4e..3413c1350 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Command.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/Command.cs
@@ -118,7 +118,10 @@ namespace Microsoft.DotNet.Cli.Utils
         public CommandResult Execute()
         {
 
-            Reporter.Verbose.WriteLine($"Running {_process.StartInfo.FileName} {_process.StartInfo.Arguments}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.RunningFileNameArguments,
+                _process.StartInfo.FileName,
+                _process.StartInfo.Arguments));
 
             ThrowIfRunning();
 
@@ -135,7 +138,9 @@ namespace Microsoft.DotNet.Cli.Utils
             {
                 _process.Start();
 
-                Reporter.Verbose.WriteLine($"Process ID: {_process.Id}");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.ProcessId,
+                    _process.Id));
 
                 var taskOut = _stdOut?.BeginRead(_process.StandardOutput);
                 var taskErr = _stdErr?.BeginRead(_process.StandardError);
@@ -148,7 +153,11 @@ namespace Microsoft.DotNet.Cli.Utils
             var exitCode = _process.ExitCode;
 
 #if DEBUG
-            var message = $"< {FormatProcessInfo(_process.StartInfo)} exited with {exitCode} in {sw.ElapsedMilliseconds} ms.";
+            var message = string.Format(
+                LocalizableStrings.ProcessExitedWithCode,
+                FormatProcessInfo(_process.StartInfo),
+                exitCode,
+                sw.ElapsedMilliseconds);
             if (exitCode == 0)
             {
                 Reporter.Verbose.WriteLine(message.Green());
@@ -288,7 +297,9 @@ namespace Microsoft.DotNet.Cli.Utils
         {
             if (_running)
             {
-                throw new InvalidOperationException($"Unable to invoke {memberName} after the command has been run");
+                throw new InvalidOperationException(string.Format(
+                    LocalizableStrings.UnableToInvokeMemberNameAfterCommand,
+                    memberName));
             }
         }
     }
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandParsing/CommandGrammar.cs b/src/Microsoft.DotNet.Cli.Utils/CommandParsing/CommandGrammar.cs
index dfc0d86ee..11c8c0994 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandParsing/CommandGrammar.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandParsing/CommandGrammar.cs
@@ -4,6 +4,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using Microsoft.DotNet.Cli.Utils;
 
 namespace Microsoft.DotNet.Cli.Utils.CommandParsing
 {
@@ -54,7 +55,7 @@ namespace Microsoft.DotNet.Cli.Utils.CommandParsing
             var result = grammar.Parse(cursor);
             if (!result.Remainder.IsEnd)
             {
-                throw new ArgumentException($"Malformed command text '{text}'", nameof(text));
+                throw new ArgumentException(string.Format(LocalizableStrings.MalformedText, nameof(text)));
             }
             return result.Value.ToArray();
         }
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/OutputPathCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/OutputPathCommandResolver.cs
index 33998f0e3..e6f20a660 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/OutputPathCommandResolver.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/OutputPathCommandResolver.cs
@@ -59,7 +59,8 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (!Directory.Exists(buildOutputPath))
             {
-                Reporter.Verbose.WriteLine($"outputpathresolver: {buildOutputPath} does not exist");
+                Reporter.Verbose.WriteLine(
+                    string.Format(LocalizableStrings.BuildOutputPathDoesNotExist, buildOutputPath));
                 return null;
             }
 
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactory.cs
index 827877880..7a0a4a0cf 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactory.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactory.cs
@@ -10,6 +10,8 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class PackagedCommandSpecFactory : IPackagedCommandSpecFactory
     {
+        private const string PackagedCommandSpecFactoryName = "packagedcommandspecfactory";
+
         private Action<string, IList<string>> _addAdditionalArguments;
 
         internal PackagedCommandSpecFactory(Action<string, IList<string>> addAdditionalArguments = null)
@@ -27,14 +29,21 @@ namespace Microsoft.DotNet.Cli.Utils
             string depsFilePath,
             string runtimeConfigPath)
         {
-            Reporter.Verbose.WriteLine($"packagedcommandspecfactory: attempting to find command {commandName} in {toolLibrary.Name}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.AttemptingToFindCommand,
+                PackagedCommandSpecFactoryName,
+                commandName,
+                toolLibrary.Name));
 
             var toolAssembly = toolLibrary?.RuntimeAssemblies
                     .FirstOrDefault(r => Path.GetFileNameWithoutExtension(r.Path) == commandName);
 
             if (toolAssembly == null)
             {
-                Reporter.Verbose.WriteLine($"packagedcommandspecfactory: failed to find toolAssembly for {commandName}");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.FailedToFindToolAssembly,
+                    PackagedCommandSpecFactoryName,
+                    commandName));
 
                 return null;
             }
@@ -43,7 +52,10 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (!File.Exists(commandPath))
             {
-                Reporter.Verbose.WriteLine($"packagedcommandspecfactory: failed to find commandPath {commandPath}");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.FailedToFindCommandPath,
+                    PackagedCommandSpecFactoryName,
+                    commandPath));
 
                 return null;
             }
@@ -57,12 +69,17 @@ namespace Microsoft.DotNet.Cli.Utils
                 runtimeConfigPath);
         }
 
-        private string GetCommandFilePath(string nugetPackagesRoot, LockFileTargetLibrary toolLibrary, LockFileItem runtimeAssembly)
+        private string GetCommandFilePath(
+            string nugetPackagesRoot,
+            LockFileTargetLibrary toolLibrary,
+            LockFileItem runtimeAssembly)
         {
             var packageDirectory = new VersionFolderPathResolver(nugetPackagesRoot)
                 .GetInstallPath(toolLibrary.Name, toolLibrary.Version);
 
-            var filePath = Path.Combine(packageDirectory, PathUtility.GetPathWithDirectorySeparator(runtimeAssembly.Path));
+            var filePath = Path.Combine(
+                packageDirectory,
+                PathUtility.GetPathWithDirectorySeparator(runtimeAssembly.Path));
 
             return filePath;
         }
@@ -107,7 +124,7 @@ namespace Microsoft.DotNet.Cli.Utils
             host = muxer.MuxerPath;
             if (host == null)
             {
-                throw new Exception("Unable to locate dotnet multiplexer");
+                throw new Exception(LocalizableStrings.UnableToLocateDotnetMultiplexer);
             }
 
             arguments.Add("exec");
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
index c4d15c958..212baf607 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PackagedCommandSpecFactoryWithCliRuntime.cs
@@ -30,7 +30,10 @@ namespace Microsoft.DotNet.Cli.Utils
             var preferCliRuntimePath = Path.Combine(packageDirectory, "prefercliruntime");
 
             Reporter.Verbose.WriteLine(
-                $"packagedcommandspecfactory: Looking for prefercliruntime file at `{preferCliRuntimePath}`");
+                string.Format(
+                    LocalizableStrings.LookingForPreferCliRuntimeFile,
+                    "packagedcommandspecfactory",
+                    preferCliRuntimePath));
 
             return File.Exists(preferCliRuntimePath);
         }
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs
index b2a06ec29..600317e3f 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectDependenciesCommandResolver.cs
@@ -10,6 +10,8 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class ProjectDependenciesCommandResolver : ICommandResolver
     {
+        private const string ProjectDependenciesCommandResolverName = "projectdependenciescommandresolver";
+
         private static readonly CommandResolutionStrategy s_commandResolutionStrategy =
             CommandResolutionStrategy.ProjectDependenciesPackage;
 
@@ -36,14 +38,19 @@ namespace Microsoft.DotNet.Cli.Utils
 
         public CommandSpec Resolve(CommandResolverArguments commandResolverArguments)
         {
-            Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: attempting to resolve {commandResolverArguments.CommandName}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.AttemptingToResolve,
+                ProjectDependenciesCommandResolverName,
+                commandResolverArguments.CommandName));
 
             if (commandResolverArguments.Framework == null
                 || commandResolverArguments.ProjectDirectory == null
                 || commandResolverArguments.Configuration == null
                 || commandResolverArguments.CommandName == null)
             {
-                Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: invalid commandResolverArguments");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.InvalidCommandResolverArguments,
+                    ProjectDependenciesCommandResolverName));
 
                 return null;
             }
@@ -79,7 +86,10 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (project == null)
             {
-                Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: Didn't find a matching project {projectDirectory}.");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DidNotFindAMatchingProject,
+                    ProjectDependenciesCommandResolverName,
+                    projectDirectory));
                 return null;
             }
 
@@ -87,7 +97,10 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (!File.Exists(depsFilePath))
             {
-                Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: {depsFilePath} does not exist");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DoesNotExist,
+                    ProjectDependenciesCommandResolverName,
+                    depsFilePath));
                 return null;
             }
 
@@ -95,7 +108,10 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (!File.Exists(runtimeConfigPath))
             {
-                Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: {runtimeConfigPath} does not exist");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DoesNotExist,
+                    ProjectDependenciesCommandResolverName,
+                    runtimeConfigPath));
                 return null;
             }
 
@@ -130,10 +146,15 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (toolLibraries?.Count() > 1)
             {
-                throw new InvalidOperationException($"Ambiguous command name: {commandName}");
+                throw new InvalidOperationException(string.Format(
+                    LocalizableStrings.AmbiguousCommandName,
+                    commandName));
             }
 
-            Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: tool library found {toolLibraries?.Count() > 0}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.ToolLibraryFound,
+                ProjectDependenciesCommandResolverName,
+                toolLibraries?.Count() > 0));
 
             return toolLibraries?.FirstOrDefault();
         }
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs
index fa3a5e054..73e1971a3 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectFactory.cs
@@ -12,6 +12,8 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     internal class ProjectFactory
     {
+        private const string ProjectFactoryName = "projectfactory";
+
         private IEnvironmentProvider _environment;
 
         public ProjectFactory(IEnvironmentProvider environment)
@@ -37,11 +39,17 @@ namespace Microsoft.DotNet.Cli.Utils
                 Path.Combine(AppContext.BaseDirectory, "MSBuild.dll") :
                 msBuildExePath;
 
-            Reporter.Verbose.WriteLine($"projectfactory: MSBUILD_EXE_PATH = {msBuildExePath}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.MSBuildExePath,
+                ProjectFactoryName,
+                msBuildExePath));
 
             string msBuildProjectPath = GetMSBuildProjPath(projectDirectory);
 
-            Reporter.Verbose.WriteLine($"projectfactory: MSBuild project path = {msBuildProjectPath}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.MSBuildProjectPath,
+                ProjectFactoryName,
+                msBuildProjectPath));
             
             if(msBuildProjectPath == null)
             {
@@ -72,8 +80,9 @@ namespace Microsoft.DotNet.Cli.Utils
             }
             else if (projectFiles.Count() > 1)
             {
-                throw new InvalidOperationException(
-                    $"Specify which project file to use because this '{projectDirectory}' contains more than one project file.");
+                throw new InvalidOperationException(string.Format(
+                    LocalizableStrings.MultipleProjectFilesFound,
+                    projectDirectory));
             }
 
             return projectFiles.First();
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs
index 435d2d8a6..9863d9224 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ProjectToolsCommandResolver.cs
@@ -16,6 +16,8 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class ProjectToolsCommandResolver : ICommandResolver
     {
+        private const string ProjectToolsCommandResolverName = "projecttoolscommandresolver";
+
         private static readonly NuGetFramework s_toolPackageFramework = FrameworkConstants.CommonFrameworks.NetCoreApp10;
 
         private static readonly CommandResolutionStrategy s_commandResolutionStrategy =
@@ -44,7 +46,9 @@ namespace Microsoft.DotNet.Cli.Utils
             if (commandResolverArguments.CommandName == null
                 || commandResolverArguments.ProjectDirectory == null)
             {
-                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: Invalid CommandResolverArguments");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.InvalidCommandResolverArguments,
+                    ProjectToolsCommandResolverName));
 
                 return null;
             }
@@ -65,7 +69,8 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (project == null)
             {
-                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: ProjectFactory did not find Project.");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DidNotFindProject, ProjectToolsCommandResolverName));
 
                 return null;
             }
@@ -85,7 +90,10 @@ namespace Microsoft.DotNet.Cli.Utils
             IEnumerable<string> args,
             IProject project)
         {
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: resolving commandspec from {toolsLibraries.Count()} Tool Libraries.");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.ResolvingCommandSpec,
+                ProjectToolsCommandResolverName,
+                toolsLibraries.Count()));
 
             foreach (var toolLibrary in toolsLibraries)
             {
@@ -101,7 +109,9 @@ namespace Microsoft.DotNet.Cli.Utils
                 }
             }
 
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: failed to resolve commandspec from library.");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.FailedToResolveCommandSpec,
+                ProjectToolsCommandResolverName));
 
             return null;
         }
@@ -112,17 +122,26 @@ namespace Microsoft.DotNet.Cli.Utils
             IEnumerable<string> args,
             IProject project)
         {
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: Attempting to resolve command spec from tool {toolLibraryRange.Name}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.AttemptingToResolveCommandSpec,
+                ProjectToolsCommandResolverName,
+                toolLibraryRange.Name));
 
             var nuGetPathContext = NuGetPathContext.Create(project.ProjectRoot);
 
             var nugetPackagesRoot = nuGetPathContext.UserPackageFolder;
 
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: nuget packages root:\n{nugetPackagesRoot}"); 
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.NuGetPackagesRoot,
+                ProjectToolsCommandResolverName,
+                nugetPackagesRoot));
 
             var toolLockFile = GetToolLockFile(toolLibraryRange, nugetPackagesRoot);
 
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: found tool lockfile at : {toolLockFile.Path}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.FoundToolLockFile,
+                ProjectToolsCommandResolverName,
+                toolLockFile.Path));
 
             var toolLibrary = toolLockFile.Targets
                 .FirstOrDefault(
@@ -131,7 +150,9 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (toolLibrary == null)
             {
-                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: library not found in lock file.");  
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.LibraryNotFoundInLockFile,
+                    ProjectToolsCommandResolverName));
 
                 return null;
             }
@@ -142,7 +163,9 @@ namespace Microsoft.DotNet.Cli.Utils
 
             var normalizedNugetPackagesRoot = PathUtility.EnsureNoTrailingDirectorySeparator(nugetPackagesRoot);
 
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: attempting to create commandspec");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.AttemptingToCreateCommandSpec,
+                ProjectToolsCommandResolverName));
 
             var commandSpec = _packagedCommandSpecFactory.CreateCommandSpecFromLibrary(
                     toolLibrary,
@@ -156,7 +179,9 @@ namespace Microsoft.DotNet.Cli.Utils
 
             if (commandSpec == null)
             {
-                Reporter.Verbose.WriteLine($"projecttoolscommandresolver: commandSpec is null.");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.CommandSpecIsNull,
+                    ProjectToolsCommandResolverName));
             }
 
             commandSpec?.AddEnvironmentVariablesFromProject(project);
@@ -212,7 +237,9 @@ namespace Microsoft.DotNet.Cli.Utils
                 depsPathRoot,
                 toolLibrary.Name + FileNameSuffixes.DepsJson);
 
-            Reporter.Verbose.WriteLine($"projecttoolscommandresolver: expect deps.json at: {depsJsonPath}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.ExpectDepsJsonAt,
+                depsJsonPath));
 
             EnsureToolJsonDepsFileExists(toolLockFile, depsJsonPath, toolLibrary);
 
@@ -235,7 +262,9 @@ namespace Microsoft.DotNet.Cli.Utils
             string depsPath,
             SingleProjectInfo toolLibrary)
         {
-            Reporter.Verbose.WriteLine($"Generating deps.json at: {depsPath}");
+            Reporter.Verbose.WriteLine(string.Format(
+                LocalizableStrings.GeneratingDepsJson,
+                depsPath));
 
             var dependencyContext = new DepsJsonBuilder()
                 .Build(toolLibrary, null, toolLockFile, s_toolPackageFramework, null);
@@ -254,7 +283,9 @@ namespace Microsoft.DotNet.Cli.Utils
             }
             catch (Exception e)
             {
-                Reporter.Verbose.WriteLine($"unable to generate deps.json, it may have been already generated: {e.Message}");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.UnableToGenerateDepsJson,
+                    e.Message));
                 
                 try
                 {
@@ -262,7 +293,9 @@ namespace Microsoft.DotNet.Cli.Utils
                 }
                 catch (Exception e2)
                 {
-                    Reporter.Verbose.WriteLine($"unable to delete temporary deps.json file: {e2.Message}");
+                    Reporter.Verbose.WriteLine(string.Format(
+                        LocalizableStrings.UnableToDeleteTemporaryDepsJson,
+                        e2.Message));
                 }
             }
         }
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishPathCommandSpecFactory.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishPathCommandSpecFactory.cs
index 4de59a1eb..c3b3e1a31 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishPathCommandSpecFactory.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishPathCommandSpecFactory.cs
@@ -59,7 +59,7 @@ namespace Microsoft.DotNet.Cli.Utils
             var host = muxer.MuxerPath;
             if (host == null)
             {
-                throw new Exception("Unable to locate dotnet multiplexer");
+                throw new Exception(LocalizableStrings.UnableToLocateDotnetMultiplexer);
             }
 
             arguments.Add("exec");
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishedPathCommandResolver.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishedPathCommandResolver.cs
index eda1e99e1..0b17a73aa 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishedPathCommandResolver.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/PublishedPathCommandResolver.cs
@@ -7,6 +7,8 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class PublishedPathCommandResolver : ICommandResolver
     {
+        private const string PublishedPathCommandResolverName = "PublishedPathCommandResolver";
+
         private readonly IEnvironmentProvider _environment;
         private readonly IPublishedPathCommandSpecFactory _commandSpecFactory;
 
@@ -39,14 +41,20 @@ namespace Microsoft.DotNet.Cli.Utils
             var depsFilePath = Path.Combine(publishDirectory, $"{applicationName}.deps.json");
             if (!File.Exists(depsFilePath))
             {
-                Reporter.Verbose.WriteLine($"PublishedPathCommandResolver: {depsFilePath} does not exist");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DoesNotExist,
+                    PublishedPathCommandResolverName,
+                    depsFilePath));
                 return null;
             }
 
             var runtimeConfigPath = Path.Combine(publishDirectory, $"{applicationName}.runtimeconfig.json");
             if (!File.Exists(runtimeConfigPath))
             {
-                Reporter.Verbose.WriteLine($"projectdependenciescommandresolver: {runtimeConfigPath} does not exist");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DoesNotExist,
+                    PublishedPathCommandResolverName,
+                    runtimeConfigPath));
                 return null;
             }
 
@@ -62,7 +70,10 @@ namespace Microsoft.DotNet.Cli.Utils
         {
             if (!Directory.Exists(publishDirectory))
             {
-                Reporter.Verbose.WriteLine($"publishedpathresolver: {publishDirectory} does not exist");
+                Reporter.Verbose.WriteLine(string.Format(
+                    LocalizableStrings.DoesNotExist,
+                    PublishedPathCommandResolverName,
+                    publishDirectory));
                 return null;
             }
 
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ToolPathCalculator.cs b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ToolPathCalculator.cs
index 9221a36eb..770e3e579 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ToolPathCalculator.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandResolution/ToolPathCalculator.cs
@@ -35,7 +35,9 @@ namespace Microsoft.DotNet.Cli.Utils
             var bestVersion = versionRange.FindBestMatch(availableToolVersions);
             if (bestVersion == null)
             {
-                throw new GracefulException($"Version for package `{packageId}` could not be resolved.");
+                throw new GracefulException(string.Format(
+                    LocalizableStrings.VersionForPackageCouldNotBeResolved,
+                    packageId));
             }
 
             return GetLockFilePath(packageId, bestVersion, framework);
diff --git a/src/Microsoft.DotNet.Cli.Utils/CommandUnknownException.cs b/src/Microsoft.DotNet.Cli.Utils/CommandUnknownException.cs
index d3d6fa988..6a27faae2 100644
--- a/src/Microsoft.DotNet.Cli.Utils/CommandUnknownException.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/CommandUnknownException.cs
@@ -8,11 +8,17 @@ namespace Microsoft.DotNet.Cli.Utils
         {
         }
 
-        public CommandUnknownException(string commandName) : base($"No executable found matching command \"{commandName}\"")
+        public CommandUnknownException(string commandName) : base(string.Format(
+            LocalizableStrings.NoExecutableFoundMatchingCommand,
+            commandName))
         {
         }
 
-        public CommandUnknownException(string commandName, Exception innerException) : base($"No executable found matching command \"{commandName}\"", innerException)
+        public CommandUnknownException(string commandName, Exception innerException) : base(
+            string.Format(
+                LocalizableStrings.NoExecutableFoundMatchingCommand,
+                commandName),
+            innerException)
         {
         }
     }
diff --git a/src/Microsoft.DotNet.Cli.Utils/DebugHelper.cs b/src/Microsoft.DotNet.Cli.Utils/DebugHelper.cs
index 1675e83ab..03610371f 100644
--- a/src/Microsoft.DotNet.Cli.Utils/DebugHelper.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/DebugHelper.cs
@@ -21,8 +21,8 @@ namespace Microsoft.DotNet.Cli.Utils
 
         public static void WaitForDebugger()
         {
-            Console.WriteLine("Waiting for debugger to attach. Press ENTER to continue");
-            Console.WriteLine($"Process ID: {Process.GetCurrentProcess().Id}");
+            Console.WriteLine(LocalizableStrings.WaitingForDebuggerToAttach);
+            Console.WriteLine(string.Format(LocalizableStrings.ProcessId, Process.GetCurrentProcess().Id));
             Console.ReadLine();
         }
     }
diff --git a/src/Microsoft.DotNet.Cli.Utils/Extensions/LockFileFormatExtensions.cs b/src/Microsoft.DotNet.Cli.Utils/Extensions/LockFileFormatExtensions.cs
index 01eafe3d9..4200854e3 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Extensions/LockFileFormatExtensions.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/Extensions/LockFileFormatExtensions.cs
@@ -24,8 +24,8 @@ namespace Microsoft.DotNet.Cli.Utils
             {
                 throw new GracefulException(string.Join(
                     Environment.NewLine,
-                    $"File not found `{path}`.",
-                    "The project may not have been restored or restore failed - run `dotnet restore`"));
+                    string.Format(LocalizableStrings.FileNotFound, path),
+                    LocalizableStrings.ProjectNotRestoredOrRestoreFailed));
             }
 
             return await ConcurrencyUtilities.ExecuteWithFileLockedAsync(
diff --git a/src/Microsoft.DotNet.Cli.Utils/FileAccessRetryer.cs b/src/Microsoft.DotNet.Cli.Utils/FileAccessRetryer.cs
index 8e0608983..f73d5d4d1 100644
--- a/src/Microsoft.DotNet.Cli.Utils/FileAccessRetryer.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/FileAccessRetryer.cs
@@ -22,7 +22,7 @@ namespace Microsoft.DotNet.Cli.Utils
             {
                 if (attemptsLeft < 1)
                 {
-                    throw new InvalidOperationException("Could not access assets file.");
+                    throw new InvalidOperationException(LocalizableStrings.CouldNotAccessAssetsFile);
                 }
 
                 attemptsLeft--;
diff --git a/src/Microsoft.DotNet.Cli.Utils/LocalizableStrings.cs b/src/Microsoft.DotNet.Cli.Utils/LocalizableStrings.cs
new file mode 100644
index 000000000..ff4bf329b
--- /dev/null
+++ b/src/Microsoft.DotNet.Cli.Utils/LocalizableStrings.cs
@@ -0,0 +1,89 @@
+namespace Microsoft.DotNet.Cli.Utils
+{
+    internal class LocalizableStrings
+    {
+        public const string MalformedText = "Malformed command text '{0}'";
+
+        public const string BuildOutputPathDoesNotExist = "outputpathresolver: {0} does not exist";
+
+        public const string AttemptingToFindCommand = "{0}: attempting to find command {1} in {2}";
+
+        public const string FailedToFindToolAssembly = "{0}: failed to find toolAssembly for {1}";
+
+        public const string FailedToFindCommandPath = "{0}: failed to find commandPath {1}";
+
+        public const string UnableToLocateDotnetMultiplexer = "Unable to locate dotnet multiplexer";
+
+        public const string LookingForPreferCliRuntimeFile = "{0}: Looking for prefercliruntime file at `{1}`";
+
+        public const string AttemptingToResolve = "{0}: attempting to resolve {1}";
+
+        public const string DidNotFindAMatchingProject = "{0}: Did not find a matching project {1}.";
+
+        public const string InvalidCommandResolverArguments = "{0}: invalid commandResolverArguments";
+
+        public const string DoesNotExist = "{0}: {1} does not exist";
+
+        public const string AmbiguousCommandName = "Ambiguous command name: {0}";
+
+        public const string ToolLibraryFound = "{0}: tool library found {1}";
+
+        public const string MSBuildExePath = "{0}: MSBUILD_EXE_PATH = {1}";
+
+        public const string MSBuildProjectPath = "{0}: MSBuild project path = {1}";
+
+        public const string MultipleProjectFilesFound = "Specify which project file to use because this '{0}' contains more than one project file.";
+
+        public const string DidNotFindProject = "{0}: ProjectFactory did not find Project.";
+
+        public const string ResolvingCommandSpec = "{0}: resolving commandspec from {1} Tool Libraries.";
+
+        public const string FailedToResolveCommandSpec = "{0}: failed to resolve commandspec from library.";
+
+        public const string AttemptingToResolveCommandSpec = "{0}: Attempting to resolve command spec from tool {1}";
+
+        public const string NuGetPackagesRoot = "{0}: nuget packages root:\n{1}";
+
+        public const string FoundToolLockFile = "{0}: found tool lockfile at : {1}";
+
+        public const string LibraryNotFoundInLockFile = "{0}: library not found in lock file.";
+
+        public const string AttemptingToCreateCommandSpec = "{0}: attempting to create commandspec";
+
+        public const string CommandSpecIsNull = "{0}: commandSpec is null.";
+
+        public const string ExpectDepsJsonAt = "{0}: expect deps.json at: {1}";
+
+        public const string GeneratingDepsJson = "Generating deps.json at: {0}";
+
+        public const string UnableToGenerateDepsJson = "unable to generate deps.json, it may have been already generated: {0}";
+
+        public const string UnableToDeleteTemporaryDepsJson = "unable to delete temporary deps.json file: {0}";
+
+        public const string VersionForPackageCouldNotBeResolved = "Version for package `{0}` could not be resolved.";
+
+        public const string FileNotFound = "File not found `{0}`.";
+
+        public const string ProjectNotRestoredOrRestoreFailed = "The project may not have been restored or restore failed - run `dotnet restore`";
+
+        public const string NoExecutableFoundMatchingCommand = "No executable found matching command \"{0}\"";
+
+        public const string WaitingForDebuggerToAttach = "Waiting for debugger to attach. Press ENTER to continue";
+
+        public const string ProcessId = "Process ID: {0}";
+
+        public const string CouldNotAccessAssetsFile = "Could not access assets file.";
+
+        public const string DotNetCommandLineTools = ".NET Command Line Tools";
+
+        public const string WriteLineForwarderSetPreviously = "WriteLine forwarder set previously";
+
+        public const string AlreadyCapturingStream = "Already capturing stream!";
+
+        public const string RunningFileNameArguments = "Running {0} {1}";
+
+        public const string ProcessExitedWithCode = "< {0} exited with {1} in {2} ms.";
+
+        public const string UnableToInvokeMemberNameAfterCommand = "Unable to invoke {0} after the command has been run";
+    }
+}
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Cli.Utils/Muxer.cs b/src/Microsoft.DotNet.Cli.Utils/Muxer.cs
index 30ee770de..700e8daac 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Muxer.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/Muxer.cs
@@ -26,7 +26,7 @@ namespace Microsoft.DotNet.Cli.Utils
             {
                 if (_muxerPath == null)
                 {
-                    throw new InvalidOperationException("Unable to locate dotnet multiplexer");
+                    throw new InvalidOperationException(LocalizableStrings.UnableToLocateDotnetMultiplexer);
                 }
                 return _muxerPath;
             }
diff --git a/src/Microsoft.DotNet.Cli.Utils/Product.cs b/src/Microsoft.DotNet.Cli.Utils/Product.cs
index 7fe41776c..4c35c3bd3 100644
--- a/src/Microsoft.DotNet.Cli.Utils/Product.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/Product.cs
@@ -4,12 +4,15 @@ namespace Microsoft.DotNet.Cli.Utils
 {
     public class Product
     {
-        public static readonly string LongName = ".NET Command Line Tools";
+        public static readonly string LongName = LocalizableStrings.DotNetCommandLineTools;
         public static readonly string Version = GetProductVersion();
 
         private static string GetProductVersion()
         {
-            var attr = typeof(Product).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();
+            var attr = typeof(Product)
+                .GetTypeInfo()
+                .Assembly
+                .GetCustomAttribute<AssemblyInformationalVersionAttribute>();
             return attr?.InformationalVersion;
         }
     }
diff --git a/src/Microsoft.DotNet.Cli.Utils/StreamForwarder.cs b/src/Microsoft.DotNet.Cli.Utils/StreamForwarder.cs
index aa16cb209..654b9e754 100644
--- a/src/Microsoft.DotNet.Cli.Utils/StreamForwarder.cs
+++ b/src/Microsoft.DotNet.Cli.Utils/StreamForwarder.cs
@@ -118,7 +118,7 @@ namespace Microsoft.DotNet.Cli.Utils
         {
             if (_writeLine != null)
             {
-                throw new InvalidOperationException("WriteLine forwarder set previously");
+                throw new InvalidOperationException(LocalizableStrings.WriteLineForwarderSetPreviously);
             }
         }
 
@@ -126,7 +126,7 @@ namespace Microsoft.DotNet.Cli.Utils
         {
             if (_capture != null)
             {
-                throw new InvalidOperationException("Already capturing stream!");
+                throw new InvalidOperationException(LocalizableStrings.AlreadyCapturingStream);
             }
         }
     }