@@ -11,6 +11,7 @@ import {
1111 isObject ,
1212 isString ,
1313 isSymbol ,
14+ isFunction ,
1415 toDisplayString ,
1516 hasOwn ,
1617 isArray
@@ -49,6 +50,41 @@ type VTDirectiveValue = {
4950 plural ?: number
5051}
5152
53+ /**
54+ * Translation signature resolver
55+ *
56+ * @remarks
57+ * This resolver is used at {@link TransformVTDirectiveOptions | 'translationSignatures' option}
58+ *
59+ * @example
60+ * ```js
61+ * import { compile } from '@vue/compiler-dom'
62+ * import { transformVTDirective } from '@intlify/vue-i18n-extensions'
63+ *
64+ * // the below is just an example, you can use your own signature resolver
65+ * const signatureMap = new Map()
66+ *
67+ * const transformVT = transformVTDirective({
68+ * translationSignatures: (context) => {
69+ * const { prefixIdentifiers, bindingMetadata, inline, filename } = context
70+ * let signature = ''
71+ *
72+ * // something logic to resolve signature like using `signatureMap`
73+ * // signature = signatureMap.get(filename)
74+ * // ...
75+ *
76+ * return signature
77+ * }
78+ * })
79+ *
80+ * const { code } = compile(`<p v-t="'hello'"></p>`, {
81+ * // ...
82+ * directiveTransforms: { t: transformVT }
83+ * })
84+ * ```
85+ */
86+ export type TranslationSignatureResolver = ( context : TransformContext ) => string
87+
5288/**
5389 * Transform options for `v-t` custom directive
5490 *
@@ -87,7 +123,12 @@ export interface TransformVTDirectiveOptions<
87123 * If each Vue component has a different signature for the translation function, you can specify several in an array for safe SSR.
88124 * This option value is `undefined` and the signature attached to the binding context is `t`.
89125 */
90- translationSignatures ?: string | string [ ]
126+ translationSignatures ?:
127+ | string
128+ | TranslationSignatureResolver
129+ | string [ ]
130+ | TranslationSignatureResolver [ ]
131+ | ( string | TranslationSignatureResolver ) [ ]
91132}
92133
93134// compatibility for this commit(v3.0.3)
@@ -163,7 +204,7 @@ export function transformVTDirective<
163204 ? options . mode
164205 : 'composition'
165206 // prettier-ignore
166- const translationSignatures = isString ( options . translationSignatures )
207+ const translationSignatures = ( isString ( options . translationSignatures ) || isFunction ( options . translationSignatures ) )
167208 ? [ options . translationSignatures ]
168209 : isArray ( options . translationSignatures )
169210 ? options . translationSignatures
@@ -398,7 +439,7 @@ function generateTranslationCode(
398439 context : TransformContext ,
399440 mode : I18nMode ,
400441 params : TranslationParams ,
401- translationSignatures : string [ ]
442+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
402443) : string {
403444 return mode === 'composition'
404445 ? generateComposableCode ( context , params , translationSignatures )
@@ -407,29 +448,33 @@ function generateTranslationCode(
407448
408449function generateTranslationCallableSignatures (
409450 context : TransformContext ,
410- translationSignatures : string [ ]
451+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
411452) : string {
412453 const { prefixIdentifiers, bindingMetadata, inline } = context
413454 return translationSignatures
414- . map ( signature => {
415- if ( inline && signature !== GLOBAL_TRANSLATE_SIGNATURE ) {
416- return signature
455+ . map ( signatureOrResolver => {
456+ if ( isFunction ( signatureOrResolver ) ) {
457+ return signatureOrResolver ( context )
458+ }
459+ if ( inline && signatureOrResolver !== GLOBAL_TRANSLATE_SIGNATURE ) {
460+ return signatureOrResolver
417461 }
418- const type = hasOwn ( bindingMetadata , signature ) && bindingMetadata [ signature ]
462+ const type =
463+ hasOwn ( bindingMetadata , signatureOrResolver ) && bindingMetadata [ signatureOrResolver ]
419464 const bindingContext = prefixIdentifiers
420465 ? ( type && type . startsWith ( 'setup' ) ) || type === BindingTypes . LITERAL_CONST
421466 ? '$setup.'
422467 : '_ctx.'
423468 : ''
424- return `${ bindingContext } ${ signature } `
469+ return `${ bindingContext } ${ signatureOrResolver } `
425470 } )
426471 . join ( ' || ' )
427472}
428473
429474function generateComposableCode (
430475 context : TransformContext ,
431476 params : TranslationParams ,
432- translationSignatures : string [ ]
477+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
433478) : string {
434479 const baseCode = `(${ generateTranslationCallableSignatures ( context , translationSignatures ) } )`
435480
0 commit comments