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') }
+
+
+
+