Aviso de traducción por IA

Esta documentación ha sido traducida automáticamente por IA.

I18n

Los plugins de NocoBase son compatibles con la internacionalización (i18n) en múltiples idiomas, tanto para el frontend como para el backend. Gracias a un mecanismo unificado, puede implementar contenido multilingüe en sus plugins de forma sencilla.

Gestión de archivos de idiomas

Los archivos de idiomas de los plugins se almacenan de forma unificada en el directorio src/locale. Le recomendamos nombrarlos según el idioma, por ejemplo:

|- /plugin-hello
  |- /src
    |- /locale
      |- en-US.json   # Idioma inglés
      |- zh-CN.json   # Idioma chino

Cada archivo de idioma exporta un objeto JSON que contiene todas las entradas de traducción para ese idioma, por ejemplo:

// zh-CN.json
{
  "Hello": "你好",
  "World": "世界",
  "Enter your name": "请输入你的名字",
  "Your name is {{name}}": "你的名字是 {{name}}"
}
// en-US.json
{
  "Hello": "Hello",
  "World": "World",
  "Enter your name": "Enter your name",
  "Your name is {{name}}": "Your name is {{name}}"
}

Cuando añada archivos de idioma por primera vez, deberá reiniciar la aplicación para que surtan efecto. Puede verificar las entradas de traducción a través de la API: http://localhost:13000/api/app:getLang?locale=zh-CN

Instancia global de i18n

app.i18n es la instancia global de i18n, ideal para escenarios globales de CLI o de plugins. Puede combinarla con inquirer para implementar interacciones de línea de comandos:

import select from '@inquirer/select';
import input from '@inquirer/input';

export class PluginSampleI18nServer extends Plugin {
  load() {
    this.app.command('test-i18n').action(async () => {
      const answer1 = await select({
        message: 'Select a language',
        choices: [
          { name: '中文', value: 'zh-CN' },
          { name: 'English', value: 'en-US' }
        ]
      });

      await this.app.changeLanguage(answer1);

      const answer2 = await input({
        message: app.i18n.t('Enter your name')
      });

      console.log(app.i18n.t('Your name is {{name}}', { name: answer2 }));
    });
  }
}

app.i18n.t(text, options) se utiliza para traducir texto y admite variables de plantilla.

i18n del contexto de la solicitud

El ctx.i18n de cada solicitud es una instancia clonada de la i18n global, que responde de forma independiente con información multilingüe basada en el idioma del cliente.

Configurar el idioma del cliente

  • Query String:
GET /?locale=en-US HTTP/1.1
Host: localhost:13000
  • Encabezado de la solicitud (Recomendado):
GET / HTTP/1.1
Host: localhost:13000
X-Locale: en-US

Uso en un middleware

export class PluginSampleI18nServer extends Plugin {
  load() {
    this.app.use(async (ctx, next) => {
      if (ctx.path === '/api/test-i18n') {
        ctx.body = ctx.t('Hello', { ns: '@my-project/plugin-hello' });
      }
      await next();
    });
  }
}

Al acceder a http://localhost:13000/api/test-i18n?locale=zh-CN, se devolverá 你好.

i18n interna del plugin

Los plugins pueden usar directamente plugin.t(key, options) para obtener las traducciones:

export class PluginSampleI18nServer extends Plugin {
  load() {
    this.app.use(async (ctx, next) => {
      if (ctx.path === '/api/plugin-i18n') {
        ctx.body = this.plugin.t('Hello');
      }
      await next();
    });
  }
}

plugin.t(text) es equivalente a ctx.t(text, { ns }).

APIs relacionadas

  • app.i18n
  • app.t(text, options)
  • ctx.i18n
  • ctx.t(text, options)
  • plugin.t()
  • tExpr(text, options)