带有后端的 Spartacus Storefront 多站点 I18n

Spartacus Storefront Multisite I18n with Backend

我们在执行 I18n 时 运行 遇到了 MultiSite Spartacus 设置的一些问题。

  1. 我们希望每个站点都有不同的翻译,所以我们将它们放在 API 上,这样可以返回依赖于 baseSite 的消息,例如:backend.org/baseSiteX/messages?group=common
    但是 Spartacus 设置不允许我们通过 baseSite?我们可以 传递 {{lng}}{{ns}},但没有传递 baseSite。
    参见 https://sap.github.io/spartacus-docs/i18n/#lazy-loading 我们可以通过覆盖 i18nextInit 来实现,但我不确定如何实现。

  2. 在文档中,它说您可以在配置中使用 crossOrigin: true,但这似乎不起作用。类型检查说它不受支持,它仍然显示 uw CORS-issues

有人对这些问题有想法吗?

目前 i18n.backend.loadPath 配置中仅支持语言 {{lng}} 和块名称 {{ns}} 作为动态参数。

为了实现您的目标,您可以实施自定义 Spartacus CONFIG_INITIALIZER 以根据 BaseSiteService.getActive():

中的值填充您的 i18n.backend.loadPath 配置
@Injectable({ providedIn: 'root' })
export class I18nBackendPathConfigInitializer implements ConfigInitializer {
  readonly scopes = ['i18n.backend.loadPath']; // declare config key that you will resolve
  readonly configFactory = () => this.resolveConfig().toPromise();

  constructor(protected baseSiteService: BaseSiteService) {}

  protected resolveConfig(): Observable<I18nConfig> {
    return this.baseSiteService.getActive().pipe(
      take(1),
      map((baseSite) => ({
        i18n: {
          backend: {
            // initialize your i18n backend path using the basesite value:
            loadPath: `https://backend.org/${baseSite}/messages?lang={{lng}}&group={{ns}}`,
          },
        },
      }))
    );
  }
}

并在您的模块中提供(即在 app.module 中):

@NgModule({
  providers: [
    {
      provide: CONFIG_INITIALIZER,
      useExisting: I18nBackendPathConfigInitializer,
      multi: true,
    },
  ],
  /* ... */
})

注意:上述解决方案假定活动基站仅在应用程序启动时设置一次(默认情况下在 Spartacus 中就是这种情况)。