如何处理月份名称变形 - Angular 日期本地化

How to handle month names inflection - Angular date localization

我 运行 最近遇到了一个问题 - 在我的 angular 应用程序的某些部分中,我必须以以下格式显示日期:MMMM yyyy,以及Angular UI Bootstrap 框架。

基本问题是,在某些语言中,主格和属格中月份的拼写不同。在我的例子中是波兰语、乌克兰语和俄语。

默认情况下 MMMM 代表属格中的月份名称,这通常是有道理的。

尽管我注意到在 angular 中 Russian and Polish language there is a property STANDALONEMONTH which, as I see, stands for month name in nominative. (though file for Ukrainian 的语言环境文件中缺少该部分)

虽然我不太确定如何使用这些。 我的基本建议是为 dateFilter.

使用装饰器

所以问题是 - 在 angular 中是否有处理月份名称变形的标准方法,或者常用的解决方法,以便第三方库使用 $locale 将使用正确的月份名称。

例子

date: '2016-01-20'

en-us: 
'dd MMMM yyyy' -> '20 January 2016'  
'MMMM yyyy'    -> 'January 2016'    

uk-ua: 
'dd MMMM yyyy' -> '20 січня 2016'    // genitive case - it is fine
'MMMM yyyy'    -> 'січня 2016'      // wrong: should be 'січень 2016'

pl-pl: 
'dd MMMM yyyy' -> '20 stycznia 2016' // genitive case - it is fine
'MMMM yyyy'    -> 'stycznia 2016'    // wrong: should be 'styczeń 2016'

如您所见 - 对于乌克兰语和波兰语,月份的名称在这两种情况下应该有不同的结尾。对于波兰语和俄语,angular 语言环境文件 (STANDALONEMONTH) 中也有一个大小写正确的月份名称。虽然我不太确定它们在任何地方都被使用 - 无法找到用法,或者我可能遗漏了一些东西。

前段时间我在 Angular 1.3 中处理类似问题时,我在内置语言环境服务中找不到任何内容,所以我通过手动创建一个包含翻译的列表解决了这个问题正确的大小写并按月份编号引用它们,例如 {{monthNamesNominative[monthNumber]}} where var monthNamesNominative = ['Январь', 'Февраль', ...]。这里的额外好处是您可以直接控制字符串,如果您需要稍微不同的大小写,则不必进行额外的跳转。

话虽如此,Angular 1.5 中的语言环境服务在主格中具有带有月份名称的 LLLL 标记,并且似乎在您提出此问题四天后 bug Angular 阻止其正确使用的问题已修复,从 1.5.1 版开始使用它可能会更好。