logologo
Start
Manual
Utveckling
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
Manual
Utveckling
Plugins
API
logologo

Snabbstart

Översikt: Plugin-utveckling
Skriv ditt första plugin
Projektets katalogstruktur

Server-side-utveckling

Översikt
Plugin
Collections (datatabeller)
Database (databasåtgärder)
DataSourceManager (datakällshantering)
ResourceManager (resurshantering)
ACL (behörighetskontroll)
Middleware
Cache
Event (händelser)
Context (request-kontext)
Migration (uppgraderingsskript)
Logger (loggar)
I18n (internationalisering)
Command (kommandorad)
CronJobManager (schemalagda jobb)
Test (tester)

Klient-side-utveckling

Översikt
Plugin
Context (kontext)
Router (routing)
ACL (behörighetskontroll)
DataSourceManager (datakällshantering)
Resource (resurser)
Request (förfrågningar)
Stilar & teman
Logger (loggar)
I18n (internationalisering)
Test (tester)

Övrigt

Plugin-uppgraderingsguide
Språklista
Beroendehantering
Bygga
Previous PageLogger (loggar)
Next PageCommand (kommandorad)
TIP

Detta dokument har översatts av AI. För eventuella felaktigheter, se den engelska versionen

#I18n

I NocoBase-plugins stöds flerspråkig internationalisering (i18n) för både frontend och backend. Med en enhetlig mekanism kan ni enkelt implementera flerspråkigt innehåll i era plugins.

#Hantering av flerspråkiga filer

Filer för flerspråkighet i plugins lagras enhetligt i katalogen src/locale. Vi rekommenderar att ni namnger dem efter språkfilen, till exempel:

|- /plugin-hello
  |- /src
    |- /locale
      |- en-US.json   # Engelska
      |- zh-CN.json   # Kinesiska

Varje språkfil exporterar ett JSON-objekt som innehåller alla översättningsposter för det språket, till exempel:

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

När ni lägger till språkfiler för första gången behöver ni starta om applikationen för att de ska träda i kraft. Ni kan verifiera översättningsposterna via API:et:
http://localhost:13000/api/app:getLang?locale=zh-CN

#Global i18n-instans

app.i18n är den globala i18n-instansen, lämplig för CLI eller globala plugin-scenarier. Den kan kombineras med inquirer för att implementera interaktioner via kommandoraden:

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) används för att översätta text och stöder mallvariabler.

#Begärans kontext i18n

Varje begärans ctx.i18n är en klon av den globala i18n-instansen, som svarar oberoende med flerspråkig information baserad på klientens språk.

#Ange klientens språk

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

#Användning i 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();
    });
  }
}

Om ni besöker http://localhost:13000/api/test-i18n?locale=zh-CN kommer 你好 att returneras.

#Intern i18n i plugin

Plugins kan direkt använda plugin.t(key, options) för att hämta översättningar:

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) är ekvivalent med ctx.t(text, { ns }).

#Relaterade API:er

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