• 首页
  • 产品中心
    • 数式Oinone四大产品

      低代码开发平台无代码开发平台集成开发平台AI大模型开发
    • 数式Oinone体系能力

      用户与组织权限管理文件管理消息中心国际化业务审计
    • 数式Oinone核心产品特性

      低无一体面向软件公司场景无限制应用级扩容可分可合
  • 服务中心
    • 客户服务

      预约演示方案咨询私有部署找人定制
    • 开发者

      问答下载
    • Oinone学院

      社区学习

    《精讲面向软件公司的低代码平台——以Oinone为例》

  • 合作伙伴
    渠道申请伙伴名录专家库
  • 关于数式
0571-88757863

Translate Service


In Oinone Kunlun, a "translation" module is built - in. Combined with the front - end "buried point" translation function, it can realize the translation function for any language. This article will introduce the use of the "translation" function and its implementation details.

Note:

This chapter does not involve the specific operations and usage of the "translation" module, but only introduces the front - end translation function and implementation details. For content related to the operation of the "translation" module, please refer to: User Manual - Translation

Ⅰ. Using the Translation Function in Widget Components

When declaring some properties input by users, we can process the corresponding content through the translateValueByKey method, so that the specified content can be translated into other languages. As shown below:

@Widget.Reactive()
public get title(): string {
  return translateValueByKey((this.getDsl().title as string) || 'Title');
}

Note:

When using the translation function, it can only be used normally after the VueOioProvider finishes loading the language. Therefore, we cannot use the translation function when defining global variables, but use it through initialization or reactive properties in the component.

Ⅱ. Using the Translation Function in Vue Template

To make it more convenient to use the translation function in Vue Template, we have registered a global $translate method, whose internal implementation is exactly the same as the translateValueByKey method. As shown below:

<span>{{ $translate(title) }}</span>

Solving TypeScript Type Declaration Issues

For custom global methods, to be used normally in Vue Template without causing TypeScript type checking errors, we need to add a type declaration file shim-translate.d.ts in the src directory to solve the TypeScript type declaration problem.

export {};

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $translate<T extends string | null | undefined = string | null | undefined>(text: T): T;
  }
}

Note:

Although the two methods can achieve exactly the same function, we prefer to recommend using the translation function in Vue Template. This way, the translation function will not fail due to the inheritance and rewriting of the Widget component.

But this is just a recommended usage. If it involves translation functions for different business logics, you need to decide where to use the translation function according to the actual situation.

Ⅲ. Variable Handling

What if the text to be translated contains variables? Here we provide some implementation methods, and readers can choose the most appropriate variable handling method according to the usage habits of the target users.

(Ⅰ) Simple Variable Replacement

Replace in order through "{}" placeholders, as shown below:

export function translateFormat(text: string, ...args: string[]): string {
  for (const arg of args) {
    text = text.replace('{}', arg);
  }
  return text;
}

Usage Example

const errorMessage = 'Import failed, {} is not allowed to be empty';
console.log(translateFormat(translateValueByKey(errorMessage), translateValueByKey('Name')));

// Console output in Chinese
// 导入失败,名称 不允许为空

// Console output in English
// Import Failed, The name cannot be empty.

In this example, we only need to add two translation items:

Original ValueTarget Value
导入失败,{} 不允许为空Import Failed, The {} cannot be empty.
名称name

(Ⅱ) Functional Replacement

Use variable names for global replacement, as shown below:

export interface TranslateVariable {
  [key: string]: string | (() => string);
}

export function translateFormat(text: string, args?: TranslateVariable): string {
  if (args) {
    return text.replace(/\$(\w+)/g, (_, varName) => {
      const val = args[varName];
      if (val instanceof Function) {
        return val() || _;
      }
      return val || _;
    });
  }
  return text;
}

Usage Example

const errorMessage = 'Import failed, $field is not allowed to be empty';
console.log(
  translateFormat(translateValueByKey(errorMessage), {
    field: translateValueByKey('Name')
  })
);

// Console output in Chinese
// 导入失败,名称 不允许为空

// Console output in English
// Import Failed, The name cannot be empty.

In this example, we only need to add two translation items:

Original ValueTarget Value
导入失败,$field 不允许为空Import Failed, The $field cannot be empty.
名称name

(Ⅲ) Using the Third - Party Library mustache.js for Template Replacement

Install Third - Party Library Dependencies

npm install mustache@4.2.0

Use mustache for template replacement, as shown below:

export function translateFormat(text: string, args?: Record<string, any>): string {
  if (args) {
    return mustache.render(text, args);
  }
  return text;
}

Usage Example

const errorMessage = 'Import failed, {{field}} is not allowed to be empty';
console.log(
  translateFormat(translateValueByKey(errorMessage), {
    field: translateValueByKey('Name')
  })
);

// Console output in Chinese
// 导入失败,名称 不允许为空

// Console output in English
// Import Failed, The name cannot be empty.

In this example, we only need to add two translation items:

Original ValueTarget Value
导入失败, 不允许为空Import Failed, The cannot be empty.
名称name

Note:

For more information about mustache, please refer to: mustache.js

Ⅳ. Obtaining the Translation File Address Format

The "translation" module will save the translation files in the file system through the "refresh remote resources" action. The front - end will obtain the remote translation resource files during system initialization according to the module name and save them in the cache. The following is the translation file address format:

`${runtimeConfig.I18N_OSS_URL || process.env.I18N_OSS_URL || ''}/translate/${moduleName}/i18n_${langCode}.js`
  • runtimeConfig.I18N_OSS_URL: Configure the address prefix through the runtime configuration I18N_OSS_URL.
  • process.env.I18N_OSS_URL: Configure the address prefix through the compile - time configuration I18N_OSS_URL.
  • moduleName: The module name. The login page uses common as the module name, that is, the global translation items.
  • langCode: ISO language code.

Note:

If there is a scenario where the translation is missing or incorrect, you can generally determine whether the configuration is correct through the translation file address.

You can first check whether the module name and ISO language code match the current page for troubleshooting.

Edit this page
Last Updated:1/15/26, 4:02 AM
Prev
Expression Service
Next
View architectures
默认页脚
Copyright © 2026 Mr.Hope