Vite+vue3+ts usa i18n

Vue3 debe usar la versión 9.* al usar i18n 

 "vue-i18n": "^9.2.2"

Tabla de contenido

1. Descarga y usa

1.1 Crear configuración

1.2 Uso básico

1.3, habrá una advertencia en este momento

2. Interpolación

2.1, llamada interpolación

2.2 Interpolación de listas

2.3, interpolación de texto

3, mensajes

3.1, Mensajes vinculados (información asociada)

3.2, Modificadores incorporados (modificadores incorporados)

3.3 Modificadores personalizados

3.4, mensajes HTML (información HTML)

4. Pluralización (diversificación)


1. Descarga y usa

npm 

npm install vue-i18n@9

hilo 

yarn add vue-i18n@9

 idioma

1.1 Crear configuración

Cree  la carpeta lang  y luego cree cn.ts, en.ts y el index.ts más importante dentro

cn.ts  

const messages = {
  home: {
    title: '书城',
    hint: '计算机科学和软件工程',
    guessYouLike: '猜你喜欢'
  }
}

export default messages

 a.ts

const messages = {
  home: {
    title: 'Book Store',
    hint: 'Computer Science And Software Engineering',
    guessYouLike: 'Guess You Like',
  }
}

export default messages

índice.ts 

import { createI18n } from 'vue-i18n'
import en from './en'
import cn from './cn'

//引入的不同语言文件
const messages = {
  en, cn
}

//这个类型可以自己配置,毕竟每个人做的都不一样
const i18n:any =createI18n( {
  legacy: false,         // 使用 Composition API 模式,则需要将其设置为false
  globalInjection: true, //全局生效$t
  locale: 'cn',          // 默认cn翻译
  messages               //ES6解构
})

export default i18n;

 Si desea configurar otros archivos, puede agregar

vue principal.ts 

import { createApp } from 'vue'
import App from './App.vue'

import i18n  from './lang/index.js'  

const app =  createApp(App)

app.use(i18n);  
app.mount('#app')

1.2 Uso básico

En cualquier componente, es lo mismo que se muestra en la siguiente

Parámetros de uso:

- ruta: requerido, la clave de información local

- locale: opcional, locale (esto ha sido configurado en 1.1 y puede ser modificado por pinia o almacenamiento)

- argumentos: opcional, para lista o formato con nombre (dicho en 2.0)

<template>
  //使用  $t
  <span> {
   
   { $t("home.title") }} </span>
  //使用 t (要解构)
  <p>{
   
   {t("home.title")}}</p>

  //使用v-t , 这个数据是没有的,只是用来展示如何使用v-t
  <p v-t="{path:'title',args: {count: 10 }}"></p>

  //使用翻译组件
  // keypath:必传,和上面path参数一样   tag:可选,转为什么标签
  // locale:可选,要用哪个语言环境    scope:可选,全局还是局部 `global` or `parent`
  //  i18n:可选,优先级比scope高,参数也多,用的也不多,就不介绍了
  <i18n-t keypath='home.title' tag="p" locale='en' scope="global"></i18n-t>

</template>
<script setup lang='ts'>

import { useI18n } from 'vue-i18n'
const { t } = useI18n()

</script>
<style lang='less' scoped></style>

1.3, habrá una advertencia en este momento

警告:Está ejecutando la compilación esm-bundler de vue-i18n. Se recomienda configurar su paquete para reemplazar explícitamente las marcas globales de características con literales booleanos para obtener una sacudida de árbol adecuada en el paquete final.

 Instalar

npm install @intlify/vite-plugin-vue-i18n

vite.config.ts 

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueI18n from '@intlify/vite-plugin-vue-i18n'

//引入resolve 
import { resolve } from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(),
  //配置vueI18n
  vueI18n({
    include: resolve(__dirname, './path/to/src/locales/**')
  })]
})

La solución de advertencia proviene de Star House

2. Interpolación

Solo modifique el archivo cn.ts  a continuación

2.1, llamada interpolación

definir interpolación 

const messages = {
  home: {
    title: `书城{a}{b}`,
  }
}

export default  messages

usar 

<template>
  <p>
    {
   
   { $t("home.title",  {a:'123',b:'9999'}) }}
  </p>
</template>

Efecto 

2.2 Interpolación de listas

definir interpolación

const messages = {
  home: {
    title: `书城{0}{1}`,
    hint: '计算机科学和软件工程{0}',
    guessYouLike: '猜你喜欢'
  }
}
export default  messages

La interpolación de listas define la secuencia de sintaxis de bigote a partir de 0,

Nota: cuando se usa, el subíndice de la matriz corresponde al valor de la lista en sus corchetes {}

 usar

<template>
  <p>
    {
   
   { $t("home.title",  ['一二','四五六']) }}
  </p>
  <p>
    {
   
   { $t("home.hint",  ['123']) }}
  </p>
</template>

 Efecto

2.3, interpolación de texto

La interpolación literal es principalmente útil para caracteres especiales en la sintaxis de formato de mensaje,

Ejemplo: { } @ $ |  

Estos no están disponibles directamente en el mensaje.

 Formato de definición: {' X '} Use comillas entre paréntesis

const messages = {
  home: {
    title: `书城{'{'}这是一个书城{'}'}`,
  }
}
export default  messages

 Si usa     un título directamente como este: `Ciudad del libro{Esta es una ciudad del libro}`, informará un error

Traducción: mensaje de error de compilación: token no válido en el marcador de posición 'Esta es una librería'

 

3, mensajes

3.1, Mensajes vinculados (información asociada)

Rol: juntar diferentes valores

 Formato: @:clave

//定义 ,这不是cn.ts文件的只是修改下,把代码减少
export default {
  book:'流浪地球',
  author:'刘慈欣',
  cover: "@:book - @:author",
}

//使用
<template>
  <p>
    {
   
   { $t("cover",  ) }}
  </p>
</template>

3.2, Modificadores incorporados (modificadores incorporados)

Formato: @.modificador:clave

superior: escribe en mayúsculas todos los caracteres del mensaje de vínculo
inferior: escribe en mayúsculas todos los caracteres del mensaje de vínculo
mayúsculas: escribe en mayúscula el primer carácter del mensaje de vínculo

export default {
  homeAddress: 'Home address',
  upper: '@.upper:homeAddress'
}

<template>
  <p>{
   
   { $t('homeAddress') }}</p>
  <p>{
   
   { $t('upper') }}</p>
</template>

 

3.3 Modificadores personalizados

const i18n:any =createI18n( {
  locale: 'cn', // 默认cn翻译
  messages,
  // 在' modifiers '选项设置自定义修饰符
  modifiers: {
    //别问为什么是any,问就是不知道怎么解决
    snakeCase: (str:any) => str.split(' ').join('_')
  }

})

El uso también es el mismo que el de 3.2

export default {
  homeAddress: 'Home address',
  upper: '@.snakeCase:homeAddress'
}

3.4, mensajes HTML (información HTML)

También puede usar etiquetas html y luego usar v-html para analizar, pero los requisitos de v-html deben ser claros para usted.

//定义
export default {
  cover:'hello <br> world'
}

//使用
<template>
  <p v-html="$t('cover')"></p>
</template>

4. Pluralización (diversificación)

export default {
  car: 'car | cars',
  apple: 'no apples | one apple | {count} apples'
}

//使用------
<template>
  <p>{
   
   { $t('car', 1) }}</p>
  <p>{
   
   { $t('car', 2) }}</p>

  <p>{
   
   { $t('apple', 0) }}</p>
  <p v-t="{ path: 'apple',args: 2 }"></p>
  <p>{
   
   { t('apple', 1) }}</p>
  <p>{
   
   { $t('apple', 10, { count: 10 }) }}</p>
   
    // plural:必传,9.2.2的预期不够好,不能绑定对象,只能绑定值
   <i18n-t keypath="message.plural" :plural="n">
    //要给传的复数,并且还要写值下来,就算是唯一一个值也要写,不然就是空
    <template #count> {
   
   { n }} </template>
  </i18n-t>
</template>

<script setup lang='ts'>
import { ref } from 'vue';
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const n= ref(4)

</script>

//结果------
<p>car</p>
<p>cars</p>

<p>no apples</p>
<p>2 les</p>
<p>one apple</p>
<p>10 les</p>
<p>4 les</p>

Algunos métodos que respaldan la diversificación son: Además de $tc que se muestra arriba

1. $tc (solo válido para legado establecido en verdadero, no importa usarlo )

2. comando personalizado vt (personalizado por i18n, consulte 1.2 uso básico)

3. Componente de traducción incorporado (i18n-t) (actualmente no recomendado, más problemático)

4. Usa la deconstrucción t para usar i18n 

5. Inyectar $t globales,

parámetros implícitos predefinidos

Los parámetros implícitos se refieren al segundo parámetro de (valor clave, parámetro implícito, {xxx:x}), y el tercero es el parámetro de visualización.

El parámetro implícito puede especificar el segundo valor definido, pero su prioridad no es tan alta como el tercer parámetro,

Por ejemplo:

//定义
export default {
  apple: 'no apples | one apple | {count} les | { count } apples '
}

//使用  
<template>
<p>{
    
    { $t('apple', 0) }}</p>  //结果  no apples
<p>{
    
    { $t('apple', 1) }}</p>  //结果  one apple
<p>{
    
    { $t('apple', 2) }}</p>  //结果  2 les
<p>{
    
    { $t('apple', 3) }}</p>  //结果  3 les
<p>{
    
    { $t('apple', 4, { count: 10 }) }}</p>   //结果  4 les
</template>

La última línea no tuvo el efecto que esperaba. Probablemente sea un error. Después de todo, esto ha estado cambiando y realmente no se ha estabilizado.

Mi expectativa es de 10 manzanas, pero no sé adónde irán.

Múltiples definiciones de plural, para personalizar , de lo contrario, solo se mostrará el primer plural

Aspecto específico personalizado: sitio web oficial de vue-i18n

Sitio web chino (no es el sitio web oficial, la versión es 8.*, hay una cierta referencia): Vue I18n v8.x manual

Supongo que te gusta

Origin blog.csdn.net/weixin_59916662/article/details/127844219
Recomendado
Clasificación