Skip to content

Commit 00fb609

Browse files
Wrap pending user visible content with localizer routines (#325)
This commit surrounds user visible content with localization routines and fixes #298
1 parent a63d168 commit 00fb609

40 files changed

+28870
-606
lines changed

cmd/modern/root.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/microsoft/go-sqlcmd/cmd/modern/root"
1010
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1111
"github.com/microsoft/go-sqlcmd/internal/config"
12+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1213
)
1314

1415
// Root type implements the very top-level command for sqlcmd (which contains
@@ -36,18 +37,19 @@ func (c *Root) DefineCommand(...cmdparser.CommandOptions) {
3637
steps = append(steps, "sqlcmd delete")
3738

3839
examples := []cmdparser.ExampleOptions{
39-
{Description: "Install/Create, Query, Uninstall SQL Server",
40+
{Description: localizer.Sprintf("Install/Create, Query, Uninstall SQL Server"),
4041
Steps: steps},
41-
{Description: "View configuration information and connection strings",
42+
{Description: localizer.Sprintf("View configuration information and connection strings"),
4243
Steps: []string{"sqlcmd config view", "sqlcmd config cs"}},
4344
}
4445

46+
const feedbackUrl = "https://github.com/microsoft/go-sqlcmd/issues/new"
4547
commandOptions := cmdparser.CommandOptions{
4648
Use: "sqlcmd",
47-
Short: `sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools
49+
Short: localizer.Sprintf(`sqlcmd: Install/Create/Query SQL Server, Azure SQL, and Tools
4850
4951
Feedback:
50-
https://github.com/microsoft/go-sqlcmd/issues/new`,
52+
%s`, feedbackUrl),
5153
SubCommands: c.SubCommands(),
5254
Examples: examples,
5355
}
@@ -102,7 +104,7 @@ func (c *Root) addGlobalFlags() {
102104
Bool: &unused,
103105
Name: "?",
104106
Shorthand: "?",
105-
Usage: "help for backwards compatibility flags (-S, -U, -E etc.)",
107+
Usage: localizer.Sprintf("help for backwards compatibility flags (-S, -U, -E etc.)"),
106108
})
107109

108110
// BUG(stuartpa): - This is a temporary flag until we have migrated
@@ -111,14 +113,14 @@ func (c *Root) addGlobalFlags() {
111113
c.AddFlag(cmdparser.FlagOptions{
112114
Bool: &unused,
113115
Name: "version",
114-
Usage: "print version of sqlcmd",
116+
Usage: localizer.Sprintf("print version of sqlcmd"),
115117
})
116118

117119
c.AddFlag(cmdparser.FlagOptions{
118120
String: &c.configFilename,
119121
DefaultString: config.DefaultFileName(),
120122
Name: "sqlconfig",
121-
Usage: "configuration file",
123+
Usage: localizer.Sprintf("configuration file"),
122124
})
123125

124126
/* BUG(stuartpa): - At the moment this is a top level flag, but it doesn't
@@ -136,6 +138,6 @@ func (c *Root) addGlobalFlags() {
136138
Int: (*int)(&c.loggingLevel),
137139
DefaultInt: 2,
138140
Name: "verbosity",
139-
Usage: "log level, error=0, warn=1, info=2, debug=3, trace=4",
141+
Usage: localizer.Sprintf("log level, error=0, warn=1, info=2, debug=3, trace=4"),
140142
})
141143
}

cmd/modern/root/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ package root
55

66
import (
77
"fmt"
8+
89
"github.com/microsoft/go-sqlcmd/cmd/modern/root/config"
910
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
11+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1012
"github.com/microsoft/go-sqlcmd/internal/pal"
1113
)
1214

@@ -20,11 +22,11 @@ type Config struct {
2022
func (c *Config) DefineCommand(...cmdparser.CommandOptions) {
2123
options := cmdparser.CommandOptions{
2224
Use: "config",
23-
Short: `Modify sqlconfig files using subcommands like "sqlcmd config use-context mssql"`,
25+
Short: localizer.Sprintf(`Modify sqlconfig files using subcommands like "%s"`, localizer.UseContextCommand),
2426
SubCommands: c.SubCommands(),
2527
Examples: []cmdparser.ExampleOptions{
2628
{
27-
Description: "Add context for existing endpoint and user (use SQLCMD_PASSWORD or SQLCMDPASSWORD)",
29+
Description: localizer.Sprintf("Add context for existing endpoint and user (use %s or %s)", localizer.PasswordEnvVar, localizer.PasswordEnvVar2),
2830
Steps: []string{
2931
fmt.Sprintf("%s SQLCMD_PASSWORD=<placeholderpassword>", pal.CreateEnvVarKeyword()),
3032
"sqlcmd config add-user --name sa1434 --username sa",

cmd/modern/root/config/add-context.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/microsoft/go-sqlcmd/cmd/modern/sqlconfig"
1010
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1111
"github.com/microsoft/go-sqlcmd/internal/config"
12+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1213
)
1314

1415
// AddContext implements the `sqlcmd config add-context` command
@@ -23,10 +24,10 @@ type AddContext struct {
2324
func (c *AddContext) DefineCommand(...cmdparser.CommandOptions) {
2425
options := cmdparser.CommandOptions{
2526
Use: "add-context",
26-
Short: "Add a context",
27+
Short: localizer.Sprintf("Add a context"),
2728
Examples: []cmdparser.ExampleOptions{
2829
{
29-
Description: "Add a context for a local instance of SQL Server on port 1433 using trusted authentication",
30+
Description: localizer.Sprintf("Add a context for a local instance of SQL Server on port 1433 using trusted authentication"),
3031
Steps: []string{
3132
"sqlcmd config add-endpoint --name localhost-1433",
3233
"sqlcmd config add-context --name mssql --endpoint localhost-1433"}},
@@ -39,17 +40,17 @@ func (c *AddContext) DefineCommand(...cmdparser.CommandOptions) {
3940
String: &c.name,
4041
Name: "name",
4142
DefaultString: "context",
42-
Usage: "Display name for the context"})
43+
Usage: localizer.Sprintf("Display name for the context")})
4344

4445
c.AddFlag(cmdparser.FlagOptions{
4546
String: &c.endpointName,
4647
Name: "endpoint",
47-
Usage: "Name of endpoint this context will use"})
48+
Usage: localizer.Sprintf("Name of endpoint this context will use")})
4849

4950
c.AddFlag(cmdparser.FlagOptions{
5051
String: &c.userName,
5152
Name: "user",
52-
Usage: "Name of user this context will use"})
53+
Usage: localizer.Sprintf("Name of user this context will use")})
5354
}
5455

5556
// run adds a context to the configuration and sets it as the current context. The
@@ -69,27 +70,27 @@ func (c *AddContext) run() {
6970

7071
if c.endpointName == "" || !config.EndpointExists(c.endpointName) {
7172
output.FatalfWithHintExamples([][]string{
72-
{"View existing endpoints to choose from", "sqlcmd config get-endpoints"},
73-
{"Add a new local endpoint", "sqlcmd create"},
74-
{"Add an already existing endpoint", "sqlcmd config add-endpoint --address localhost --port 1433"}},
75-
"Endpoint required to add context. Endpoint '%v' does not exist. Use --endpoint flag", c.endpointName)
73+
{localizer.Sprintf("View existing endpoints to choose from"), "sqlcmd config get-endpoints"},
74+
{localizer.Sprintf("Add a new local endpoint"), "sqlcmd create"},
75+
{localizer.Sprintf("Add an already existing endpoint"), "sqlcmd config add-endpoint --address localhost --port 1433"}},
76+
localizer.Sprintf("Endpoint required to add context. Endpoint '%v' does not exist. Use %s flag", c.endpointName, localizer.EndpointFlag))
7677
}
7778

7879
if c.userName != "" {
7980
if !config.UserNameExists(c.userName) {
8081
output.FatalfWithHintExamples([][]string{
81-
{"View list of users", "sqlcmd config get-users"},
82-
{"Add the user", fmt.Sprintf("sqlcmd config add-user --name %v", c.userName)},
83-
{"Add an endpoint", "sqlcmd create"}},
84-
"User '%v' does not exist", c.userName)
82+
{localizer.Sprintf("View list of users"), "sqlcmd config get-users"},
83+
{localizer.Sprintf("Add the user"), fmt.Sprintf("sqlcmd config add-user --name %v", c.userName)},
84+
{localizer.Sprintf("Add an endpoint"), "sqlcmd create"}},
85+
localizer.Sprintf("User '%v' does not exist", c.userName))
8586
}
8687
}
8788

8889
context.Name = config.AddContext(context)
8990
config.SetCurrentContextName(context.Name)
9091
output.InfofWithHintExamples([][]string{
91-
{"Open in Azure Data Studio", "sqlcmd open ads"},
92-
{"To start interactive query session", "sqlcmd query"},
93-
{"To run a query", "sqlcmd query \"SELECT @@version\""},
94-
}, "Current Context '%v'", context.Name)
92+
{localizer.Sprintf("Open in Azure Data Studio"), "sqlcmd open ads"},
93+
{localizer.Sprintf("To start interactive query session"), "sqlcmd query"},
94+
{localizer.Sprintf("To run a query"), "sqlcmd query \"SELECT @@version\""},
95+
}, localizer.Sprintf("Current Context '%v'", context.Name))
9596
}

cmd/modern/root/config/add-endpoint.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ package config
55

66
import (
77
"fmt"
8+
89
"github.com/microsoft/go-sqlcmd/cmd/modern/sqlconfig"
910

1011
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1112
"github.com/microsoft/go-sqlcmd/internal/config"
13+
"github.com/microsoft/go-sqlcmd/internal/localizer"
1214
)
1315

1416
// AddEndpoint implements the `sqlcmd config add-endpoint` command
@@ -23,10 +25,10 @@ type AddEndpoint struct {
2325
func (c *AddEndpoint) DefineCommand(...cmdparser.CommandOptions) {
2426
options := cmdparser.CommandOptions{
2527
Use: "add-endpoint",
26-
Short: "Add an endpoint",
28+
Short: localizer.Sprintf("Add an endpoint"),
2729
Examples: []cmdparser.ExampleOptions{
2830
{
29-
Description: "Add a default endpoint",
31+
Description: localizer.Sprintf("Add a default endpoint"),
3032
Steps: []string{"sqlcmd config add-endpoint --name my-endpoint --address localhost --port 1433"},
3133
},
3234
},
@@ -38,21 +40,21 @@ func (c *AddEndpoint) DefineCommand(...cmdparser.CommandOptions) {
3840
String: &c.name,
3941
Name: "name",
4042
DefaultString: "endpoint",
41-
Usage: "Display name for the endpoint",
43+
Usage: localizer.Sprintf("Display name for the endpoint"),
4244
})
4345

4446
c.AddFlag(cmdparser.FlagOptions{
4547
String: &c.address,
4648
Name: "address",
4749
DefaultString: "localhost",
48-
Usage: "The network address to connect to, e.g. 127.0.0.1 etc.",
50+
Usage: localizer.Sprintf("The network address to connect to, e.g. 127.0.0.1 etc."),
4951
})
5052

5153
c.AddFlag(cmdparser.FlagOptions{
5254
Int: &c.port,
5355
Name: "port",
5456
DefaultInt: 1433,
55-
Usage: "The network port to connect to, e.g. 1433 etc.",
57+
Usage: localizer.Sprintf("The network port to connect to, e.g. 1433 etc."),
5658
})
5759
}
5860

@@ -73,11 +75,11 @@ func (c *AddEndpoint) run() {
7375

7476
uniqueEndpointName := config.AddEndpoint(endpoint)
7577
output.InfofWithHintExamples([][]string{
76-
{"Add a context for this endpoint", fmt.Sprintf("sqlcmd config add-context --endpoint %v", uniqueEndpointName)},
77-
{"View endpoint names", "sqlcmd config get-endpoints"},
78-
{"View endpoint details", fmt.Sprintf("sqlcmd config get-endpoints %v", uniqueEndpointName)},
79-
{"View all endpoints details", "sqlcmd config get-endpoints --detailed"},
80-
{"Delete this endpoint", fmt.Sprintf("sqlcmd config delete-endpoint %v", uniqueEndpointName)},
78+
{localizer.Sprintf("Add a context for this endpoint"), fmt.Sprintf("sqlcmd config add-context --endpoint %v", uniqueEndpointName)},
79+
{localizer.Sprintf("View endpoint names"), "sqlcmd config get-endpoints"},
80+
{localizer.Sprintf("View endpoint details"), fmt.Sprintf("sqlcmd config get-endpoints %v", uniqueEndpointName)},
81+
{localizer.Sprintf("View all endpoints details"), "sqlcmd config get-endpoints --detailed"},
82+
{localizer.Sprintf("Delete this endpoint"), fmt.Sprintf("sqlcmd config delete-endpoint %v", uniqueEndpointName)},
8183
},
82-
"Endpoint '%v' added (address: '%v', port: '%v')", uniqueEndpointName, c.address, c.port)
84+
localizer.Sprintf("Endpoint '%v' added (address: '%v', port: '%v')", uniqueEndpointName, c.address, c.port))
8385
}

cmd/modern/root/config/add-user.go

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ package config
55

66
import (
77
"fmt"
8-
"github.com/microsoft/go-sqlcmd/cmd/modern/sqlconfig"
9-
"github.com/microsoft/go-sqlcmd/internal/pal"
108
"os"
119
"runtime"
1210

11+
"github.com/microsoft/go-sqlcmd/cmd/modern/sqlconfig"
12+
"github.com/microsoft/go-sqlcmd/internal/localizer"
13+
"github.com/microsoft/go-sqlcmd/internal/pal"
14+
1315
"github.com/microsoft/go-sqlcmd/internal/cmdparser"
1416
"github.com/microsoft/go-sqlcmd/internal/config"
1517
"github.com/microsoft/go-sqlcmd/internal/secret"
@@ -28,15 +30,15 @@ type AddUser struct {
2830
func (c *AddUser) DefineCommand(...cmdparser.CommandOptions) {
2931
examples := []cmdparser.ExampleOptions{
3032
{
31-
Description: "Add a user (using the SQLCMD_PASSWORD environment variable)",
33+
Description: localizer.Sprintf("Add a user (using the SQLCMD_PASSWORD environment variable)"),
3234
Steps: []string{
3335
fmt.Sprintf(`%s SQLCMD_PASSWORD=<placeholderpassword>`, pal.CreateEnvVarKeyword()),
3436
"sqlcmd config add-user --name my-user --username user1 --password-encryption none",
3537
fmt.Sprintf(`%s SQLCMD_PASSWORD=`, pal.CreateEnvVarKeyword()),
3638
},
3739
},
3840
{
39-
Description: "Add a user (using the SQLCMDPASSWORD environment variable)",
41+
Description: localizer.Sprintf("Add a user (using the SQLCMDPASSWORD environment variable)"),
4042
Steps: []string{
4143
fmt.Sprintf(`%s SQLCMDPASSWORD=<placeholderpassword>`, pal.CreateEnvVarKeyword()),
4244
"sqlcmd config add-user --name my-user --username user1 --password-encryption none",
@@ -47,7 +49,7 @@ func (c *AddUser) DefineCommand(...cmdparser.CommandOptions) {
4749

4850
if runtime.GOOS == "windows" {
4951
examples = append(examples, cmdparser.ExampleOptions{
50-
Description: "Add a user using Windows Data Protection API to encrypt password in sqlconfig",
52+
Description: localizer.Sprintf("Add a user using Windows Data Protection API to encrypt password in sqlconfig"),
5153
Steps: []string{
5254
fmt.Sprintf(`%s SQLCMD_PASSWORD=<placeholderpassword>`, pal.CreateEnvVarKeyword()),
5355
"sqlcmd config add-user --name my-user --username user1 --password-encryption dpapi",
@@ -58,7 +60,7 @@ func (c *AddUser) DefineCommand(...cmdparser.CommandOptions) {
5860

5961
options := cmdparser.CommandOptions{
6062
Use: "add-user",
61-
Short: "Add a user",
63+
Short: localizer.Sprintf("Add a user"),
6264
Examples: examples,
6365
Run: c.run}
6466

@@ -68,27 +70,26 @@ func (c *AddUser) DefineCommand(...cmdparser.CommandOptions) {
6870
String: &c.name,
6971
Name: "name",
7072
DefaultString: "user",
71-
Usage: "Display name for the user (this is not the username)",
73+
Usage: localizer.Sprintf("Display name for the user (this is not the username)"),
7274
})
7375

7476
c.AddFlag(cmdparser.FlagOptions{
7577
String: &c.authType,
7678
Name: "auth-type",
7779
DefaultString: "basic",
78-
Usage: "Authentication type this user will use (basic | other)",
80+
Usage: localizer.Sprintf("Authentication type this user will use (basic | other)"),
7981
})
8082

8183
c.AddFlag(cmdparser.FlagOptions{
8284
String: &c.username,
8385
Name: "username",
84-
Usage: "The username (provide password in SQLCMD_PASSWORD or SQLCMDPASSWORD environment variable)",
86+
Usage: localizer.Sprintf("The username (provide password in %s or %s environment variable)", localizer.PasswordEnvVar, localizer.PasswordEnvVar2),
8587
})
8688

8789
c.AddFlag(cmdparser.FlagOptions{
8890
String: &c.passwordEncryption,
8991
Name: "password-encryption",
90-
Usage: fmt.Sprintf("Password encryption method (%s) in sqlconfig file",
91-
secret.EncryptionMethodsForUsage()),
92+
Usage: localizer.Sprintf("Password encryption method (%s) in sqlconfig file", secret.EncryptionMethodsForUsage()),
9293
})
9394
}
9495

@@ -105,21 +106,21 @@ func (c *AddUser) run() {
105106

106107
if c.authType != "basic" &&
107108
c.authType != "other" {
108-
output.FatalfWithHints([]string{"Authentication type must be 'basic' or 'other'"},
109-
"Authentication type '' is not valid %v'", c.authType)
109+
output.FatalfWithHints([]string{localizer.Sprintf("Authentication type must be '%s' or '%s'", localizer.ModernAuthTypeBasic, localizer.ModernAuthTypeOther)},
110+
localizer.Sprintf("Authentication type '' is not valid %v'", c.authType))
110111
}
111112

112113
if c.authType != "basic" && c.passwordEncryption != "" {
113114
output.FatalWithHints([]string{
114-
"Remove the --password-encryption flag",
115-
"Pass in the --auth-type basic"},
116-
"The --password-encryption flag can only be used when authentication type is 'basic'")
115+
localizer.Sprintf("Remove the %s flag", localizer.PasswordEncryptFlag),
116+
localizer.Sprintf("Pass in the %s %s", localizer.AuthTypeFlag, localizer.ModernAuthTypeBasic)},
117+
localizer.Sprintf("The %s flag can only be used when authentication type is '%s'", localizer.PasswordEncryptFlag, localizer.ModernAuthTypeBasic))
117118
}
118119

119120
if c.authType == "basic" && c.passwordEncryption == "" {
120121
output.FatalWithHints([]string{
121-
"Add the --password-encryption flag"},
122-
"The --password-encryption flag must be set when authentication type is 'basic'")
122+
localizer.Sprintf("Add the %s flag", localizer.PasswordEncryptFlag)},
123+
localizer.Sprintf("The %s flag must be set when authentication type is '%s'", localizer.PasswordEncryptFlag, localizer.ModernAuthTypeBasic))
123124
}
124125

125126
user := sqlconfig.User{
@@ -130,29 +131,29 @@ func (c *AddUser) run() {
130131
if c.authType == "basic" {
131132
if os.Getenv("SQLCMD_PASSWORD") == "" && os.Getenv("SQLCMDPASSWORD") == "" {
132133
output.FatalWithHints([]string{
133-
"Provide password in the SQLCMD_PASSWORD (or SQLCMDPASSWORD) environment variable"},
134-
"Authentication Type 'basic' requires a password")
134+
localizer.Sprintf("Provide password in the %s (or %s) environment variable", localizer.PasswordEnvVar, localizer.PasswordEnvVar2)},
135+
localizer.Sprintf("Authentication Type '%s' requires a password", localizer.ModernAuthTypeBasic))
135136
}
136137

137138
if c.username == "" {
138139
output.FatalfWithHintExamples([][]string{
139-
{"Provide a username with the --username flag",
140+
{localizer.Sprintf("Provide a username with the %s flag"),
140141
"sqlcmd config add-user --username sa"},
141142
},
142-
"Username not provided")
143+
localizer.Sprintf("Username not provided"))
143144
}
144145

145146
if !secret.IsValidEncryptionMethod(c.passwordEncryption) {
146147
output.FatalfWithHints([]string{
147-
fmt.Sprintf("Provide a valid encryption method (%s) with the --password-encryption flag", secret.EncryptionMethodsForUsage())},
148-
"Encryption method '%v' is not valid", c.passwordEncryption)
148+
localizer.Sprintf("Provide a valid encryption method (%s) with the %s flag", secret.EncryptionMethodsForUsage(), localizer.PasswordEncryptFlag)},
149+
localizer.Sprintf("Encryption method '%v' is not valid", c.passwordEncryption))
149150
}
150151

151152
if os.Getenv("SQLCMD_PASSWORD") != "" &&
152153
os.Getenv("SQLCMDPASSWORD") != "" {
153154
output.FatalWithHints([]string{
154-
"Unset one of the environment variables SQLCMD_PASSWORD or SQLCMDPASSWORD"},
155-
"Both environment variables SQLCMD_PASSWORD and SQLCMDPASSWORD are set. ")
155+
localizer.Sprintf("Unset one of the environment variables %s or %s", localizer.PasswordEnvVar, localizer.PasswordEnvVar2)},
156+
localizer.Sprintf("Both environment variables %s and %s are set. ", localizer.PasswordEnvVar, localizer.PasswordEnvVar2))
156157
}
157158

158159
password := os.Getenv("SQLCMD_PASSWORD")
@@ -167,5 +168,5 @@ func (c *AddUser) run() {
167168
}
168169

169170
uniqueUserName := config.AddUser(user)
170-
output.Infof("User '%v' added", uniqueUserName)
171+
output.Infof(localizer.Sprintf("User '%v' added", uniqueUserName))
171172
}

0 commit comments

Comments
 (0)