在服务/简单的 JS 文件中使用 Svelte i18n

Use Svelte i18n in service / simple JS file

我在我的项目中使用 Svelte i18n,它在我的 Svelte 组件中完美运行。

但是我有一些 JS 文件(例如常量),我想使用 i18n 来翻译一些键,比如 (in /services/constants.js) :

import { _ } from 'svelte-i18n'

export const STATUS_OK = 1;
export const STATUS_PENDING = 2;
export const STATUS_ERROR = 3;
export const STATUS_INACTIVE = 4;
export const STATUS_PRICE_NOT_FOUND = 5;

export const STATUTES = {
  [STATUS_OK]: {
    text: _('urls.statutes.ok'),
    class: 'text-green-500',
  },

但是我得到一个错误,我可以在 JS 文件中使用 _ 函数吗?还是我应该创建一种精巧的组件来处理我的常量?

如果我理解 svelte-i18n 的正确工作方式,_ 是一个 商店 ,这就是为什么您可以在组件

<p>{$_('urls.statuses.ok')}</p>

$ 创建一个订阅并获取商店的当前值,您可以在该商店上执行一个函数来获取给定的键。

在您的代码中您执行 _('urls.statuses.ok') 这是您尝试在 store 而不是在商店的 value 上执行的函数。而正是这个'value'真正为你提供了国际化的功能

你不能在 javascript 文件中使用 $,所以这里你有两个选择:

使用get()

您可以 import { get } from 'svelte/store' 这为您提供了一个函数,可以 return 商店的当前值,这意味着您可以将代码更改为如下所示:

text: get(_)('urls.statuses.ok')

它的一个缺点是它不会创建订阅,或者换句话说,如果语言改变,这个常量不会改变,因为 get 不会再 运行,它只有 运行 一次。

return 来自文本的函数

另一个选项是一个更大的变化,即将 text 重新定义为一个函数

text: _ => _('urls.statuses.ok')

这里我们将存储从外部传递到函数中,而不是将其直接导入到 javascript 文件中。用法是

<p>{STATUTES.STATUS_OK($_)}</p>

如您所见,我们将商店的值传递给函数,这意味着在函数内部我们可以按预期使用我们的商店,因为当语言改变时,这块将被重新评估,它将始终获得 current 语言而不是像我们在 get.

中获得的初始语言