Creation:2025-09-09Last update:2026-08-30

    使用Intlayer翻译您的Nest backend | 国际化(i18n)

    express-intlayer 是一个强大的国际化 (i18n) 中间件,专为 Express 应用程序设计,旨在通过基于客户端偏好提供本地化响应来使您的后端服务在全球范围内可访问。由于 NestJS 是构建在 Express 之上的,您可以将 express-intlayer 无缝集成到您的 NestJS 应用程序中,以有效处理多语言内容。

    技术用例

    • 以用户语言显示后端错误: 当发生错误时,用用户的母语显示消息可以改善理解并减少挫折感。这对于可能在前端组件(如 toasts 或 modals)中显示的动态错误消息特别有用。

    • 检索多语言内容:对于从数据库中提取内容的应用程序,国际化确保您可以以多种语言提供此内容。这对于电子商务网站或内容管理系统等平台至关重要,这些平台需要以用户首选的语言显示产品描述、文章和其他内容。

    • 发送多语言电子邮件:无论是事务性电子邮件、营销活动还是通知,用收件人的语言发送电子邮件可以显著提高参与度和有效性。

    • 多语言推送通知:对于移动应用程序,以用户偏好的语言发送推送通知可以增强交互和留存率。这种个人化的方式可以使通知感觉更加相关和可操作。

    • 其他通信:任何形式的后端通信,例如短信消息、系统警报或用户界面更新,都受益于使用用户的语言,确保清晰度并增强整体用户体验。

    express-intlayer 是一个功能强大的国际化(i18n)中间件,适用于 Express 应用程序,旨在通过根据客户端的偏好提供本地化响应,使您的后端服务能够面向全球用户。由于 NestJS 构建在 Express 之上,您可以将 express-intlayer 无缝集成到您的 NestJS 应用中,有效处理多语言内容。

    入门指南

    创建一个新的 NestJS 项目

    bash
    npm install -g @nestjs/cli
    nest new my-nest-app
    

    安装

    要开始使用 express-intlayer,请使用 npm 安装该包:

    bash
    npx intlayer init --interactive
    
    --interactive 标志是可选的。如果您是 AI 代理,请使用 intlayer-cli init
    该命令将检测您的环境并安装所需的软件包。例如:
    bash
    npm install intlayer express-intlayer
    

    配置 tsconfig.json

    为了在 TypeScript 中使用 Intlayer,请确保您的 tsconfig.json 已设置为支持 ES 模块。您可以通过将 modulemoduleResolution 选项设置为 nodenext 来实现此目的。

    tsconfig.json
    {
      compilerOptions: {
        module: "nodenext",
        moduleResolution: "nodenext",
        // ... 其他选项
      },
    }
    

    设置

    通过在项目根目录创建 intlayer.config.ts 来配置国际化设置:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    声明您的内容

    创建并管理您的内容声明以存储翻译:

    您的内容声明可以定义在应用程序中的任何位置,只要它们被包含在 contentDir 目录中(默认是 ./src),并且文件扩展名符合内容声明的格式(默认是 .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})。
    更多详情,请参阅内容声明文档

    Express 中间件设置

    express-intlayer 中间件集成到您的 NestJS 应用程序中以处理国际化:

    src/app.module.ts
    import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common";
    import { AppController } from "./app.controller";
    import { AppService } from "./app.service";
    import { intlayer } from "express-intlayer";
    
    @Module({
      imports: [],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule implements NestModule {
      configure(consumer: MiddlewareConsumer) {
        consumer.apply(intlayer()).forRoutes("*"); // 应用于所有路由
      }
    }
    

    在您的服务或控制器中使用翻译

    您现在可以使用 getIntlayer 函数在服务或控制器中访问翻译:

    src/app.service.ts
    import { Injectable } from "@nestjs/common";
    import { getIntlayer } from "express-intlayer";
    
    @Injectable()
    export class AppService {
      getHello(): string {
        return getIntlayer("app").greet;
      }
    }
    

    兼容性

    express-intlayer 完全兼容:

    它还可以无缝配合各种环境中的任何国际化解决方案,包括浏览器和 API 请求。您可以自定义中间件,通过请求头或 Cookie 来检测语言环境:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... 其他配置选项
      routing: {
        storage: [
          { type: "header", name: "my-locale-header" },
          { type: "cookie", name: "my-locale-cookie" },
        ],
      },
    };
    
    export default config;
    

    默认情况下,express-intlayer 会解析 Accept-Language 头来确定客户端的首选语言。

    有关配置和高级主题的更多信息,请访问我们的文档

    配置 TypeScript

    express-intlayer 利用 TypeScript 强大的功能来增强国际化过程。TypeScript 的静态类型确保每个翻译键都被考虑到,减少了缺失翻译的风险,并提升了可维护性。

    Autocompletion

    Translation error

    确保自动生成的类型(默认位于 ./types/intlayer.d.ts)已包含在你的 tsconfig.json 文件中。

    tsconfig.json
    {
      // ... 你现有的 TypeScript 配置
      include: [
        // ... 你现有的 TypeScript 配置
        ".intlayer/**/*.ts", // 包含自动生成的类型
      ],
    }
    

    VS Code 扩展

    为了提升您使用 Intlayer 的开发体验,您可以安装官方的 Intlayer VS Code 扩展

    从 VS Code 市场安装

    该扩展提供:

    • 翻译键的 自动补全
    • 缺失翻译的 实时错误检测
    • 翻译内容的 内联预览
    • 轻松创建和更新翻译的 快速操作

    有关如何使用该扩展的更多详细信息,请参阅 Intlayer VS Code 扩展文档

    Git 配置

    建议忽略 Intlayer 生成的文件,这样可以避免将它们提交到您的 Git 仓库中。

    要做到这一点,您可以将以下指令添加到您的 .gitignore 文件中:

    .gitignore
    # 忽略 Intlayer 生成的文件
    .intlayer
    

    常见问题

    NestJS 拥有 nestjs-i18n,这是常见的选择,涵盖了具有请求作用域服务的 JSON 或 YAML 目录。另一种替代方案是通过 express-intlayer 使用 Intlayer,它使用与前端相同的声明内容,基于您的字典进行强类型校验,并自带 AI 翻译和 CMS 功能。

    后端国际化的核心原因在于,用户阅读的大量文本并不经过前端:API 错误消息、事务性邮件、推送通知、短信以及导出的 PDF 文件。这些内容都需要根据接收者的语言进行解析,且应针对每个请求独立解析,而非按会话存储。

    请参阅 为什么选择 Intlayer

    极少。字典在构建前预先编译,仅包含您声明的语言环境,因此启动时无需加载整个大目录,处理请求路径时也无需读取文件系统。这在 Serverless 和 Edge 环境中尤为重要,因为体积直接决定冷启动耗时。请参阅 Bundle 体积优化

    可以,有两条迁移路径。您可以使用 i18next 迁移指南 逐步迁移内容。或者,您可以完全保留当前的 API:兼容性适配器 公开与 i18next 完全相同的 API,但底层由 Intlayer 字典驱动,因此只需更改导入语句,路由处理函数代码无需修改。

    可以。JSON 同步插件 将您的 /messages/{locale}/{namespace}.json 文件作为单一真实来源(source of truth),并双向生成 Intlayer 字典。PO 同步插件 对 gettext 目录执行相同的操作,而 按语言环境组织的文件 允许您按语言拆分内容,而不是将所有语言打包到一个文件中。

    不需要。运行 npx intlayer extract,Intlayer 会读取您的源码文件,提取面向用户的字符串,并在每个组件旁边生成 .content 文件,这样您只需审查 diff,而无需手动逐一复制字符串到语言目录中。请参阅 extract 命令

    在同一项目的前端部分,Intlayer Compiler 则更进一步,可以在构建时直接从 JSX、TSX、Vue 或 Svelte 源码生成字典,使应用的前后端共享同一套内容层,完全无需手动维护键名。

    共有 5 个工具,均为可选:

    • VS Code 扩展:从 useIntlayer 键跳转到声明它的内容文件,从组件中提取内容,并从命令面板或专属的 Intlayer 选项卡运行 build、fill、test、push 和 pull。
    • LSP 服务器:在任何支持 LSP 的编辑器中提供相同的感知能力,支持跳转到定义、查找所有引用、悬停预览翻译值、键和字段的自动补全,以及在键未声明时发出警告。它还可以解析 i18nextreact-i18nextnext-intluse-intl 调用,助力平滑迁移。
    • MCP 服务器:向 Cursor、VS Code、Claude Desktop、Claude Code 和 ChatGPT 公开 Intlayer 文档与 CLI,使 AI 助手能够基于最新文档进行准确回答,并能自行运行 intlayer fill 等命令。
    • Agent Skills:针对特定领域的技能(如 intlayer-configintlayer-cliintlayer-content,以及每个框架对应的专属技能),教导 AI 代理您的路由配置和内容节点类型。
    • ESLint 插件no-raw-text 规则标记硬编码字符串,并提供针对静态字典键和未使用内容的额外规则。