【问题标题】:Is ngx translate capable of matching a key based on a SQLesque `LIKE` comparison, or at least a string.startsWith() type comparison?ngx translate 是否能够基于 SQLesque `LIKE` 比较或至少 string.startsWith() 类型比较匹配键?
【发布时间】:2021-09-14 19:28:43
【问题描述】:

我们的项目实现了 ngx translate 来为应用提供翻译功能。

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

更具体地说,我正在将大量 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 的锚/别名功能并建议使用它:

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

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

【问题讨论】:

  • 你想在组件模板中使用它(使用translate管道)还是使用instant/get函数的组件类?
  • @AmerYousuf 不在模板中,不在带有即时的打字稿等中。

标签: angular typescript yaml sql-like ngx-translate


【解决方案1】:

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 类并覆盖getValue 函数来实现所需的comparison 来创建自己的parser 类:

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函数。

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多