From e17b86ac93c226d6bc86c1da12a51a46d4a0c29d Mon Sep 17 00:00:00 2001 From: Paulo Castellano Date: Fri, 3 Jul 2026 18:17:38 -0300 Subject: [PATCH] Make the content-language field a searchable combobox and reload on UI-language switch Replace the plain content-language - - - {{ languageLabel }} - - - - - {{ language.label }} - - - +

{{ $t('settings.brand.content_language_description') }}

@@ -252,7 +237,13 @@ const runAutofill = async () => {
- +
diff --git a/resources/js/components/FontPicker.vue b/resources/js/components/FontPicker.vue index 73578bc3..d886ddf4 100644 --- a/resources/js/components/FontPicker.vue +++ b/resources/js/components/FontPicker.vue @@ -19,12 +19,16 @@ interface Props { * preview text in the dropdown renders in the actual typeface. */ fonts: string[]; placeholder?: string; + searchPlaceholder?: string; + emptyText?: string; name?: string; disabled?: boolean; } const props = withDefaults(defineProps(), { placeholder: 'Select a font…', + searchPlaceholder: 'Search font…', + emptyText: 'No fonts match.', disabled: false, }); @@ -89,9 +93,9 @@ const select = (font: string) => { - + - No fonts match. + {{ emptyText }} +import { IconCheck, IconChevronDown } from '@tabler/icons-vue'; +import { computed, ref } from 'vue'; + +import { Button } from '@/components/ui/button'; +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; + +interface Props { + /** Selectable languages as { value: locale code, label: native name }. */ + options: { value: string; label: string }[]; + placeholder?: string; + searchPlaceholder?: string; + emptyText?: string; + disabled?: boolean; +} + +const props = withDefaults(defineProps(), { + placeholder: 'Select a language…', + searchPlaceholder: 'Search language…', + emptyText: 'No language found.', + disabled: false, +}); + +const value = defineModel({ required: true }); + +const open = ref(false); + +const selectedLabel = computed(() => props.options.find((option) => option.value === value.value)?.label ?? ''); + +const select = (code: string) => { + value.value = code; + open.value = false; +}; + + + diff --git a/resources/js/components/UserMenuContent.vue b/resources/js/components/UserMenuContent.vue index c9e1a989..5936b084 100644 --- a/resources/js/components/UserMenuContent.vue +++ b/resources/js/components/UserMenuContent.vue @@ -5,7 +5,6 @@ import { IconLogout, IconUser, } from '@tabler/icons-vue'; -import { loadLanguageAsync } from 'laravel-vue-i18n'; import { computed } from 'vue'; import { updateLanguage } from '@/actions/App/Http/Controllers/App/Settings/ProfileController'; @@ -20,7 +19,6 @@ import { DropdownMenuSubTrigger, } from '@/components/ui/dropdown-menu'; import UserInfo from '@/components/UserInfo.vue'; -import dayjs from '@/dayjs'; import posthog from '@/posthog'; import { logout } from '@/routes'; import { edit } from '@/routes/app/profile'; @@ -42,18 +40,8 @@ const languages = computed(() => page.props.languages as Language[]) const currentLanguage = computed(() => languages.value?.find((l: Language) => l.code === page.props.locale)); const switchLanguage = (code: string) => { - const previousCode = currentLanguage.value?.code || 'en'; - - loadLanguageAsync(code); - dayjs.locale(code.toLowerCase()); - router.put(updateLanguage.url(), { locale: code }, { - preserveScroll: true, - preserveState: false, - onError: () => { - loadLanguageAsync(previousCode); - dayjs.locale(previousCode.toLowerCase()); - }, + onSuccess: () => window.location.reload(), }); };