logologo
Start
Handbuch
Entwickler
Plugins
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Start
Handbuch
Entwickler
Plugins
API
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)