@@ -11,6 +11,7 @@ import {
11
11
isObject ,
12
12
isString ,
13
13
isSymbol ,
14
+ isFunction ,
14
15
toDisplayString ,
15
16
hasOwn ,
16
17
isArray
@@ -49,6 +50,41 @@ type VTDirectiveValue = {
49
50
plural ?: number
50
51
}
51
52
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
+
52
88
/**
53
89
* Transform options for `v-t` custom directive
54
90
*
@@ -87,7 +123,12 @@ export interface TransformVTDirectiveOptions<
87
123
* If each Vue component has a different signature for the translation function, you can specify several in an array for safe SSR.
88
124
* This option value is `undefined` and the signature attached to the binding context is `t`.
89
125
*/
90
- translationSignatures ?: string | string [ ]
126
+ translationSignatures ?:
127
+ | string
128
+ | TranslationSignatureResolver
129
+ | string [ ]
130
+ | TranslationSignatureResolver [ ]
131
+ | ( string | TranslationSignatureResolver ) [ ]
91
132
}
92
133
93
134
// compatibility for this commit(v3.0.3)
@@ -163,7 +204,7 @@ export function transformVTDirective<
163
204
? options . mode
164
205
: 'composition'
165
206
// prettier-ignore
166
- const translationSignatures = isString ( options . translationSignatures )
207
+ const translationSignatures = ( isString ( options . translationSignatures ) || isFunction ( options . translationSignatures ) )
167
208
? [ options . translationSignatures ]
168
209
: isArray ( options . translationSignatures )
169
210
? options . translationSignatures
@@ -398,7 +439,7 @@ function generateTranslationCode(
398
439
context : TransformContext ,
399
440
mode : I18nMode ,
400
441
params : TranslationParams ,
401
- translationSignatures : string [ ]
442
+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
402
443
) : string {
403
444
return mode === 'composition'
404
445
? generateComposableCode ( context , params , translationSignatures )
@@ -407,29 +448,33 @@ function generateTranslationCode(
407
448
408
449
function generateTranslationCallableSignatures (
409
450
context : TransformContext ,
410
- translationSignatures : string [ ]
451
+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
411
452
) : string {
412
453
const { prefixIdentifiers, bindingMetadata, inline } = context
413
454
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
417
461
}
418
- const type = hasOwn ( bindingMetadata , signature ) && bindingMetadata [ signature ]
462
+ const type =
463
+ hasOwn ( bindingMetadata , signatureOrResolver ) && bindingMetadata [ signatureOrResolver ]
419
464
const bindingContext = prefixIdentifiers
420
465
? ( type && type . startsWith ( 'setup' ) ) || type === BindingTypes . LITERAL_CONST
421
466
? '$setup.'
422
467
: '_ctx.'
423
468
: ''
424
- return `${ bindingContext } ${ signature } `
469
+ return `${ bindingContext } ${ signatureOrResolver } `
425
470
} )
426
471
. join ( ' || ' )
427
472
}
428
473
429
474
function generateComposableCode (
430
475
context : TransformContext ,
431
476
params : TranslationParams ,
432
- translationSignatures : string [ ]
477
+ translationSignatures : ( string | TranslationSignatureResolver ) [ ]
433
478
) : string {
434
479
const baseCode = `(${ generateTranslationCallableSignatures ( context , translationSignatures ) } )`
435
480
0 commit comments