Internationalization: Change locale preference to language (#58359)
* backend locale -> language * frontend locale -> language * sample.ini and tests * fix few last locale -> language * fix few last locale -> language
This commit is contained in:
@@ -44,6 +44,7 @@ type CurrentUser struct {
|
||||
Timezone string `json:"timezone"`
|
||||
WeekStart string `json:"weekStart"`
|
||||
Locale string `json:"locale"`
|
||||
Language string `json:"language"`
|
||||
HelpFlags1 user.HelpFlags1 `json:"helpFlags1"`
|
||||
HasEditPermissionInFolders bool `json:"hasEditPermissionInFolders"`
|
||||
Permissions UserPermissionsMap `json:"permissions,omitempty"`
|
||||
|
||||
@@ -10,7 +10,7 @@ type Prefs struct {
|
||||
HomeDashboardUID string `json:"homeDashboardUID,omitempty"`
|
||||
Timezone string `json:"timezone"`
|
||||
WeekStart string `json:"weekStart"`
|
||||
Locale string `json:"locale"`
|
||||
Language string `json:"language"`
|
||||
Navbar pref.NavbarPreference `json:"navbar,omitempty"`
|
||||
QueryHistory pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
|
||||
}
|
||||
@@ -28,7 +28,7 @@ type UpdatePrefsCmd struct {
|
||||
WeekStart string `json:"weekStart"`
|
||||
Navbar *pref.NavbarPreference `json:"navbar,omitempty"`
|
||||
QueryHistory *pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
|
||||
Locale string `json:"locale"`
|
||||
Language string `json:"language"`
|
||||
}
|
||||
|
||||
// swagger:model
|
||||
@@ -41,7 +41,7 @@ type PatchPrefsCmd struct {
|
||||
// Enum: utc,browser
|
||||
Timezone *string `json:"timezone,omitempty"`
|
||||
WeekStart *string `json:"weekStart,omitempty"`
|
||||
Locale *string `json:"locale,omitempty"`
|
||||
Language *string `json:"language,omitempty"`
|
||||
Navbar *pref.NavbarPreference `json:"navbar,omitempty"`
|
||||
QueryHistory *pref.QueryHistoryPreference `json:"queryHistory,omitempty"`
|
||||
HomeDashboardUID *string `json:"homeDashboardUID,omitempty"`
|
||||
|
||||
+9
-6
@@ -45,15 +45,17 @@ func (hs *HTTPServer) setIndexViewData(c *models.ReqContext) (*dtos.IndexViewDat
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Set locale to the preference, otherwise fall back to the accept language header.
|
||||
// In practice, because the preference has configuration-backed default, the header
|
||||
// shouldn't frequently be used
|
||||
// Locale is used for some number and date/time formatting, whereas language is used just for
|
||||
// translating words in the interface
|
||||
acceptLangHeader := c.Req.Header.Get("Accept-Language")
|
||||
locale := "en-US"
|
||||
language := "" // frontend will set the default language
|
||||
|
||||
if hs.Features.IsEnabled(featuremgmt.FlagInternationalization) && prefs.JSONData.Locale != "" {
|
||||
locale = prefs.JSONData.Locale
|
||||
} else if len(acceptLangHeader) > 0 {
|
||||
if hs.Features.IsEnabled(featuremgmt.FlagInternationalization) && prefs.JSONData.Language != "" {
|
||||
language = prefs.JSONData.Language
|
||||
}
|
||||
|
||||
if len(acceptLangHeader) > 0 {
|
||||
parts := strings.Split(acceptLangHeader, ",")
|
||||
locale = parts[0]
|
||||
}
|
||||
@@ -100,6 +102,7 @@ func (hs *HTTPServer) setIndexViewData(c *models.ReqContext) (*dtos.IndexViewDat
|
||||
Timezone: prefs.Timezone,
|
||||
WeekStart: weekStart,
|
||||
Locale: locale,
|
||||
Language: language,
|
||||
HelpFlags1: c.HelpFlags1,
|
||||
HasEditPermissionInFolders: hasEditPerm,
|
||||
},
|
||||
|
||||
@@ -96,7 +96,7 @@ func (hs *HTTPServer) getPreferencesFor(ctx context.Context, orgID, userID, team
|
||||
}
|
||||
|
||||
if preference.JSONData != nil {
|
||||
dto.Locale = preference.JSONData.Locale
|
||||
dto.Language = preference.JSONData.Language
|
||||
dto.Navbar = preference.JSONData.Navbar
|
||||
dto.QueryHistory = preference.JSONData.QueryHistory
|
||||
}
|
||||
@@ -149,7 +149,7 @@ func (hs *HTTPServer) updatePreferencesFor(ctx context.Context, orgID, userID, t
|
||||
OrgID: orgID,
|
||||
TeamID: teamId,
|
||||
Theme: dtoCmd.Theme,
|
||||
Locale: dtoCmd.Locale,
|
||||
Language: dtoCmd.Language,
|
||||
Timezone: dtoCmd.Timezone,
|
||||
WeekStart: dtoCmd.WeekStart,
|
||||
HomeDashboardID: dtoCmd.HomeDashboardID,
|
||||
@@ -212,7 +212,7 @@ func (hs *HTTPServer) patchPreferencesFor(ctx context.Context, orgID, userID, te
|
||||
Timezone: dtoCmd.Timezone,
|
||||
WeekStart: dtoCmd.WeekStart,
|
||||
HomeDashboardID: dtoCmd.HomeDashboardID,
|
||||
Locale: dtoCmd.Locale,
|
||||
Language: dtoCmd.Language,
|
||||
Navbar: dtoCmd.Navbar,
|
||||
QueryHistory: dtoCmd.QueryHistory,
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ type SavePreferenceCommand struct {
|
||||
Timezone string `json:"timezone,omitempty"`
|
||||
WeekStart string `json:"weekStart,omitempty"`
|
||||
Theme string `json:"theme,omitempty"`
|
||||
Locale string `json:"locale,omitempty"`
|
||||
Language string `json:"language,omitempty"`
|
||||
Navbar *NavbarPreference `json:"navbar,omitempty"`
|
||||
QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"`
|
||||
}
|
||||
@@ -64,7 +64,7 @@ type PatchPreferenceCommand struct {
|
||||
Timezone *string `json:"timezone,omitempty"`
|
||||
WeekStart *string `json:"weekStart,omitempty"`
|
||||
Theme *string `json:"theme,omitempty"`
|
||||
Locale *string `json:"locale,omitempty"`
|
||||
Language *string `json:"language,omitempty"`
|
||||
Navbar *NavbarPreference `json:"navbar,omitempty"`
|
||||
QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"`
|
||||
}
|
||||
@@ -81,7 +81,7 @@ type NavbarPreference struct {
|
||||
}
|
||||
|
||||
type PreferenceJSONData struct {
|
||||
Locale string `json:"locale"`
|
||||
Language string `json:"language"`
|
||||
Navbar NavbarPreference `json:"navbar"`
|
||||
QueryHistory QueryHistoryPreference `json:"queryHistory"`
|
||||
}
|
||||
|
||||
@@ -61,8 +61,8 @@ func (s *Service) GetWithDefaults(ctx context.Context, query *pref.GetPreference
|
||||
res.HomeDashboardID = p.HomeDashboardID
|
||||
}
|
||||
if p.JSONData != nil {
|
||||
if p.JSONData.Locale != "" {
|
||||
res.JSONData.Locale = p.JSONData.Locale
|
||||
if p.JSONData.Language != "" {
|
||||
res.JSONData.Language = p.JSONData.Language
|
||||
}
|
||||
|
||||
if len(p.JSONData.Navbar.SavedItems) > 0 {
|
||||
@@ -113,7 +113,7 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: cmd.Locale,
|
||||
Language: cmd.Language,
|
||||
},
|
||||
}
|
||||
_, err = s.store.Insert(ctx, preference)
|
||||
@@ -131,7 +131,7 @@ func (s *Service) Save(ctx context.Context, cmd *pref.SavePreferenceCommand) err
|
||||
preference.Version += 1
|
||||
preference.HomeDashboardID = cmd.HomeDashboardID
|
||||
preference.JSONData = &pref.PreferenceJSONData{
|
||||
Locale: cmd.Locale,
|
||||
Language: cmd.Language,
|
||||
}
|
||||
|
||||
if cmd.Navbar != nil {
|
||||
@@ -166,11 +166,11 @@ func (s *Service) Patch(ctx context.Context, cmd *pref.PatchPreferenceCommand) e
|
||||
exists = true
|
||||
}
|
||||
|
||||
if cmd.Locale != nil {
|
||||
if cmd.Language != nil {
|
||||
if preference.JSONData == nil {
|
||||
preference.JSONData = &pref.PreferenceJSONData{}
|
||||
}
|
||||
preference.JSONData.Locale = *cmd.Locale
|
||||
preference.JSONData.Language = *cmd.Language
|
||||
}
|
||||
|
||||
if cmd.Navbar != nil {
|
||||
@@ -238,7 +238,7 @@ func (s *Service) GetDefaults() *pref.Preference {
|
||||
}
|
||||
|
||||
if s.features.IsEnabled(featuremgmt.FlagInternationalization) {
|
||||
defaults.JSONData.Locale = s.cfg.DefaultLocale
|
||||
defaults.JSONData.Language = s.cfg.DefaultLanguage
|
||||
}
|
||||
|
||||
return defaults
|
||||
|
||||
@@ -33,7 +33,7 @@ func TestGetDefaults(t *testing.T) {
|
||||
cfg: setting.NewCfg(),
|
||||
features: featuremgmt.WithFeatures(),
|
||||
}
|
||||
prefService.cfg.DefaultLocale = "en-US"
|
||||
prefService.cfg.DefaultLanguage = "en-US"
|
||||
prefService.cfg.DefaultTheme = "light"
|
||||
prefService.cfg.DateFormats.DefaultTimezone = "UTC"
|
||||
weekStart := ""
|
||||
@@ -76,7 +76,7 @@ func TestGetDefaultsWithI18nFeatureFlag(t *testing.T) {
|
||||
features: featuremgmt.WithFeatures(featuremgmt.FlagInternationalization),
|
||||
}
|
||||
weekStart := ""
|
||||
prefService.cfg.DefaultLocale = "en-US"
|
||||
prefService.cfg.DefaultLanguage = "en-US"
|
||||
prefService.cfg.DefaultTheme = "light"
|
||||
prefService.cfg.DateFormats.DefaultTimezone = "UTC"
|
||||
|
||||
@@ -88,7 +88,7 @@ func TestGetDefaultsWithI18nFeatureFlag(t *testing.T) {
|
||||
Timezone: "UTC",
|
||||
HomeDashboardID: 0,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-US",
|
||||
Language: "en-US",
|
||||
},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preference); diff != "" {
|
||||
@@ -103,7 +103,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
|
||||
cfg: setting.NewCfg(),
|
||||
features: featuremgmt.WithFeatures(),
|
||||
}
|
||||
prefService.cfg.DefaultLocale = "en-US"
|
||||
prefService.cfg.DefaultLanguage = "en-US"
|
||||
|
||||
weekStartOne := "1"
|
||||
weekStartTwo := "2"
|
||||
@@ -115,7 +115,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
|
||||
Timezone: "UTC",
|
||||
WeekStart: &weekStartOne,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-GB",
|
||||
Language: "en-GB",
|
||||
},
|
||||
},
|
||||
pref.Preference{
|
||||
@@ -126,7 +126,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
|
||||
Timezone: "browser",
|
||||
WeekStart: &weekStartTwo,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-AU",
|
||||
Language: "en-AU",
|
||||
},
|
||||
},
|
||||
)
|
||||
@@ -141,7 +141,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
|
||||
WeekStart: &weekStartTwo,
|
||||
HomeDashboardID: 4,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-AU",
|
||||
Language: "en-AU",
|
||||
},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preference); diff != "" {
|
||||
@@ -160,7 +160,7 @@ func TestGetWithDefaults_withUserAndOrgPrefs(t *testing.T) {
|
||||
WeekStart: &weekStartOne,
|
||||
HomeDashboardID: 1,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-GB",
|
||||
Language: "en-GB",
|
||||
},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preference); diff != "" {
|
||||
@@ -209,9 +209,9 @@ func TestGetDefaults_JSONData(t *testing.T) {
|
||||
orgPreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: orgNavbarPreferences,
|
||||
}
|
||||
orgPreferencesWithLocaleJsonData := pref.PreferenceJSONData{
|
||||
Navbar: orgNavbarPreferences,
|
||||
Locale: "en-GB",
|
||||
orgPreferencesWithLanguageJsonData := pref.PreferenceJSONData{
|
||||
Navbar: orgNavbarPreferences,
|
||||
Language: "en-GB",
|
||||
}
|
||||
team2PreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: team2NavbarPreferences,
|
||||
@@ -248,7 +248,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
|
||||
}, preference)
|
||||
})
|
||||
|
||||
t.Run("user JSONData with missing locale does not override org preference", func(t *testing.T) {
|
||||
t.Run("user JSONData with missing language does not override org preference", func(t *testing.T) {
|
||||
prefService := &Service{
|
||||
store: newFake(),
|
||||
cfg: setting.NewCfg(),
|
||||
@@ -258,7 +258,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
|
||||
insertPrefs(t, prefService.store,
|
||||
pref.Preference{
|
||||
OrgID: 1,
|
||||
JSONData: &orgPreferencesWithLocaleJsonData,
|
||||
JSONData: &orgPreferencesWithLanguageJsonData,
|
||||
},
|
||||
pref.Preference{
|
||||
OrgID: 1,
|
||||
@@ -273,7 +273,7 @@ func TestGetDefaults_JSONData(t *testing.T) {
|
||||
require.Equal(t, &pref.Preference{
|
||||
WeekStart: &weekStart,
|
||||
JSONData: &pref.PreferenceJSONData{
|
||||
Locale: "en-GB",
|
||||
Language: "en-GB",
|
||||
Navbar: userNavbarPreferences,
|
||||
QueryHistory: queryPreference,
|
||||
},
|
||||
|
||||
@@ -427,9 +427,9 @@ type Cfg struct {
|
||||
LDAPSkipOrgRoleSync bool
|
||||
LDAPAllowSignup bool
|
||||
|
||||
DefaultTheme string
|
||||
DefaultLocale string
|
||||
HomePage string
|
||||
DefaultTheme string
|
||||
DefaultLanguage string
|
||||
HomePage string
|
||||
|
||||
Quota QuotaSettings
|
||||
|
||||
@@ -1455,7 +1455,7 @@ func readUserSettings(iniFile *ini.File, cfg *Cfg) error {
|
||||
LoginHint = valueAsString(users, "login_hint", "")
|
||||
PasswordHint = valueAsString(users, "password_hint", "")
|
||||
cfg.DefaultTheme = valueAsString(users, "default_theme", "")
|
||||
cfg.DefaultLocale = valueAsString(users, "default_locale", "")
|
||||
cfg.DefaultLanguage = valueAsString(users, "default_language", "")
|
||||
cfg.HomePage = valueAsString(users, "home_page", "")
|
||||
ExternalUserMngLinkUrl = valueAsString(users, "external_manage_link_url", "")
|
||||
ExternalUserMngLinkName = valueAsString(users, "external_manage_link_name", "")
|
||||
|
||||
Reference in New Issue
Block a user