如何在 Firebase 托管中提供有效的 AOT 语言 Angular 应用程序?
How to serve effective AOT language Angular app in Firebase hosting?
我有一个 angular 4 应用程序,由 Firebase 托管服务托管,带有自定义域(例如:www.something.com,重定向到 firebase url)。
我使用了 i18n 国际化,我的问题是:
哪个是根据用户国家提供正确编译应用程序的最佳方式?
目前只有标准的 --aot en 在线,如果有人来自意大利,我想提供 --aot it 版本。
谢谢
我遇到了同样的问题,但找不到解决方案。所以我创建了另一种使用 i18n 国际化的方法。这样我就可以在单个构建中使用多种语言。
我不确定这是否是最好的方法,但这是我的方法:
我创建了一个非常简单的服务来提供 window。以 root 身份提供!
function _window(): any {
// return the global native browser window object
return window;
}
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window();
}
public ln = 'en'; //default language
constructor() {
try {
if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
let lang = this.nativeWindow.navigator.language;
if (lang.indexOf('-') >= 0) {
lang = lang.split('-')[0]; //replace en-us with en.
}
this.ln = lang;
}
} finally {
}
}
}
对于默认的 angular 管道,我创建了一个简单的包装器:
@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
constructor(private win: WindowRef) {
super(win.ln);
}
transform(value: any, pattern?: string): string | null {
return super.transform(value, pattern);
}
}
对于文本,我创建了一个非常简单的管道:
@Pipe({name: 'translate'})
export class TranslationPipe implements PipeTransform {
constructor(private translationService: TranslationService) {
}
transform(value: string) {
return this.translationService.getTranslation(value);
}
}
管道使用此翻译服务:
@Injectable()
export class TranslationService {
lng: string = 'en';
nl: Array<KV> = [
{key: 'Hello', value: 'Hallo'},
];
languages = [
{key: 'nl', value: this.nl}
];
constructor() {
if (!isNullOrUndefined(navigator.language)) {
this.lng = navigator.language;
}
if (this.lng.indexOf('-') >= 0) {
this.lng = this.lng.split('-')[0];
}
}
getTranslation(key: string): string {
return this.findByKey(this.findByKey(this.languages, this.lng), key) || key;
}
private findByKey(list: { key, value }[], key: string): any {
if (!isNullOrUndefined(list)) {
for (let i = 0; i < list.length; i++) {
if (list[i].key === key) {
return list[i].value;
}
}
}
return undefined;
}
}
export class KV {
key: string;
value: string;
}
我希望你会发现这个有用
我也运行遇到了同样的问题。
我通过更改 firebase.json
Hosting 属性
来完成它
{
"hosting": {
"public": "dist",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"redirects": [
{
"source" : "/",
"destination" : "/en",
"type" : 301
}
],
"rewrites": [
{
"source": "/en/**",
"destination": "/en/index.html"
},
{
"source": "/es/**",
"destination": "/es/index.html"
},
{
"source": "/fr/**",
"destination": "/fr/index.html"
}
]
}
}
希望对您有所帮助!
我有一个 angular 4 应用程序,由 Firebase 托管服务托管,带有自定义域(例如:www.something.com,重定向到 firebase url)。 我使用了 i18n 国际化,我的问题是: 哪个是根据用户国家提供正确编译应用程序的最佳方式? 目前只有标准的 --aot en 在线,如果有人来自意大利,我想提供 --aot it 版本。
谢谢
我遇到了同样的问题,但找不到解决方案。所以我创建了另一种使用 i18n 国际化的方法。这样我就可以在单个构建中使用多种语言。
我不确定这是否是最好的方法,但这是我的方法:
我创建了一个非常简单的服务来提供 window。以 root 身份提供!
function _window(): any {
// return the global native browser window object
return window;
}
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window();
}
public ln = 'en'; //default language
constructor() {
try {
if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
let lang = this.nativeWindow.navigator.language;
if (lang.indexOf('-') >= 0) {
lang = lang.split('-')[0]; //replace en-us with en.
}
this.ln = lang;
}
} finally {
}
}
}
对于默认的 angular 管道,我创建了一个简单的包装器:
@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
constructor(private win: WindowRef) {
super(win.ln);
}
transform(value: any, pattern?: string): string | null {
return super.transform(value, pattern);
}
}
对于文本,我创建了一个非常简单的管道:
@Pipe({name: 'translate'})
export class TranslationPipe implements PipeTransform {
constructor(private translationService: TranslationService) {
}
transform(value: string) {
return this.translationService.getTranslation(value);
}
}
管道使用此翻译服务:
@Injectable()
export class TranslationService {
lng: string = 'en';
nl: Array<KV> = [
{key: 'Hello', value: 'Hallo'},
];
languages = [
{key: 'nl', value: this.nl}
];
constructor() {
if (!isNullOrUndefined(navigator.language)) {
this.lng = navigator.language;
}
if (this.lng.indexOf('-') >= 0) {
this.lng = this.lng.split('-')[0];
}
}
getTranslation(key: string): string {
return this.findByKey(this.findByKey(this.languages, this.lng), key) || key;
}
private findByKey(list: { key, value }[], key: string): any {
if (!isNullOrUndefined(list)) {
for (let i = 0; i < list.length; i++) {
if (list[i].key === key) {
return list[i].value;
}
}
}
return undefined;
}
}
export class KV {
key: string;
value: string;
}
我希望你会发现这个有用
我也运行遇到了同样的问题。
我通过更改 firebase.json
Hosting 属性
{
"hosting": {
"public": "dist",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"redirects": [
{
"source" : "/",
"destination" : "/en",
"type" : 301
}
],
"rewrites": [
{
"source": "/en/**",
"destination": "/en/index.html"
},
{
"source": "/es/**",
"destination": "/es/index.html"
},
{
"source": "/fr/**",
"destination": "/fr/index.html"
}
]
}
}
希望对您有所帮助!