Angular的i18n非常棒,像ng-packagr这样的工具使得组件库打包变得非常容易,但它们可以结合使用吗?
如果我想打包和分发一个含有可翻译组件的组件库,是否可能?我应该如何打包这样的库?翻译文件会随包一起发布,还是应该在主要应用程序中定义?
如果有人能指点我一些文档就太好了。谢谢。
如果我想打包和分发一个含有可翻译组件的组件库,是否可能?我应该如何打包这样的库?翻译文件会随包一起发布,还是应该在主要应用程序中定义?
如果有人能指点我一些文档就太好了。谢谢。
当您使用CLI(使用ng xi18n
)为主应用程序生成翻译文件时,库中带有i18n属性的元素将被导入到翻译文件中。然后,您可以在主应用程序中定义这些翻译。
有两种方法可以实现这一点 - 静态提供资产并在构建时进行捆绑,或在运行时配置翻译路径。
为了在构建时静态包含文件,您只需在代码中使用 setTranslations
,如 https://github.com/ngx-translate/core 文档中所述。然后,您可以将翻译与代码捆绑在一起。
更好的方法是让消费者知道该使用什么。为了能够正确地提供翻译文件的路径(假设标准结构,其中每个翻译都驻留在包含语言名称的单独文件中),您可以执行以下操作:
interface TranslationsConfig {
prefix: string;
suffix: string;
}
export const TRANSLATIONS_CONFIG = new InjectionToken('TRANSLATIONS_CONFIG');
@NgModule({
declarations: [],
imports: [
NgxTranslateModule,
],
exports: [
NgxTranslateModule,
]
})
export class TranslateModule {
public static forRoot(config: TranslationsConfig): ModuleWithProviders {
return {
ngModule: TranslateModule,
providers: [
{
provide: TRANSLATIONS_CONFIG,
useValue: config
},
...NgxTranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient, TRANSLATIONS_CONFIG]
}
}).providers
],
};
}
}
这段代码确保在构建库时,AOT将能够解析类型(因此包括InjectionToken
等),并允许创建自定义翻译加载器。
现在只需要你实现加载器工厂或类来使用配置!这是我的实现(我正在使用PO文件进行翻译):
export function HttpLoaderFactory(http: HttpClient, config: TranslationsConfig) {
return new TranslatePoHttpLoader(http, config.prefix, config.suffix);
}
TranslateModule.forRoot(/* 在此处填写您的配置 */)
。如果这不是导出的主模块,则可以了解有关在层次化模块中使用 forRoot
的更多信息,请参阅链接:
Angular 7.2
中使用ng-packagr
工具? - Stephane