能否在函数中获取Aurelia I18N实例?无需使用@inject?
当然可以!在Aurelia里,哪怕不用@inject装饰器,也有几种靠谱的方式能拿到I18N实例,下面给你分享几个实用的例子:
方法一:通过Aurelia全局容器获取
如果你的代码在Aurelia应用启动后的上下文里,可以直接通过应用实例的容器来获取I18N。比如在项目的启动文件(通常是main.ts)里:
import { Aurelia } from 'aurelia-framework'; import { I18N } from 'aurelia-i18n'; export async function configure(aurelia: Aurelia) { aurelia.use .standardConfiguration() .plugin('aurelia-i18n', (instance) => { // 先完成I18N的基础配置 instance.setup({ resources: { // 这里填你的语言资源路径或配置 }, lng: 'en', fallbackLng: 'en' }); }); await aurelia.start(); aurelia.setRoot('app'); // 在这里直接从容器resolve I18N实例 const i18n = aurelia.container.get(I18N); console.log(i18n.tr('hello')); // 测试翻译功能 }
方法二:在组件中通过
this.container获取 如果你的组件类是由Aurelia负责实例化的(比如自定义元素、页面视图模型这些),哪怕你没给类注入任何依赖,也能直接访问实例上的this.container属性,再通过它获取I18N:
import { I18N } from 'aurelia-i18n'; export class MyProfileComponent { handleButtonClick() { // 直接从组件的容器中获取I18N const i18n = this.container.get(I18N); const greeting = i18n.tr('profile.greeting'); alert(greeting); } }
小提示:这种方式只对Aurelia管理的类生效,因为框架会自动把容器挂载到实例的
container属性上。
方法三:全局挂载I18N实例(应急用,不推荐)
如果你需要在完全脱离Aurelia管理的普通函数里用I18N,可以在启动时把实例挂载到window全局对象上:
// 在main.ts的configure函数中 aurelia.use .plugin('aurelia-i18n', async (instance) => { await instance.setup({ // 你的I18N配置 }); // 挂载到window全局 (window as any).globalI18n = instance; });
之后在任意普通函数里就能直接用了:
function utilityFunction() { const i18n = (window as any).globalI18n; console.log(i18n.tr('utility.message')); }
注意:这种方式会污染全局命名空间,大型项目里尽量别用,优先选择前两种依赖容器的方式,更符合Aurelia的设计理念。
内容的提问来源于stack exchange,提问作者Efim Vl. Dejin




