Skip to content

Commit 460be70

Browse files
authored
Internationalization: Change locale preference to language (grafana#58359)
* backend locale -> language * frontend locale -> language * sample.ini and tests * fix few last locale -> language * fix few last locale -> language
1 parent 9926931 commit 460be70

File tree

20 files changed

+85
-77
lines changed

20 files changed

+85
-77
lines changed

conf/defaults.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,8 @@ password_hint = password
412412
# Default UI theme ("dark" or "light")
413413
default_theme = dark
414414

415-
# Default locale (supported IETF language tag, such as en-US)
416-
default_locale = en-US
415+
# Default UI language (supported IETF language tag, such as en-US)
416+
default_language = en-US
417417

418418
# Path to a custom home page. Users are only redirected to this if the default home dashboard is used. It should match a frontend route and contain a leading slash.
419419
home_page =

conf/sample.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,8 @@
412412
# Default UI theme ("dark" or "light")
413413
;default_theme = dark
414414

415-
# Default locale (supported IETF language tag, such as en-US)
416-
;default_locale = en-US
415+
# Default UI language (supported IETF language tag, such as en-US)
416+
;default_language = en-US
417417

418418
# Path to a custom home page. Users are only redirected to this if the default home dashboard is used. It should match a frontend route and contain a leading slash.
419419
;home_page =

packages/grafana-data/src/types/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export interface CurrentUserDTO {
127127
timezone: string;
128128
weekStart: string;
129129
locale: string;
130+
language: string;
130131
permissions?: Record<string, boolean>;
131132
}
132133

pkg/api/dtos/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type CurrentUser struct {
4444
Timezone string `json:"timezone"`
4545
WeekStart string `json:"weekStart"`
4646
Locale string `json:"locale"`
47+
Language string `json:"language"`
4748
HelpFlags1 user.HelpFlags1 `json:"helpFlags1"`
4849
HasEditPermissionInFolders bool `json:"hasEditPermissionInFolders"`
4950
Permissions UserPermissionsMap `json:"permissions,omitempty"`

pkg/api/dtos/prefs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ type Prefs struct {
1010
HomeDashboardUID string `json:"homeDashboardUID,omitempty"`
1111
Timezone string `json:"timezone"`
1212
WeekStart string `json:"weekStart"`
13-
Locale string `json:"locale"`
13+
Language string `json:"language"`
1414
Navbar pref.NavbarPreference `json:"navbar,omitempty"`
1515
QueryHistory pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
1616
}
@@ -28,7 +28,7 @@ type UpdatePrefsCmd struct {
2828
WeekStart string `json:"weekStart"`
2929
Navbar *pref.NavbarPreference `json:"navbar,omitempty"`
3030
QueryHistory *pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
31-
Locale string `json:"locale"`
31+
Language string `json:"language"`
3232
}
3333

3434
// swagger:model
@@ -41,7 +41,7 @@ type PatchPrefsCmd struct {
4141
// Enum: utc,browser
4242
Timezone *string `json:"timezone,omitempty"`
4343
WeekStart *string `json:"weekStart,omitempty"`
44-
Locale *string `json:"locale,omitempty"`
44+
Language *string `json:"language,omitempty"`
4545
Navbar *pref.NavbarPreference `json:"navbar,omitempty"`
4646
QueryHistory *pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
4747
HomeDashboardUID *string `json:"homeDashboardUID,omitempty"`

pkg/api/index.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,17 @@ func (hs *HTTPServer) setIndexViewData(c *models.ReqContext) (*dtos.IndexViewDat
4545
return nil, err
4646
}
4747

48-
// Set locale to the preference, otherwise fall back to the accept language header.
49-
// In practice, because the preference has configuration-backed default, the header
50-
// shouldn't frequently be used
48+
// Locale is used for some number and date/time formatting, whereas language is used just for
49+
// translating words in the interface
5150
acceptLangHeader := c.Req.Header.Get("Accept-Language")
5251
locale := "en-US"
52+
language := "" // frontend will set the default language
5353

54-
if hs.Features.IsEnabled(featuremgmt.FlagInternationalization) && prefs.JSONData.Locale != "" {
55-
locale = prefs.JSONData.Locale
56-
} else if len(acceptLangHeader) > 0 {
54+
if hs.Features.IsEnabled(featuremgmt.FlagInternationalization) && prefs.JSONData.Language != "" {
55+
language = prefs.JSONData.Language
56+
}
57+
58+
if len(acceptLangHeader) > 0 {
5759
parts := strings.Split(acceptLangHeader, ",")
5860
locale = parts[0]
5961
}
@@ -100,6 +102,7 @@ func (hs *HTTPServer) setIndexViewData(c *models.ReqContext) (*dtos.IndexViewDat
100102
Timezone: prefs.Timezone,
101103
WeekStart: weekStart,
102104
Locale: locale,
105+
Language: language,
103106
HelpFlags1: c.HelpFlags1,
104107
HasEditPermissionInFolders: hasEditPerm,
105108
},

pkg/api/preferences.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (hs *HTTPServer) getPreferencesFor(ctx context.Context, orgID, userID, team
9696
}
9797

9898
if preference.JSONData != nil {
99-
dto.Locale = preference.JSONData.Locale
99+
dto.Language = preference.JSONData.Language
100100
dto.Navbar = preference.JSONData.Navbar
101101
dto.QueryHistory = preference.JSONData.QueryHistory
102102
}
@@ -149,7 +149,7 @@ func (hs *HTTPServer) updatePreferencesFor(ctx context.Context, orgID, userID, t
149149
OrgID: orgID,
150150
TeamID: teamId,
151151
Theme: dtoCmd.Theme,
152-
Locale: dtoCmd.Locale,
152+
Language: dtoCmd.Language,
153153
Timezone: dtoCmd.Timezone,
154154
WeekStart: dtoCmd.WeekStart,
155155
HomeDashboardID: dtoCmd.HomeDashboardID,
@@ -212,7 +212,7 @@ func (hs *HTTPServer) patchPreferencesFor(ctx context.Context, orgID, userID, te
212212
Timezone: dtoCmd.Timezone,
213213
WeekStart: dtoCmd.WeekStart,
214214
HomeDashboardID: dtoCmd.HomeDashboardID,
215-
Locale: dtoCmd.Locale,
215+
Language: dtoCmd.Language,
216216
Navbar: dtoCmd.Navbar,
217217
QueryHistory: dtoCmd.QueryHistory,
218218
}

pkg/services/preference/model.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ type SavePreferenceCommand struct {
4949
Timezone string `json:"timezone,omitempty"`
5050
WeekStart string `json:"weekStart,omitempty"`
5151
Theme string `json:"theme,omitempty"`
52-
Locale string `json:"locale,omitempty"`
52+
Language string `json:"language,omitempty"`
5353
Navbar *NavbarPreference `json:"navbar,omitempty"`
5454
QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"`
5555
}
@@ -64,7 +64,7 @@ type PatchPreferenceCommand struct {
6464
Timezone *string `json:"timezone,omitempty"`
6565
WeekStart *string `json:"weekStart,omitempty"`
6666
Theme *string `json:"theme,omitempty"`
67-
Locale *string `json:"locale,omitempty"`
67+
Language *string `json:"language,omitempty"`
6868
Navbar *NavbarPreference `json:"navbar,omitempty"`
6969
QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"`
7070
}
@@ -81,7 +81,7 @@ type NavbarPreference struct {
8181
}
8282

8383
type PreferenceJSONData struct {
84-
Locale string `json:"locale"`
84+
Language string `json:"language"`
8585
Navbar NavbarPreference `json:"navbar"`
8686
QueryHistory QueryHistoryPreference `json:"queryHistory"`
8787
}

pkg/services/preference/prefimpl/pref.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ func (s *Service) GetWithDefaults(ctx context.Context, query *pref.GetPreference
6161
res.HomeDashboardID = p.HomeDashboardID
6262
}
6363
if p.JSONData != nil {
64-
if p.JSONData.Locale != "" {
65-
res.JSONData.Locale = p.JSONData.Locale
64+
if p.JSONData.Language != "" {
65+
res.JSONData.Language = p.JSONData.Language
6666
}
6767

6868
if len(p.JSONData.Navbar.SavedItems) > 0 {
@@ -113,7 +113,7 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
113113
Created: time.Now(),
114114
Updated: time.Now(),
115115
JSONData: &pref.PreferenceJSONData{
116-
Locale: cmd.Locale,
116+
Language: cmd.Language,
117117
},
118118
}
119119
_, err = s.store.Insert(ctx, preference)
@@ -131,7 +131,7 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
131131
preference.Version += 1
132132
preference.HomeDashboardID = cmd.HomeDashboardID
133133
preference.JSONData = &pref.PreferenceJSONData{
134-
Locale: cmd.Locale,
134+
Language: cmd.Language,
135135
}
136136

137137
if cmd.Navbar != nil {
@@ -166,11 +166,11 @@ func (s *Service) Patch(ctx context.Context, cmd *pref.PatchPreferenceCommand) e
166166
exists = true
167167
}
168168

169-
if cmd.Locale != nil {
169+
if cmd.Language != nil {
170170
if preference.JSONData == nil {
171171
preference.JSONData = &pref.PreferenceJSONData{}
172172
}
173-
preference.JSONData.Locale = *cmd.Locale
173+
preference.JSONData.Language = *cmd.Language
174174
}
175175

176176
if cmd.Navbar != nil {
@@ -238,7 +238,7 @@ func (s *Service) GetDefaults() *pref.Preference {
238238
}
239239

240240
if s.features.IsEnabled(featuremgmt.FlagInternationalization) {
241-
defaults.JSONData.Locale = s.cfg.DefaultLocale
241+
defaults.JSONData.Language = s.cfg.DefaultLanguage
242242
}
243243

244244
return defaults

pkg/services/preference/prefimpl/pref_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestGetDefaults(t *testing.T) {
3333
cfg: setting.NewCfg(),
3434
features: featuremgmt.WithFeatures(),
3535
}
36-
prefService.cfg.DefaultLocale = "en-US"
36+
prefService.cfg.DefaultLanguage = "en-US"
3737
prefService.cfg.DefaultTheme = "light"
3838
prefService.cfg.DateFormats.DefaultTimezone = "UTC"
3939
weekStart := ""
@@ -76,7 +76,7 @@ func TestGetDefaultsWithI18nFeatureFlag(t *testing.T) {
7676
features: featuremgmt.WithFeatures(featuremgmt.FlagInternationalization),
7777
}
7878
weekStart := ""
79-
prefService.cfg.DefaultLocale = "en-US"
79+
prefService.cfg.DefaultLanguage = "en-US"
8080
prefService.cfg.DefaultTheme = "light"
8181
prefService.cfg.DateFormats.DefaultTimezone = "UTC"
8282

@@ -88,7 +88,7 @@ func TestGetDefaultsWithI18nFeatureFlag(t *testing.T) {
8888
Timezone: "UTC",
8989
HomeDashboardID: 0,
9090
JSONData: &pref.PreferenceJSONData{
91-
Locale: "en-US",
91+
Language: "en-US",
9292
},
9393
}
9494
if diff := cmp.Diff(expected, preference); diff != "" {
@@ -103,7 +103,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
103103
cfg: setting.NewCfg(),
104104
features: featuremgmt.WithFeatures(),
105105
}
106-
prefService.cfg.DefaultLocale = "en-US"
106+
prefService.cfg.DefaultLanguage = "en-US"
107107

108108
weekStartOne := "1"
109109
weekStartTwo := "2"
@@ -115,7 +115,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
115115
Timezone: "UTC",
116116
WeekStart: &weekStartOne,
117117
JSONData: &pref.PreferenceJSONData{
118-
Locale: "en-GB",
118+
Language: "en-GB",
119119
},
120120
},
121121
pref.Preference{
@@ -126,7 +126,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
126126
Timezone: "browser",
127127
WeekStart: &weekStartTwo,
128128
JSONData: &pref.PreferenceJSONData{
129-
Locale: "en-AU",
129+
Language: "en-AU",
130130
},
131131
},
132132
)
@@ -141,7 +141,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
141141
WeekStart: &weekStartTwo,
142142
HomeDashboardID: 4,
143143
JSONData: &pref.PreferenceJSONData{
144-
Locale: "en-AU",
144+
Language: "en-AU",
145145
},
146146
}
147147
if diff := cmp.Diff(expected, preference); diff != "" {
@@ -160,7 +160,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
160160
WeekStart: &weekStartOne,
161161
HomeDashboardID: 1,
162162
JSONData: &pref.PreferenceJSONData{
163-
Locale: "en-GB",
163+
Language: "en-GB",
164164
},
165165
}
166166
if diff := cmp.Diff(expected, preference); diff != "" {
@@ -209,9 +209,9 @@ func TestGetDefaults_JSONData(t *testing.T) {
209209
orgPreferencesJsonData := pref.PreferenceJSONData{
210210
Navbar: orgNavbarPreferences,
211211
}
212-
orgPreferencesWithLocaleJsonData := pref.PreferenceJSONData{
213-
Navbar: orgNavbarPreferences,
214-
Locale: "en-GB",
212+
orgPreferencesWithLanguageJsonData := pref.PreferenceJSONData{
213+
Navbar: orgNavbarPreferences,
214+
Language: "en-GB",
215215
}
216216
team2PreferencesJsonData := pref.PreferenceJSONData{
217217
Navbar: team2NavbarPreferences,
@@ -248,7 +248,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
248248
}, preference)
249249
})
250250

251-
t.Run("user JSONData with missing locale does not override org preference", func(t *testing.T) {
251+
t.Run("user JSONData with missing language does not override org preference", func(t *testing.T) {
252252
prefService := &Service{
253253
store: newFake(),
254254
cfg: setting.NewCfg(),
@@ -258,7 +258,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
258258
insertPrefs(t, prefService.store,
259259
pref.Preference{
260260
OrgID: 1,
261-
JSONData: &orgPreferencesWithLocaleJsonData,
261+
JSONData: &orgPreferencesWithLanguageJsonData,
262262
},
263263
pref.Preference{
264264
OrgID: 1,
@@ -273,7 +273,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
273273
require.Equal(t, &pref.Preference{
274274
WeekStart: &weekStart,
275275
JSONData: &pref.PreferenceJSONData{
276-
Locale: "en-GB",
276+
Language: "en-GB",
277277
Navbar: userNavbarPreferences,
278278
QueryHistory: queryPreference,
279279
},

pkg/setting/setting.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -427,9 +427,9 @@ type Cfg struct {
427427
LDAPSkipOrgRoleSync bool
428428
LDAPAllowSignup bool
429429

430-
DefaultTheme string
431-
DefaultLocale string
432-
HomePage string
430+
DefaultTheme string
431+
DefaultLanguage string
432+
HomePage string
433433

434434
Quota QuotaSettings
435435

@@ -1455,7 +1455,7 @@ func readUserSettings(iniFile *ini.File, cfg *Cfg) error {
14551455
LoginHint = valueAsString(users, "login_hint", "")
14561456
PasswordHint = valueAsString(users, "password_hint", "")
14571457
cfg.DefaultTheme = valueAsString(users, "default_theme", "")
1458-
cfg.DefaultLocale = valueAsString(users, "default_locale", "")
1458+
cfg.DefaultLanguage = valueAsString(users, "default_language", "")
14591459
cfg.HomePage = valueAsString(users, "home_page", "")
14601460
ExternalUserMngLinkUrl = valueAsString(users, "external_manage_link_url", "")
14611461
ExternalUserMngLinkName = valueAsString(users, "external_manage_link_name", "")

public/app/app.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export class GrafanaApp {
105105
// Let iframe container know grafana has started loading
106106
parent.postMessage('GrafanaAppInit', '*');
107107

108-
const loadLocalePromise = initializeI18n(config.bootData.user.locale);
108+
const initI18nPromise = initializeI18n(config.bootData.user.language);
109109

110110
setBackendSrv(backendSrv);
111111
initEchoSrv();
@@ -160,7 +160,7 @@ export class GrafanaApp {
160160
modalManager.init();
161161

162162
await Promise.all([
163-
loadLocalePromise,
163+
initI18nPromise,
164164

165165
// Preload selected app plugins
166166
await preloadPlugins(config.pluginsToPreload),

public/app/core/components/SharedPreferences/SharedPreferences.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ const mockPreferences: UserPreferencesDTO = {
8383
queryHistory: {
8484
homeTab: '',
8585
},
86-
locale: '',
86+
language: '',
8787
};
8888

8989
const mockPrefsPatch = jest.fn();
@@ -152,7 +152,7 @@ describe('SharedPreferences', () => {
152152
expect(weekSelect).toHaveTextContent('Monday');
153153
});
154154

155-
it('renders the locale preference', async () => {
155+
it('renders the language preference', async () => {
156156
const weekSelect = getSelectParent(screen.getByLabelText(/language/i));
157157
expect(weekSelect).toHaveTextContent('Default');
158158
});
@@ -174,7 +174,7 @@ describe('SharedPreferences', () => {
174174
queryHistory: {
175175
homeTab: '',
176176
},
177-
locale: 'fr-FR',
177+
language: 'fr-FR',
178178
});
179179
});
180180

@@ -196,7 +196,7 @@ describe('SharedPreferences', () => {
196196
queryHistory: {
197197
homeTab: '',
198198
},
199-
locale: '',
199+
language: '',
200200
});
201201
});
202202

0 commit comments

Comments
 (0)