ngx translate 是否能够基于 SQLesque `LIKE` 比较或至少 string.startsWith() 类型比较来匹配键?

Is ngx translate capable of matching a key based on a SQLesque `LIKE` comparison, or at least a string.startsWith() type comparison?

我们的项目实现了 ngx t运行slate 来为应用程序提供 t运行slation 功能。

在这种情况下,我需要将它用于一些机器配置数据而不是真正的“语言”。

更具体地说,我正在将大量 XML 定义转换为 yaml,但我 运行 变成了一些这样的情况(注意 MACHINE_MODEL ISLIKE 470*) :

<ENTRY DESC="OG 470">
    <CRITERIA>
        <CONDGROUP COMBINE="AND">
           <CONDITION NAME="MACHINE_VENDOR" OP="EQ">OG</CONDITION>
           <CONDITION NAME="MACHINE_TYPE" OP="EQ">OGSERIES</CONDITION>
           <CONDITION NAME="MACHINE_MODEL" OP="ISLIKE">470*</CONDITION>
        </CONDGROUP>
    </CRITERIA>
    <PARAMS>
        <PARAMLIST NAME="DEVICES">
        .
        .
        .

我知道 yaml 的 anchor/alias 功能并建议像这样使用它:

'OG':
    '4700': &OG4700Series
        config:
            .
            .
            .
    '4701': *OG4700Series
    '4702': *OG4700Series
    '4750': *OG4700Series

但是,产品管理想要实现通配符功能。有没有在 .yaml 中执行此操作的好方法,或者我是否应该开始尝试通过以某种方式将另一个元素添加到为 t运行slate 服务传递的键数组来尝试推出我自己的解决方案?

默认情况下,ngx-translate 不支持这种类型的 comparison,但它提供了一种自定义默认 parser (TranslateDefaultParser) 的方法,方法是实现您的拥有 parser 以使用它而不是默认的。

如果你看一下 TranslateDefaultParser,你会注意到 getValue 函数用于解析传递的 key/keys 并获得正确的值来自提供的翻译:

getValue(target: any, key: string): any {
  let keys = typeof key === 'string' ? key.split('.') : [key];
  key = '';
  do {
    key += keys.shift();
    if (isDefined(target) && isDefined(target[key]) && (typeof target[key] === 'object' || !keys.length)) {
      target = target[key];
      key = '';
    } else if (!keys.length) {
      target = undefined;
    } else {
      key += '.';
    }
  } while (keys.length);

  return target;
}

因此您可以通过扩展 TranslateDefaultParser class 并覆盖 getValue 函数来创建自己的 parser class 以实现所需的 comparison:

export class TranslateCustomParser extends TranslateDefaultParser {
  /** Gets a value from an object by composed key
   * parser.getValue({ key1: { keyA: 'valueI' }}, 'key1.keyA') ==> 'valueI'
   * @param target the translation object that contains all the keys and values.
   * @param key the passed key from instant/get function or to `translate` pipe.
   */
  getValue(target: any, key: string) {
    // here you can implement the custom `comparison` you need, then return the proper value.
  }
}

然后你可以配置 TranslateModule 来使用它而不是默认的:

@NgModule({
  imports: [
    TranslateModule.forChild({
      parser: {
        provide: TranslateParser,
        useClass: TranslateCustomParser,
      },
    }),
  ],
})

现在,当您从 TranslateService 调用 instant/get 函数或使用 translate 管道时,要获取特定键的翻译,该值将使用新解析器的 getValue 函数由正确的键返回。