我假设你使用的是ember-moment
addon;并已配置config/environment.js
与
moment: {
// This will output _all_ locale scripts to assets/moment-locales
localeOutputPath: 'assets/moment-locales'
},
正如您所提及的。
Ember.$.getScript('/assets/moment-locales/ru.js');
提供了一种在需要时动态加载时刻ru
区域设置的方法。这意味着您不需要将相关语言环境包含到应用程序的JavaScript文件中,而是希望在应用程序中的某些用户请求中加载相关语言环境。通常最好在路由器的挂接方法(如beforeModel
或model
)内执行此类加载操作。
为了从moment
获得简短的月份名称;您通过
import moment from 'moment';
需要先进口ES6 moment
模块,并与
moment.monthsShort()
至于我可以看到接入短月份名称;您请求语言环境的方式存在问题,因此您收到了您提到的错误。我相信一个工作代码是纯文本更好的解释;因此我创建了以下git repository以说明如何在路线中动态更改区域设置,以及如何显示从moment
检索到的短名称。请通过克隆并在本地主机上运行来查看它。
在此存储库的应用程序中,application.hbs
包含指向5个子路径的链接;每个显示不同语言的月份短名称。动态加载相关语言环境的技巧的代码是routes/locale-route.js
文件的model
钩子方法。如果区域设置已经加载(请注意,默认情况下,英文是moment
),它只是通过切换到目标区域设置(moment.locale(localeToLoad);
)返回月份的短名称。否则,它会对服务器执行远程调用,并等待响应(使用承诺)返回月份名称。所有5种不同语言的路线都从这条基地路线延伸而来。一旦从服务器加载语言环境,您不再需要再次加载它,并且locale-route
已经按照我的解释处理它。我希望有所帮助。
看完您的评论后,我更新了源代码以包含ember-cli-mirage
。 Mirage是一款客户端模拟服务器,用于开发,测试和原型化您的应用程序。一旦你将它作为一个依赖包含它开始拦截你的远程调用请求。因此,在你的情况下,海市蜃楼拦截要求相关区域设置的请求。你需要做的是通过海市蜃楼传递语言环境。为了做到这一点,你需要添加以下
this.passthrough('/assets/moment-locales/**');
到mirage/config.js
让海市蜃楼不会在运行要求苛刻的时刻,语言环境干扰。请参阅我提供的git存储库下的related file。这肯定会解决你的问题。
有什么不清楚我的答案?请克隆我提供的源代码,并在需要时提出进一步的问题。 – alptugd