You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在函数中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:01:02