Skip to content

Translation Transform

VoerkaI18n provides a translation transform mechanism to transform translation results into other forms, such as Vue's ref, SolidJS's solid, etc., to meet the needs of reactive rendering.

Important

The $t function replaces the t function to return a reactive translation result.

Usage

Step 1: Create Transform Function

Create a transform.ts file in the src/languages directory to store the translation transform function.

ts
export transform = (scope:VoerkaI18nScope) => {     
        // result is the return value of the t function   
        return (result:string)=>{             
            // return <transformed result>
        }
    }

Step 2: Enable Transform Function

Modify the src/languages/index.{js|ts} file to enable the transform function.

ts
import { transform } from "./transform"

export const i18nScope = new VoerkaI18nScope({        
    transform,    // Translation transform
    // ...
})
export const $t = i18nScope.$t

Note

When using the $t function, it first calls the t function and then passes the result to the transform function. $t is equivalent to transform(t(...)).

Step 3: Use $t Translation Function

The $t function can be used instead of the t function in certain component scenarios.

The key is to understand which scenarios need to use the $t function and how to use it. Follow these principles:

  • Scenarios: Only use the $t function in scenarios that require reactive rendering.
  • Different reactive frameworks use different methods, such as Vue's ref, SolidJS's signal, etc.
  • Generally, the $t function is used to return a reactive translation result, such as Vue/ref, Solid/signal, etc.

Important

Different reactive frameworks have different transform implementations. But they all uniformly export the $t function.

How It Works

To better understand how translation transform works, let's take Vue as an example to fully understand the working principles and usage of translation transform.

Analyzing the Problem

First, let's look at a simple Vue component:

vue
<template>
    <div>
        <p>{{ title }}</p>
    </div>
</template>
<script setup>
import { ref } from 'vue'
import { i18nScope } from 'languages'
const title = ref(i18nScope.t("title"))
</script>

In the code above, we use the ref function to create a reactive title variable and use the t function to translate title.

Beginners might think that when switching languages, Vue will automatically re-render the title component.

However, this is not the case because although title is a ref variable, switching languages doesn't modify the value of ref(title), so it won't trigger Vue's re-rendering. Therefore, the above code cannot achieve automatic re-rendering when switching languages.

How to solve this problem? This is where the $t function comes in.

Reactive Switching

According to the above analysis, when switching languages, the value of ref(title) is not modified, so it won't trigger Vue's re-rendering.

Therefore, to solve this problem, we need to update the ref(title) value when switching languages, which will cause the Vue component to re-render.

The solution becomes obvious - we need to respond to the language switch event.

vue
<template>
    <div>
        <p>{{ title }}</p>
    </div>
</template>
<script setup>
import { ref, onMount } from 'vue'
import { i18nScope } from './languages' 

const title = ref(i18nScope.t("title"))

let subscriber
onMounted(()=>{
  subscriber = i18nScope.on('change',()=>{
    title.value = t('你好')
  })
})
onUnmounted(()=>{
  subscriber.off()
}) 

</script>

Explanation:

  1. Subscribe to the i18nScope's change event when the component is onMounted.
  2. Update the title value in the change event to trigger Vue's re-rendering.
  3. Unsubscribe from the i18nScope's change event when the component is onUnmounted.

Important

Combining the reactive mechanism with language switch events enables automatic component re-rendering when switching languages.

Introducing Translation Transform

Considering that similar scenarios will appear in many reactive frameworks, we can abstract this logic and encapsulate it into a transform function to simplify this application scenario.

  • Different reactive frameworks only need to implement their corresponding transform implementation.
  • Due to different working principles and APIs of reactive frameworks, the transform implementations are different, but the usage of the $t function remains the same.