angular - 将资产翻译文件嵌入到 Angular Web 组件中
问题描述
我正在尝试使用 Angular 创建一个 Web 组件。为了管理翻译,我使用 ngx-translate ( https://github.com/ngx-translate/core )。
这就是我加载转换文件的方式:
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http, 'assets/i18n/', '.json');
}
这是一个简单的 .html 文件,其中包含了我的 Web 组件:
<!DOCTYPE html>
<html>
<head>
<title>Example Website with Embedded Angular Web Component</title>
<script src="https://mydomain.it/widget-calendar.js"></script>
<link href="https://mydomain.it/widget-calendar.css" rel="stylesheet">
</head>
<body>
<optix-calendar api-key="apiKey"
signup-title="Amazing newsletter!">
</optix-calendar>
</body>
</html>
我的 webcomponents 应该在多个站点中使用,因此在不同的域中。我想知道如何将我的翻译文件嵌入到我的网络组件中。我尝试使用绝对 url 来加载它们(否则 Angular 会在使用我的 Web 组件的用户的本地 pc 中寻找它们)但是我遇到了 CORS 的问题,我问自己这是否是正确的解决方案. 我一直在寻找有关它的文档,但我没有找到任何处理资产内容的最佳实践。在我的 Web 组件中嵌入资产翻译的最佳方法是什么?
解决方案
我遇到了同样的问题,并通过将翻译文件写入 .ts 而不是 .json 文件来解决它。然后将它们加载到服务中,该服务在主组件中启动。
本地化.服务.ts:
import { TranslateService } from '@ngx-translate/core';
import { Injectable } from '@angular/core';
import en from 'src/app/shared/i18n/en';
import es from 'src/app/shared/i18n/es';
import de from 'src/app/shared/i18n/de';
@Injectable({
providedIn: 'root'
})
export class LocalizationService {
constructor(private translate: TranslateService) {
this.translate.setTranslation('de', de);
this.translate.setTranslation('en', en);
this.translate.setTranslation('es', es);
this.translate.setDefaultLang('en');
}
use(language: string): void {
this.translate.use(language);
}
}
并且在主要成分中
app.component.ts:
import { Component, Input } from '@angular/core';
import { LocalizationService } from 'src/app/shared/localization.service';
@Component({
selector: 'app-warehouse',
template: '<span>{{"food.bestCookies" | translate}}</span>',
})
export class WarehouseComponent {
@Input() language: string = 'en';
constructor(localization: LocalizationService) {
localization.use(this.language);
}
}
实体
export default {
food: {
bestCookies: 'The perfect cookies'
}
};
es.ts
export default {
food: {
bestCookies: 'Las galletas perfectas'
}
};
de.ts
export default {
food: {
bestCookies: 'Die perfekten Kekse'
}
};
灵感来自https://blog.kalvad.com/export-your-angular-component-as-a-web-component/
推荐阅读
- wpf - WPF 绑定 ListView 双击事件
- jquery - 使用 Blazor webassembly 在后台上传文件
- ios - iOS WKWebView 允许从本地存储附加输入文件
- mongodb - 从谷歌云存储流恢复“mongodump”备份
- java - 如何使用android中的按钮从另一个片段中打开一个片段
- javascript - 在 Javascript 中处理货币
- javascript - 在不改变状态、道具或父级的情况下反应子级渲染
- javascript - 如何通过一台 Express 服务器部署不同的 React Web 应用程序?
- python - Docker 没有保存 Scrapy 蜘蛛的输出文件
- python - 有人可以帮我理解下面的代码吗