mirror of
https://github.com/astuto/astuto.git
synced 2025-12-15 19:27:52 +01:00
Add setting to use browser locale if available (#404)
This commit is contained in:
committed by
GitHub
parent
5decb702f2
commit
2e07f7b00d
@@ -63,6 +63,18 @@ class ApplicationController < ActionController::Base
|
|||||||
|
|
||||||
# Set tenant locale
|
# Set tenant locale
|
||||||
I18n.locale = @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
|
end
|
||||||
|
|
||||||
def load_oauths
|
def load_oauths
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export interface ISiteSettingsGeneralForm {
|
|||||||
siteLogo: string;
|
siteLogo: string;
|
||||||
brandDisplaySetting: string;
|
brandDisplaySetting: string;
|
||||||
locale: string;
|
locale: string;
|
||||||
|
useBrowserLocale: boolean;
|
||||||
rootBoardId?: string;
|
rootBoardId?: string;
|
||||||
customDomain?: string;
|
customDomain?: string;
|
||||||
isPrivate: boolean;
|
isPrivate: boolean;
|
||||||
@@ -51,6 +52,7 @@ interface Props {
|
|||||||
siteLogo: string,
|
siteLogo: string,
|
||||||
brandDisplaySetting: string,
|
brandDisplaySetting: string,
|
||||||
locale: string,
|
locale: string,
|
||||||
|
useBrowserLocale: boolean,
|
||||||
rootBoardId: number,
|
rootBoardId: number,
|
||||||
customDomain: string,
|
customDomain: string,
|
||||||
isPrivate: boolean,
|
isPrivate: boolean,
|
||||||
@@ -86,6 +88,7 @@ const GeneralSiteSettingsP = ({
|
|||||||
siteLogo: originForm.siteLogo,
|
siteLogo: originForm.siteLogo,
|
||||||
brandDisplaySetting: originForm.brandDisplaySetting,
|
brandDisplaySetting: originForm.brandDisplaySetting,
|
||||||
locale: originForm.locale,
|
locale: originForm.locale,
|
||||||
|
useBrowserLocale: originForm.useBrowserLocale,
|
||||||
rootBoardId: originForm.rootBoardId,
|
rootBoardId: originForm.rootBoardId,
|
||||||
customDomain: originForm.customDomain,
|
customDomain: originForm.customDomain,
|
||||||
isPrivate: originForm.isPrivate,
|
isPrivate: originForm.isPrivate,
|
||||||
@@ -105,6 +108,7 @@ const GeneralSiteSettingsP = ({
|
|||||||
data.siteLogo,
|
data.siteLogo,
|
||||||
data.brandDisplaySetting,
|
data.brandDisplaySetting,
|
||||||
data.locale,
|
data.locale,
|
||||||
|
data.useBrowserLocale,
|
||||||
Number(data.rootBoardId),
|
Number(data.rootBoardId),
|
||||||
data.customDomain,
|
data.customDomain,
|
||||||
data.isPrivate,
|
data.isPrivate,
|
||||||
@@ -213,6 +217,16 @@ const GeneralSiteSettingsP = ({
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="formGroup">
|
||||||
|
<div className="checkboxSwitch">
|
||||||
|
<input {...register('useBrowserLocale')} type="checkbox" id="use_browser_locale_checkbox" />
|
||||||
|
<label htmlFor="use_browser_locale_checkbox">{ getLabel('tenant_setting', 'use_browser_locale') }</label>
|
||||||
|
<SmallMutedText>
|
||||||
|
{ I18n.t('site_settings.general.use_browser_locale_help') }
|
||||||
|
</SmallMutedText>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="formGroup">
|
<div className="formGroup">
|
||||||
<label htmlFor="rootBoardId">{ getLabel('tenant_setting', 'root_board_id') }</label>
|
<label htmlFor="rootBoardId">{ getLabel('tenant_setting', 'root_board_id') }</label>
|
||||||
<select
|
<select
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ const mapDispatchToProps = (dispatch: any) => ({
|
|||||||
siteLogo: string,
|
siteLogo: string,
|
||||||
brandDisplaySetting: TenantSettingBrandDisplay,
|
brandDisplaySetting: TenantSettingBrandDisplay,
|
||||||
locale: string,
|
locale: string,
|
||||||
|
useBrowserLocale: boolean,
|
||||||
rootBoardId: number,
|
rootBoardId: number,
|
||||||
customDomain: string,
|
customDomain: string,
|
||||||
isPrivate: boolean,
|
isPrivate: boolean,
|
||||||
@@ -33,6 +34,7 @@ const mapDispatchToProps = (dispatch: any) => ({
|
|||||||
siteLogo,
|
siteLogo,
|
||||||
tenantSetting: {
|
tenantSetting: {
|
||||||
brand_display: brandDisplaySetting,
|
brand_display: brandDisplaySetting,
|
||||||
|
use_browser_locale: useBrowserLocale,
|
||||||
root_board_id: rootBoardId,
|
root_board_id: rootBoardId,
|
||||||
is_private: isPrivate,
|
is_private: isPrivate,
|
||||||
allow_anonymous_feedback: allowAnonymousFeedback,
|
allow_anonymous_feedback: allowAnonymousFeedback,
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ export type TenantSettingCollapseBoardsInHeader =
|
|||||||
|
|
||||||
interface ITenantSetting {
|
interface ITenantSetting {
|
||||||
brand_display?: TenantSettingBrandDisplay;
|
brand_display?: TenantSettingBrandDisplay;
|
||||||
|
use_browser_locale?: boolean;
|
||||||
root_board_id?: number;
|
root_board_id?: number;
|
||||||
is_private?: boolean;
|
is_private?: boolean;
|
||||||
email_registration_policy?: TenantSettingEmailRegistrationPolicy;
|
email_registration_policy?: TenantSettingEmailRegistrationPolicy;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ class TenantSettingPolicy < ApplicationPolicy
|
|||||||
if user.admin?
|
if user.admin?
|
||||||
[
|
[
|
||||||
:brand_display,
|
:brand_display,
|
||||||
|
:use_browser_locale,
|
||||||
:root_board_id,
|
:root_board_id,
|
||||||
:is_private,
|
:is_private,
|
||||||
:email_registration_policy,
|
:email_registration_policy,
|
||||||
|
|||||||
@@ -19,7 +19,8 @@
|
|||||||
feedbackApprovalPolicy: @tenant_setting.feedback_approval_policy,
|
feedbackApprovalPolicy: @tenant_setting.feedback_approval_policy,
|
||||||
showRoadmapInHeader: @tenant_setting.show_roadmap_in_header,
|
showRoadmapInHeader: @tenant_setting.show_roadmap_in_header,
|
||||||
collapseBoardsInHeader: @tenant_setting.collapse_boards_in_header,
|
collapseBoardsInHeader: @tenant_setting.collapse_boards_in_header,
|
||||||
locale: @tenant.locale
|
locale: @tenant.locale,
|
||||||
|
useBrowserLocale: @tenant_setting.use_browser_locale,
|
||||||
},
|
},
|
||||||
boards: @tenant.boards.order(order: :asc),
|
boards: @tenant.boards.order(order: :asc),
|
||||||
isMultiTenant: Rails.application.multi_tenancy?,
|
isMultiTenant: Rails.application.multi_tenancy?,
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ en:
|
|||||||
custom_domain: 'Custom domain'
|
custom_domain: 'Custom domain'
|
||||||
tenant_setting:
|
tenant_setting:
|
||||||
brand_display: 'Display'
|
brand_display: 'Display'
|
||||||
|
use_browser_locale: 'Use browser language'
|
||||||
is_private: 'Private site'
|
is_private: 'Private site'
|
||||||
email_registration_policy: 'Email registration policy'
|
email_registration_policy: 'Email registration policy'
|
||||||
allowed_email_domains: 'Allowed email domains'
|
allowed_email_domains: 'Allowed email domains'
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ en:
|
|||||||
brand_setting_name: 'Name only'
|
brand_setting_name: 'Name only'
|
||||||
brand_setting_logo: 'Logo only'
|
brand_setting_logo: 'Logo only'
|
||||||
brand_setting_none: 'None'
|
brand_setting_none: 'None'
|
||||||
|
use_browser_locale_help: "If you enable this setting, the feedback space will be displayed in the user's browser preferred language. If the language is not available, the default language will be used."
|
||||||
subtitle_privacy: 'Privacy'
|
subtitle_privacy: 'Privacy'
|
||||||
is_private_help: 'If you enable this setting, only logged in users will be able to see the content of the feedback space.'
|
is_private_help: 'If you enable this setting, only logged in users will be able to see the content of the feedback space.'
|
||||||
subtitle_moderation: 'Moderation'
|
subtitle_moderation: 'Moderation'
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class AddUseBrowserLocaleToTenantSettings < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
add_column :tenant_settings, :use_browser_locale, :boolean, default: false, null: false
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2024_09_02_151945) do
|
ActiveRecord::Schema.define(version: 2024_09_08_121603) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
@@ -182,6 +182,7 @@ ActiveRecord::Schema.define(version: 2024_09_02_151945) do
|
|||||||
t.boolean "is_private", default: false, null: false
|
t.boolean "is_private", default: false, null: false
|
||||||
t.integer "email_registration_policy", default: 0, null: false
|
t.integer "email_registration_policy", default: 0, null: false
|
||||||
t.string "allowed_email_domains"
|
t.string "allowed_email_domains"
|
||||||
|
t.boolean "use_browser_locale", default: false, null: false
|
||||||
t.index ["tenant_id"], name: "index_tenant_settings_on_tenant_id"
|
t.index ["tenant_id"], name: "index_tenant_settings_on_tenant_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user