Интернационализация

Файлы интернационализации

В плагинах мультиязычные файлы для клиентской и серверной части хранятся в папке src/locale.

|- /plugin-i18n
  |- /src
    |- /locale      # Папка локализации
      |- en-US.ts   # Английский язык
      |- zh-CN.ts   # Китайский язык

Добавляйте элементы перевода в соответствующие мультиязычные файлы (/src/locale/${lang}.ts). Если мультиязычный файл добавляется впервые, для применения изменений нужно перезапустить приложение. Проверить, успешно ли добавлены элементы перевода, можно через API app:getLang.

URL по умолчанию: http://localhost:13000/api/app:getLang?locale=zh-CN

API, связанные с интернационализацией

  • server
    • app.i18n
    • app.t(text, options)
    • ctx.i18n
    • ctx.t(text, options)
    • plugin.t()
  • client
    • ctx.i18n
    • ctx.t(text, options)
    • plugin.t()
    • useT()
  • utils
    • tExpr(text, options)
  • react-i18next
    • useTranslation(ns)
    • withTranslation(ns)

Сервер

app.i18n server

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: 'Выберите язык',
        choices: [
          {
            name: '中文',
            value: 'zh-CN',
          },
          {
            name: 'Английский',
            value: 'en-US',
          },
        ],
      });
      await this.app.i18n.changeLanguage(answer1);
      const answer2 = await input({
        message: this.app.i18n.t('Введите ваше имя'),
      });
      console.log(this.app.i18n.t(`Ваше имя: {{name}}`, { name: answer2 }));
    });
  }
}

app.t(text, options) server

ctx.i18n server

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

Параметры клиентского запроса можно передавать в строке запроса.

GET /?locale=en-US HTTP/1.1
Host: localhost:13000

Или в заголовках запроса (рекомендуется).

GET / HTTP/1.1
Host: localhost:13000
X-Locale: en-US

Пример

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

Проверка: http://localhost:13000/api/test-i18n?locale=zh-CN

ctx.t(text, options) server

plugin.t() server

Клиент

ctx.i18n client

ctx.t(text, options) client

plugin.t()

useT()

Служебные функции

tExpr(text) server client

react-i18next

useTranslation(ns) client

withTranslation(ns) client