动态更改 angular-google-maps 语言

Change angular-google-maps language dynamically

是否可以在更改语言时动态更改地图语言? 或者至少在我下次访问时更改语言地图(更改语言后)。

我可以使用此代码(在 mymap.module.ts 中)在地图加载时设置默认语言:

@NgModule({ imports: [ 
  AgmCoreModule.forRoot({ apiKey: 'MY_KEY',
  language: 'es', }),
  ]
})

我可以使用 this.translate.currentLang(在 mymap.component.ts 中)获取当前语言。

但我不知道如何将两者结合起来。

为了改变地图的语言,需要重新获取一堆本地化的JS脚本。因此,您可以尝试刷新整个页面(JS 而不是 Angular),通过本地存储提供所需的语言,例如:

@NgModule({ 
  imports: [ 
    AgmCoreModule.forRoot({ 
      apiKey: 'MY_KEY',
      language: localStorage && localStorage.gml || 'en'
    }),
  ]
})

要重新加载您的页面,请使用 window.location.reload() 方法

StackBLITZ:https://stackblitz.com/edit/angular-google-maps-demo-f3xzhn?file=app%2Fapp.module.ts

在 app.component 中添加以下确保在语言更改时更新本地存储中的 "lang" 并使用 window.location.reload()

重新加载页面
export class AppComponent implements OnInit {
  constructor() { }

  ngOnInit() {

    var script = document.createElement('script');
    script.src = `https://maps.googleapis.com/maps/api/js?v=quarterly&key=${KEY}&libraries=places&language=${localStorage && localStorage.lang || 'en'}`;
    document.head.appendChild(script);
  }
}

在您的相关模块中添加:

@NgModule({ 
  imports: [ 
    AgmCoreModule.forRoot(),
  ]
})

我知道很久以前就提出了这个问题,但我会向对解决方案感兴趣的任何人发送 link。它有点复杂,但它适用于 AOT AgmCoreModule - Load Google API KEY Dynamically from Angular service

我需要做一些类似的事情,动态加载语言和 API 密钥。

为此,我创建了一个名为 AppInitService 的 class。在这里,我将在我的应用程序中动态初始化各种属性,例如翻译 language/currency 或者,在 AGM 的情况下,API 键和语言。

在您的 app.module.ts 或您使用的任何内容中,您将添加以下提供程序:

import { NgModule, APP_INITIALIZER } from '@angular/core';
import { AgmCoreModule, LazyMapsAPILoaderConfigLiteral, LAZY_MAPS_API_CONFIG } from '@agm/core';

@NgModule({
  imports: [
    AgmCoreModule.forRoot({
      // The apiKey must always be set, even if empty.
      apiKey: 'MyApiKey'
    })
  ],
  providers: [
    {
      // APP_INITIALIZER is the Angular dependency injection token.
      provide: APP_INITIALIZER,
      // Pass in the AGM dependency injection token.
      deps: [LAZY_MAPS_API_CONFIG],
      // Allow for multiple startup injectors if needed.
      multi: true,
      // UseFactory provides Angular with the function to invoke.
      useFactory: (googleMapsConfig: LazyMapsAPILoaderConfigLiteral) => () => AppInitService.Init(googleMapsConfig)
    }
  ],
  bootstrap: [AppComponent]
})

export class AppModule { }

然后在 AppInitService.ts:

import { Injectable } from '@angular/core';
import { LazyMapsAPILoaderConfigLiteral } from '@agm/core';

@Injectable()
export class AppInitService {
  public static Init(googleMapsConfig: LazyMapsAPILoaderConfigLiteral) : Promise<void> {
    return new Promise<void>((resolve, reject) => {

      // Here you'll put in your call to retrieve your language code.
      const languageCode = GetMyLanguageCode();

      // And now we set it.
      googleMapsConfig.language = languageCode;

      // Resolve the promise as we're done.
      resolve();
    });
  }
}

有一个如何使用 Angular 应用程序初始化 here 的示例。我更喜欢静态函数,因为您不必为了使用它们而实例化 class。