logologo
Начало
Руководство
Разработка
Плагины
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Начало
Руководство
Разработка
Плагины
API
logologo

Быстрый старт

Обзор разработки плагинов
Создание первого плагина
Структура каталогов проекта

Серверная разработка

Обзор
Плагин
Коллекции (таблицы данных)
Операции с базой данных
Управление источниками данных (DataSourceManager)
Управление ресурсами (ResourceManager)
Контроль доступа (ACL)
Промежуточное ПО (Middleware)
Кэш
Событие
Контекст запроса
Миграции
Логгер
Интернационализация (I18n)
Командная строка
Управление задачами Cron (CronJobManager)
Тестирование

Клиентская разработка

Обзор
Плагин
Контекст
Маршрутизатор
Контроль доступа (ACL)
Управление источниками данных (DataSourceManager)
Ресурс
Запрос
Стили и темы
Логгер
Интернационализация (I18n)
Тестирование

Прочее

Руководство по обновлению плагинов
Список языков
Управление зависимостями
Сборка
Previous PageЛоггер
Next PageКомандная строка
Уведомление о переводе ИИ

Эта документация была автоматически переведена ИИ.

#I18n

В плагинах NocoBase поддерживается многоязычная интернационализация (i18n) как для фронтенда, так и для бэкенда. Благодаря унифицированному механизму вы можете легко реализовать многоязычный контент в своих плагинах.

#Управление многоязычными файлами

Файлы локализации для плагинов хранятся в каталоге src/locale. Рекомендуется называть их по языку, например:

|- /plugin-hello
  |- /src
    |- /locale
      |- en-US.json   # Английский язык
      |- zh-CN.json   # Китайский язык

Каждый языковой файл экспортирует JSON-объект, содержащий все переводы для этого языка, например:

// 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}}"
}

При первом добавлении языковых файлов необходимо перезапустить приложение, чтобы изменения вступили в силу. Вы можете проверить записи перевода через API:
http://localhost:13000/api/app:getLang?locale=zh-CN

#Глобальный экземпляр i18n

app.i18n — это глобальный экземпляр i18n, подходящий для использования в CLI или в глобальных сценариях плагинов. Его можно комбинировать с inquirer для реализации взаимодействия через командную строку:

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) используется для перевода текста и поддерживает шаблонные переменные.

#i18n в контексте запроса

ctx.i18n каждого запроса является клоном глобального экземпляра i18n и независимо предоставляет многоязычную информацию в зависимости от языка клиента.

Установка языка клиента

  • Query String:
GET /?locale=en-US HTTP/1.1
Host: localhost:13000
  • Request Header (Рекомендуется):
GET / HTTP/1.1
Host: localhost:13000
X-Locale: en-US

Использование в 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();
    });
  }
}

При обращении к http://localhost:13000/api/test-i18n?locale=zh-CN будет возвращено 你好.

#i18n внутри плагина

Внутри плагинов вы можете напрямую использовать plugin.t(key, options) для получения переводов:

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) эквивалентно ctx.t(text, { ns }).

#Связанные API

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