From 2e07f7b00deb5fb1c5704432b51a369cbbc7d138 Mon Sep 17 00:00:00 2001 From: Riccardo Graziosi <31478034+riggraz@users.noreply.github.com> Date: Sun, 8 Sep 2024 14:40:48 +0200 Subject: [PATCH] Add setting to use browser locale if available (#404) --- app/controllers/application_controller.rb | 12 ++++++++++++ .../SiteSettings/General/GeneralSiteSettingsP.tsx | 14 ++++++++++++++ app/javascript/containers/GeneralSiteSettings.tsx | 2 ++ app/javascript/interfaces/ITenantSetting.ts | 1 + app/policies/tenant_setting_policy.rb | 1 + app/views/site_settings/general.html.erb | 3 ++- config/locales/backend/backend.en.yml | 1 + config/locales/en.yml | 1 + ...03_add_use_browser_locale_to_tenant_settings.rb | 5 +++++ db/schema.rb | 3 ++- 10 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20240908121603_add_use_browser_locale_to_tenant_settings.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 37a3caa2..2e3c1956 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -63,6 +63,18 @@ class ApplicationController < ActionController::Base # Set tenant locale I18n.locale = @tenant.locale + + if @tenant_setting.use_browser_locale + user_preferred_language = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first + available_locales = I18n.available_locales.map { |locale| locale.to_s[0, 2] } + + if available_locales.include?(user_preferred_language) + # special cases + user_preferred_language = 'zh-CN' if user_preferred_language == 'zh' + + I18n.locale = user_preferred_language + end + end end def load_oauths diff --git a/app/javascript/components/SiteSettings/General/GeneralSiteSettingsP.tsx b/app/javascript/components/SiteSettings/General/GeneralSiteSettingsP.tsx index 6149242a..77b3cf69 100644 --- a/app/javascript/components/SiteSettings/General/GeneralSiteSettingsP.tsx +++ b/app/javascript/components/SiteSettings/General/GeneralSiteSettingsP.tsx @@ -25,6 +25,7 @@ export interface ISiteSettingsGeneralForm { siteLogo: string; brandDisplaySetting: string; locale: string; + useBrowserLocale: boolean; rootBoardId?: string; customDomain?: string; isPrivate: boolean; @@ -51,6 +52,7 @@ interface Props { siteLogo: string, brandDisplaySetting: string, locale: string, + useBrowserLocale: boolean, rootBoardId: number, customDomain: string, isPrivate: boolean, @@ -86,6 +88,7 @@ const GeneralSiteSettingsP = ({ siteLogo: originForm.siteLogo, brandDisplaySetting: originForm.brandDisplaySetting, locale: originForm.locale, + useBrowserLocale: originForm.useBrowserLocale, rootBoardId: originForm.rootBoardId, customDomain: originForm.customDomain, isPrivate: originForm.isPrivate, @@ -105,6 +108,7 @@ const GeneralSiteSettingsP = ({ data.siteLogo, data.brandDisplaySetting, data.locale, + data.useBrowserLocale, Number(data.rootBoardId), data.customDomain, data.isPrivate, @@ -213,6 +217,16 @@ const GeneralSiteSettingsP = ({ +
+
+ + + + { I18n.t('site_settings.general.use_browser_locale_help') } + +
+
+