Skip to content

Commit ae54fb3

Browse files
authored
feat: translation signature resolver (#226)
1 parent 5c6f49f commit ae54fb3

File tree

3 files changed

+351
-10
lines changed

3 files changed

+351
-10
lines changed

src/transform.ts

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

408449
function 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

429474
function 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

Comments
 (0)