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
函数由正确的键返回。
我们的项目实现了 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
函数由正确的键返回。