Skip to content

Commit 33016c9

Browse files
committed
feat(ConfigProvider): global config for locale
1 parent 8c70281 commit 33016c9

File tree

8 files changed

+40
-22
lines changed

8 files changed

+40
-22
lines changed

packages/radix-vue/src/Calendar/CalendarRoot.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { type DateValue, isEqualDay, isSameDay } from '@internationalized/date'
33
44
import type { Ref } from 'vue'
55
import type { PrimitiveProps } from '@/Primitive'
6-
import { type Formatter, createContext, useDirection } from '@/shared'
6+
import { type Formatter, createContext, useDirection, useLocale } from '@/shared'
77
88
import { useCalendar, useCalendarState } from './useCalendar'
99
import { type CalendarIncrement, getDefaultDate, handleCalendarInitialFocus } from '@/shared/date'
@@ -129,7 +129,6 @@ const props = withDefaults(defineProps<CalendarRootProps>(), {
129129
readonly: false,
130130
initialFocus: false,
131131
placeholder: undefined,
132-
locale: 'en',
133132
isDateDisabled: undefined,
134133
isDateUnavailable: undefined,
135134
})
@@ -152,7 +151,6 @@ defineSlots<{
152151
}>()
153152
154153
const {
155-
locale,
156154
disabled,
157155
readonly,
158156
initialFocus,
@@ -170,10 +168,12 @@ const {
170168
calendarLabel,
171169
defaultValue,
172170
dir: propDir,
171+
locale: propLocale,
173172
} = toRefs(props)
174173
175174
const { primitiveElement, currentElement: parentElement }
176175
= usePrimitiveElement()
176+
const locale = useLocale(propLocale)
177177
const dir = useDirection(propDir)
178178
179179
const modelValue = useVModel(props, 'modelValue', emits, {

packages/radix-vue/src/ConfigProvider/ConfigProvider.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { createContext } from '@/shared'
55
66
interface ConfigProviderContextValue {
77
dir?: Ref<Direction>
8+
locale?: Ref<string>
89
scrollBody?: Ref<boolean | ScrollBodyOption>
910
useId?: () => string
1011
}
@@ -18,6 +19,11 @@ export interface ConfigProviderProps {
1819
* @defaultValue 'ltr'
1920
*/
2021
dir?: Direction
22+
/**
23+
* The global locale of your application. This will be inherited by all primitives.
24+
* @defaultValue 'en'
25+
*/
26+
locale?: string
2127
/**
2228
* The global scroll body behavior of your application. This will be inherited by the related primitives.
2329
* @type boolean | ScrollBodyOption
@@ -35,14 +41,16 @@ import { toRefs } from 'vue'
3541
3642
const props = withDefaults(defineProps<ConfigProviderProps>(), {
3743
dir: 'ltr',
44+
locale: 'en',
3845
scrollBody: true,
3946
useId: undefined,
4047
})
4148
42-
const { dir, scrollBody } = toRefs(props)
49+
const { dir, locale, scrollBody } = toRefs(props)
4350
4451
provideConfigProviderContext({
4552
dir,
53+
locale,
4654
scrollBody,
4755
useId: props.useId,
4856
})

packages/radix-vue/src/DateField/DateFieldRoot.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { type DateValue, isEqualDay } from '@internationalized/date'
33
44
import type { Ref } from 'vue'
55
import type { PrimitiveProps } from '@/Primitive'
6-
import { type Formatter, createContext, useDateFormatter, useDirection, useKbd } from '@/shared'
6+
import { type Formatter, createContext, useDateFormatter, useDirection, useKbd, useLocale } from '@/shared'
77
import {
88
type Granularity,
99
type HourCycle,
@@ -94,7 +94,6 @@ const props = withDefaults(defineProps<DateFieldRootProps>(), {
9494
disabled: false,
9595
readonly: false,
9696
placeholder: undefined,
97-
locale: 'en',
9897
isDateUnavailable: undefined,
9998
})
10099
const emits = defineEmits<DateFieldRootEmits>()
@@ -109,10 +108,11 @@ defineSlots<{
109108
}) => any
110109
}>()
111110
112-
const { locale, disabled, readonly, isDateUnavailable: propsIsDateUnavailable, granularity, defaultValue, dir: propDir } = toRefs(props)
113-
114-
const formatter = useDateFormatter(props.locale)
111+
const { disabled, readonly, isDateUnavailable: propsIsDateUnavailable, granularity, defaultValue, dir: propDir, locale: propLocale } = toRefs(props)
112+
const locale = useLocale(propLocale)
115113
const dir = useDirection(propDir)
114+
115+
const formatter = useDateFormatter(locale.value)
116116
const { primitiveElement, currentElement: parentElement }
117117
= usePrimitiveElement()
118118
const segmentElements = ref<Set<HTMLElement>>(new Set())

packages/radix-vue/src/DateRangeField/DateRangeFieldRoot.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { type DateValue, isEqualDay } from '@internationalized/date'
33
44
import type { Ref } from 'vue'
55
import type { PrimitiveProps } from '@/Primitive'
6-
import { type Formatter, createContext, useDateFormatter, useDirection, useKbd } from '@/shared'
6+
import { type Formatter, createContext, useDateFormatter, useDirection, useKbd, useLocale } from '@/shared'
77
import {
88
type DateRange,
99
type Granularity,
@@ -103,17 +103,17 @@ const props = withDefaults(defineProps<DateRangeFieldRootProps>(), {
103103
disabled: false,
104104
readonly: false,
105105
placeholder: undefined,
106-
locale: 'en',
107106
isDateUnavailable: undefined,
108107
})
109108
const emits = defineEmits<DateRangeFieldRootEmits>()
110-
const { locale, disabled, readonly, isDateUnavailable: propsIsDateUnavailable, dir: propsDir } = toRefs(props)
109+
const { disabled, readonly, isDateUnavailable: propsIsDateUnavailable, dir: propDir, locale: propLocale } = toRefs(props)
110+
const locale = useLocale(propLocale)
111+
const dir = useDirection(propDir)
111112
112-
const formatter = useDateFormatter(props.locale)
113+
const formatter = useDateFormatter(locale.value)
113114
const { primitiveElement, currentElement: parentElement }
114115
= usePrimitiveElement()
115116
const segmentElements = ref<Set<HTMLElement>>(new Set())
116-
const dir = useDirection(propsDir)
117117
118118
onMounted(() => {
119119
Array.from(parentElement.value.querySelectorAll('[data-radix-vue-date-field-segment]')).filter(item => item.getAttribute('data-radix-vue-date-field-segment') !== 'literal').forEach(el => segmentElements.value.add(el as HTMLElement))

packages/radix-vue/src/NumberField/NumberFieldRoot.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import type { PrimitiveProps } from '@/Primitive'
33
import { useVModel } from '@vueuse/core'
4-
import { clamp, createContext, snapValueToStep, useFormControl } from '@/shared'
4+
import { clamp, createContext, snapValueToStep, useFormControl, useLocale } from '@/shared'
55
import { type HTMLAttributes, type Ref, computed, ref, toRefs } from 'vue'
66
77
export interface NumberFieldRootProps extends PrimitiveProps {
@@ -64,11 +64,10 @@ defineOptions({
6464
const props = withDefaults(defineProps<NumberFieldRootProps>(), {
6565
as: 'div',
6666
defaultValue: undefined,
67-
locale: 'en-US',
6867
step: 1,
6968
})
7069
const emits = defineEmits<NumberFieldRootEmits>()
71-
const { disabled, min, max, step, locale, formatOptions, id } = toRefs(props)
70+
const { disabled, min, max, step, formatOptions, id, locale: propLocale } = toRefs(props)
7271
7372
const modelValue = useVModel(props, 'modelValue', emits, {
7473
defaultValue: props.defaultValue,
@@ -77,6 +76,7 @@ const modelValue = useVModel(props, 'modelValue', emits, {
7776
7877
const { primitiveElement, currentElement } = usePrimitiveElement()
7978
79+
const locale = useLocale(propLocale)
8080
const isFormControl = useFormControl(currentElement)
8181
const inputEl = ref<HTMLInputElement>()
8282

packages/radix-vue/src/RangeCalendar/RangeCalendarRoot.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { type DateValue, isEqualDay } from '@internationalized/date'
33
44
import type { Ref } from 'vue'
55
import type { PrimitiveProps } from '@/Primitive'
6-
import { type Formatter, createContext, useDirection } from '@/shared'
6+
import { type Formatter, createContext, useDirection, useLocale } from '@/shared'
77
import { getDefaultDate, handleCalendarInitialFocus } from '@/shared/date'
88
import { type Grid, type Matcher, type WeekDayFormat, isBefore } from '@/date'
99
import type { CalendarIncrement, DateRange } from '@/shared/date'
@@ -122,7 +122,6 @@ const props = withDefaults(defineProps<RangeCalendarRootProps>(), {
122122
readonly: false,
123123
initialFocus: false,
124124
placeholder: undefined,
125-
locale: 'en',
126125
isDateDisabled: undefined,
127126
isDateUnavailable: undefined,
128127
initialView: 'month',
@@ -161,13 +160,14 @@ const {
161160
calendarLabel,
162161
maxValue,
163162
minValue,
164-
locale,
165-
dir: propsDir,
163+
dir: propDir,
164+
locale: propLocale,
166165
} = toRefs(props)
167166
168167
const { primitiveElement, currentElement: parentElement }
169168
= usePrimitiveElement()
170-
const dir = useDirection(propsDir)
169+
const dir = useDirection(propDir)
170+
const locale = useLocale(propLocale)
171171
172172
const lastPressedDateValue = ref() as Ref<DateValue | undefined>
173173
const focusedValue = ref() as Ref<DateValue | undefined>

packages/radix-vue/src/shared/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export { useForwardRef } from './useForwardRef'
2626
export { useGraceArea } from './useGraceArea'
2727
export { useHideOthers } from './useHideOthers'
2828
export { useId } from './useId'
29+
export { useLocale } from './useLocale'
2930
export { useSize } from './useSize'
3031
export { useStateMachine } from './useStateMachine'
3132
export { useTypeahead } from './useTypeahead'
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { injectConfigProviderContext } from '@/ConfigProvider/ConfigProvider.vue'
2+
import { type Ref, computed, ref } from 'vue'
3+
4+
export function useLocale(locale?: Ref<string | undefined>) {
5+
const context = injectConfigProviderContext({
6+
locale: ref('en'),
7+
})
8+
return computed(() => locale?.value || context.locale?.value || 'en')
9+
}

0 commit comments

Comments
 (0)