Angular 4 国际化

4
我正在使用 Angular 2 的本地化支持来处理日期和货币。
本地化设置是在主应用程序模块级别完成的。 如果我在应用程序模块设置中配置 LOCALE_ID 提供者,就可以自动获得本地化支持。
@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent ],
  providers: [
    { provide: LOCALE_ID, useValue: 'nl' }
  ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

现在,如果我在我的应用程序中使用货币管道,如下所示:
@Component({
  selector: 'my-app',
  template: '<h1>{{title}}</h1>' +
            '<div>{{convertNumber | currency}}</div>',
})

export class AppComponent {
   title = 'Currency Test';
   convertNumber = '12.30';
}

您可以在此plnkr代码中找到工作示例。
我得到了这个输出:USD 12,30
荷兰的货币汇率不是美元。
基于这个问题,我有两个问题:
1.当我配置LOCALE_ID时,到底发生了什么?这个本地化文件在哪里?
2.我不想看到USDEUR,我想看到货币符号本身(例如€)。根据文档,货币的默认配置是货币符号(€),而不是货币文本(EUR)。
显然,Angular 2的本地化文件是错误的。
我该如何找到并编辑这个文件?
谢谢。

1
请阅读CurrencyPipe的文档:https://angular.io/docs/ts/latest/api/common/index/CurrencyPipe-pipe.html - JB Nizet
1个回答

1
我已经浏览了源代码,以下是关于您的问题的发现:
首先,如果您查看第159行的货币管道currency,请参阅Source1 该管道调用formatNumber方法 => Source2 它返回NumberFormatter.format。到此为止,locale参数始终存在(但从未实际使用)
最后,在NumberFormatter.format源代码Source3中,它返回一个Intl.NumberFormat对象。

请看来自 mdn 的这个方法:https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat

使用该方法的货币选项如下:

var number = 123456.789;

// request a currency format
console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// → 123.456,79 €

那么让我们回到源代码,看看第二个参数中的currency选项是在哪里设置的。

https://github.com/angular/angular/blob/master/packages/common/src/pipes/intl.ts#L34

一个人可以期望Angular将“locale”参数转换为实际的本地货币(例如将“nl”转换为“EUR”),但实际上它没有这样做。
options.currency = typeof currency == 'string' ? currency : undefined;

如果您没有像这样传递货币输入:

'<div>{{convertNumber | currency:"EUR":true}}</div>',

工作中的plunker: https://plnkr.co/edit/Ln6br8ZKQdCbA8Ejn5Cr?p=preview

Angular将显示其默认行为,即USDSource4


我想为我的项目添加语言支持。如果我这样配置,就没有更改语言的选项。此外,我宁愿找到本地化文件的位置并进行修复。 - ankakusu
@ankakusu 我知道 :( 或许会有人纠正我,但目前似乎 Angular 没有本地化支持货币管道的功能,正如我所述。 - eko
2
@ankakusu 首先,nl是一种语言,设置特定语言时选择特定货币绝对没有理由。地球上所有说法语的人都不使用相同的货币。如果您使用nl_NL可能会有争议,但即使如此,Angular默认仅使用USD,并允许您显式指定其他货币。其次,正如这个答案所解释的那样,没有这样的文件可以修改。该管道依赖于标准的Intl api,由浏览器本身提供(或旧浏览器的polyfill)。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接