logologo
Start
Handbuch
Entwicklung
Plugins
API
Startseite
English
简体中文
日本語
한국어
Español
Português
Deutsch
Français
Русский
Start
Handbuch
Entwicklung
Plugins
API
Startseite
logologo

Schnellstart

Plugin-Entwicklung: Überblick
Erstes Plugin schreiben
Projektverzeichnisstruktur

Serverseitige Entwicklung

Überblick
Plugin
Collections (Datentabellen)
Datenbankoperationen
DataSourceManager
ResourceManager
ACL-Zugriffskontrolle
Middleware
Cache
Events
Request-Kontext
Migration (Update-Skripte)
Logger (Protokollierung)
I18n (Internationalisierung)
Command (Befehlszeile)
CronJobManager
Tests

Clientseitige Entwicklung

Überblick
Plugin
Kontext
Router
ACL-Zugriffskontrolle
DataSourceManager
Ressourcen
Requests
Stile & Themes
Logger (Protokollierung)
I18n (Internationalisierung)
Tests

Sonstiges

Plugin-Update-Leitfaden
Sprachenliste
Abhängigkeitsverwaltung
Build
Previous PageLogger (Protokollierung)
Next PageCommand (Befehlszeile)
KI-Übersetzungshinweis

Diese Dokumentation wurde automatisch von KI übersetzt.

#I18n

In NocoBase-Plugins wird die mehrsprachige Internationalisierung (i18n) sowohl für das Frontend als auch für das Backend unterstützt. Dank eines einheitlichen Mechanismus können Sie mehrsprachige Inhalte in Ihren Plugins mühelos umsetzen.

#Mehrsprachige Dateiverwaltung

Die Mehrsprachen-Dateien von Plugins werden einheitlich im Verzeichnis src/locale abgelegt. Es wird empfohlen, diese nach der jeweiligen Sprache zu benennen, zum Beispiel:

|- /plugin-hello
  |- /src
    |- /locale
      |- en-US.json   # Englische Sprache
      |- zh-CN.json   # Chinesische Sprache

Jede Sprachdatei exportiert ein JSON-Objekt, das alle Übersetzungs-Einträge für die entsprechende Sprache enthält, zum Beispiel:

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

Wenn Sie Sprachdateien zum ersten Mal hinzufügen, müssen Sie die Anwendung neu starten, damit diese wirksam werden. Sie können die Übersetzungs-Einträge über die API überprüfen: http://localhost:13000/api/app:getLang?locale=zh-CN

#Globale i18n-Instanz

app.i18n ist die globale i18n-Instanz, die sich für CLI- oder globale Plugin-Szenarien eignet. Sie lässt sich mit inquirer kombinieren, um Kommandozeilen-Interaktionen zu realisieren:

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) wird verwendet, um Text zu übersetzen und unterstützt dabei Vorlagen-Variablen.

#i18n im Anfrage-Kontext

Die ctx.i18n-Instanz jedes Requests ist ein Klon der globalen i18n-Instanz und liefert mehrsprachige Informationen unabhängig von der Client-Sprache.

Client-Sprache festlegen

  • Query String:
GET /?locale=en-US HTTP/1.1
Host: localhost:13000
  • Request Header (Empfohlen):
GET / HTTP/1.1
Host: localhost:13000
X-Locale: en-US

Verwendung in 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();
    });
  }
}

Beim Aufruf von http://localhost:13000/api/test-i18n?locale=zh-CN wird 你好 zurückgegeben.

#i18n innerhalb von Plugins

Plugins können plugin.t(key, options) direkt verwenden, um Übersetzungen abzurufen:

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) ist äquivalent zu ctx.t(text, { ns }).

#Zugehörige APIs

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