我尝试在Angular 9(基于monorepo)应用中动态导入locale,我做了如下操作:
import { Injectable } from '@angular/core';
import { registerLocaleData } from '@angular/common';
@Injectable()
export class LocaleService {
...
private capitalize(str: string): string {
return str.charAt[0].toUpperCase() + str.substring(1).toLowerCase();
}
registerLocales() {
for (const lang of ['de', 'fr', 'es']) {
const basePkg = `locale${this.capitalize(lang)}`;
const extraPkg = basePkg + 'Extra';
const base = import(`@angular/common/locales/${lang}`).then(m => m[basePkg]);
const extra = import(`@angular/common/locales/extra/${lang}`).then(m => m[extraPkg]);
registerLocaleData(base, extra);
}
}
}
而不是:
import { Injectable } from '@angular/core';
import { registerLocaleData } from '@angular/common';
import localeDe from '@angular/common/locales/de';
import localeDeExtra from '@angular/common/locales/extra/de';
import localeEs from '@angular/common/locales/es';
import localeEsExtra from '@angular/common/locales/extra/es';
import localeFr from '@angular/common/locales/fr';
import localeFrExtra from '@angular/common/locales/extra/fr';
@Injectable()
export class LocaleService {
...
registerLocales() {
registerLocaleData(localeDe, localeDeExtra);
registerLocaleData(localeEs, localeEsExtra);
registerLocaleData(localeFr, localeFrExtra);
}
}
在这段代码中,即使执行,我也会得到一大堆由表单导入引起的错误:
警告:/home/me/某存储库/节点模块/@Angular /公共/区域设置/zu. d. ts模块构建失败(来自/home/me/某存储库/节点模块/@ngtools/webpack/src/index. js):错误:TypeScript编译中缺少/home/me/somerepo/node_modules/@angular/common/locales/zu. d. ts。请通过"files"或"include"属性确保它位于您的tsconfig中。
注解掉导入并调用registerLocaleData
可以消 debugging 误。我到底做错了什么?
5条答案
按热度按时间qni6mghb1#
Eliseo的评论中提到的excellent article就有答案了,Typescript的
import
函数不是普通的函数调用,简而言之,import告诉Webpack为与参数中的模式匹配的 everything 创建块,这是一个问题,因为该模式与locales目录中的所有.d.ts
文件匹配。而实际上我们只需要.js
文件。解决方法是使用Webpack的“魔术注解”。下面的注解足以让所有内容正确加载:但是...有几个问题。
1.* 每一个 * 语言环境都被转换成一个块。这会产生超过1,000个块。
1.这些组块只是作为名称给出的数字。
魔术评论再次出手相救:
这就更接近了,创建了两个块而不是数千个,但它们是“大”的。如果我们知道我们感兴趣的区域设置,我们可以做得更好。
这将逻辑从指定忽略哪些文件改为指定加载哪些文件,结果块大小约为100 Kb,而不是6 Mb。
xoefb8l82#
我采用了一种不同的方法,决定使用@ngx-translate来管理翻译,并使用@ngx-translate/http-loader在应用程序加载时从JSON文件动态加载翻译。这将使构建规模更小,因为它不构建/捆绑翻译。它只是将翻译后的JSON文件作为资产进行复制
文件夹结构如下所示:
将src/i18 l/目录添加到angular.json中的
assets
:在app.module.ts中设置翻译模块
我喜欢在我的environments/enviornation.ts文件中保留可用翻译的列表:
然后你需要在应用加载的某个时候选择并加载翻译。为了简单起见,这是app.component.ts中的一个例子
在app.component.html中创建一个基本表单,供用户选择翻译
设置翻译表单和应用程序初始化。这只是一个简单的例子。然后你可以按照文档如何在你的应用程序中使用翻译服务。
我从来没有使用过
@angular/common/locale
。我意识到这可能不是一个确切的修复webpack的问题。希望它可以帮助其他人,如果他们正在寻找翻译解决方案。iih3973s3#
我可以用这个把我的特定语言注册到angular的pipe中
我试着用字符串正则表达式符号
^
开始显式的单词匹配,但是由于某种原因,它没有通过。所以我试着用单词边界正则表达式符号\b
,看起来很有效。如果你想消除其他嵌套的文件夹,你可能需要添加一个/* webpackExclude: /folder\/.*\.mjs/ */
。mbyulnm04#
我有一个以上所有的组合,但不断得到区域设置未加载,所以我现在有一个运行的版本,或多或少像这些变化:
在
tsconfig.json
中,我将模块更改为esnext
添加了一个函数,用于在
src/app/services/locale.service.ts
中动态导入语言环境(Angular 14已验证)在
main.ts
中(如何避免未加载语言环境)在
app.module.ts
中,我们加载提供程序:还有一个locale服务,用于存储当前的locale,
src/app/services/locale.service.ts
ff29svar5#
我从几个答案中得出的综合解决方案是
app.module.ts中的提供程序
然后在app.component.ts的构造函数中
然后希望angular为我的每个客户提供一个区域设置,因为此解决方案没有fallbak