logologo
Bắt đầu
Hướng dẫn
Phát triển
Plugin
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Bắt đầu
Hướng dẫn
Phát triển
Plugin
API
logologo

Bắt đầu nhanh

Tổng quan phát triển plugin
Viết plugin đầu tiên
Cấu trúc thư mục dự án

Phát triển phía server

Tổng quan
Plugin
Collections (Bảng dữ liệu)
Thao tác Database
Quản lý DataSourceManager
Quản lý ResourceManager
Kiểm soát quyền ACL
Middleware
Cache
Event
Ngữ cảnh yêu cầu (Context)
Script nâng cấp (Migration)
Logger (Nhật ký)
I18n (Quốc tế hóa)
Command (Dòng lệnh)
Quản lý tác vụ định kỳ (CronJobManager)
Test

Phát triển phía client

Tổng quan
Plugin
Ngữ cảnh (Context)
Router
Kiểm soát quyền ACL
Quản lý DataSourceManager
Resource
Request
Styles & Themes
Logger (Nhật ký)
I18n (Quốc tế hóa)
Test

Khác

Hướng dẫn nâng cấp plugin
Danh sách ngôn ngữ
Quản lý phụ thuộc
Build
Previous PageLogger (Nhật ký)
Next PageCommand (Dòng lệnh)
TIP

Tài liệu này được dịch bởi AI. Đối với bất kỳ thông tin không chính xác nào, vui lòng tham khảo phiên bản tiếng Anh

#I18n (Quốc tế hóa)

Trong các plugin của NocoBase, chúng tôi hỗ trợ quốc tế hóa đa ngôn ngữ (i18n) cho cả frontend và backend. Với một cơ chế thống nhất, bạn có thể dễ dàng triển khai nội dung đa ngôn ngữ trong các plugin.

#Quản lý tệp đa ngôn ngữ

Các tệp đa ngôn ngữ của plugin được lưu trữ thống nhất trong thư mục src/locale. Chúng tôi khuyến nghị đặt tên tệp theo ngôn ngữ, ví dụ:

|- /plugin-hello
  |- /src
    |- /locale
      |- en-US.json   # Ngôn ngữ tiếng Anh
      |- zh-CN.json   # Ngôn ngữ tiếng Trung

Mỗi tệp ngôn ngữ xuất một đối tượng JSON chứa tất cả các mục dịch cho ngôn ngữ đó, ví dụ:

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

Khi thêm tệp ngôn ngữ lần đầu, bạn cần khởi động lại ứng dụng để chúng có hiệu lực. Bạn có thể kiểm tra các mục dịch thông qua API:
http://localhost:13000/api/app:getLang?locale=zh-CN

#Thể hiện i18n toàn cục

app.i18n là thể hiện i18n toàn cục, phù hợp cho các tình huống toàn cục của CLI hoặc plugin. Bạn có thể kết hợp nó với inquirer để triển khai tương tác dòng lệnh:

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) được dùng để dịch văn bản và hỗ trợ các biến mẫu.

#i18n ngữ cảnh yêu cầu

ctx.i18n của mỗi yêu cầu là một thể hiện sao chép của i18n toàn cục, phản hồi độc lập thông tin đa ngôn ngữ dựa trên ngôn ngữ của client.

Thiết lập ngôn ngữ client

  • Chuỗi truy vấn (Query String):
GET /?locale=en-US HTTP/1.1
Host: localhost:13000
  • Header yêu cầu (Khuyến nghị):
GET / HTTP/1.1
Host: localhost:13000
X-Locale: en-US

Sử dụng trong 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();
    });
  }
}

Truy cập http://localhost:13000/api/test-i18n?locale=zh-CN sẽ trả về 你好.

#i18n nội bộ plugin

Các plugin có thể trực tiếp sử dụng plugin.t(key, options) để lấy bản dịch:

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) tương đương với ctx.t(text, { ns })

#Các API liên quan

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