diff --git a/eslint.config.ts b/eslint.config.ts
index 8dc7da5a5..13068d621 100644
--- a/eslint.config.ts
+++ b/eslint.config.ts
@@ -287,12 +287,12 @@ export default defineConfig([
files: ['**/*.vue'],
rules: {
'no-restricted-imports': [
- 'warn',
+ 'error',
{
paths: [
{
name: '@/i18n',
- importNames: ['t', 'd', 'st', 'te'],
+ importNames: ['t', 'd', 'te'],
message:
"In Vue components, use `const { t } = useI18n()` instead of importing from '@/i18n'."
}
@@ -301,13 +301,13 @@ export default defineConfig([
]
}
},
- // Non-composable .ts files must use the global t/d/st/te, not useI18n()
+ // Non-composable .ts files must use the global t/d/te, not useI18n()
{
files: ['**/*.ts'],
ignores: ['**/use[A-Z]*.ts', '**/*.test.ts', 'src/i18n.ts'],
rules: {
'no-restricted-imports': [
- 'warn',
+ 'error',
{
paths: [
{
diff --git a/src/components/graph/GraphCanvas.vue b/src/components/graph/GraphCanvas.vue
index aad7d6f24..66a9fb64f 100644
--- a/src/components/graph/GraphCanvas.vue
+++ b/src/components/graph/GraphCanvas.vue
@@ -111,6 +111,7 @@ import {
watch,
watchEffect
} from 'vue'
+import { useI18n } from 'vue-i18n'
import LiteGraphCanvasSplitterOverlay from '@/components/LiteGraphCanvasSplitterOverlay.vue'
import TopMenuSection from '@/components/TopMenuSection.vue'
@@ -137,7 +138,6 @@ import { useCopy } from '@/composables/useCopy'
import { useGlobalLitegraph } from '@/composables/useGlobalLitegraph'
import { usePaste } from '@/composables/usePaste'
import { useVueFeatureFlags } from '@/composables/useVueFeatureFlags'
-import { t } from '@/i18n'
import { LiteGraph } from '@/lib/litegraph/src/litegraph'
import { useLitegraphSettings } from '@/platform/settings/composables/useLitegraphSettings'
import { CORE_SETTINGS } from '@/platform/settings/constants/coreSettings'
@@ -175,6 +175,7 @@ import { isCloud } from '@/platform/distribution/types'
import { useFeatureFlags } from '@/composables/useFeatureFlags'
import { useInviteUrlLoader } from '@/platform/workspace/composables/useInviteUrlLoader'
+const { t } = useI18n()
const emit = defineEmits<{
ready: []
}>()
diff --git a/src/components/load3d/Load3dViewerContent.vue b/src/components/load3d/Load3dViewerContent.vue
index c85c4505e..71d6d1eea 100644
--- a/src/components/load3d/Load3dViewerContent.vue
+++ b/src/components/load3d/Load3dViewerContent.vue
@@ -94,6 +94,7 @@
diff --git a/src/renderer/extensions/linearMode/MobileMenu.vue b/src/renderer/extensions/linearMode/MobileMenu.vue
index 93abd3bb9..ce90b75f6 100644
--- a/src/renderer/extensions/linearMode/MobileMenu.vue
+++ b/src/renderer/extensions/linearMode/MobileMenu.vue
@@ -4,13 +4,15 @@ import {
CollapsibleTrigger,
CollapsibleContent
} from 'reka-ui'
+import { useI18n } from 'vue-i18n'
import WorkflowsSidebarTab from '@/components/sidebar/tabs/WorkflowsSidebarTab.vue'
import Button from '@/components/ui/button/Button.vue'
import Popover from '@/components/ui/Popover.vue'
import { useWorkflowTemplateSelectorDialog } from '@/composables/useWorkflowTemplateSelectorDialog'
-import { t } from '@/i18n'
import { useCommandStore } from '@/stores/commandStore'
+
+const { t } = useI18n()
diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue
index 6e392d8e0..d1cbfe27d 100644
--- a/src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue
+++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetRecordAudio.vue
@@ -85,8 +85,8 @@
import { useIntervalFn } from '@vueuse/core'
import { Button } from 'primevue'
import { computed, onMounted, onUnmounted, ref } from 'vue'
+import { useI18n } from 'vue-i18n'
-import { t } from '@/i18n'
import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets'
import { useToastStore } from '@/platform/updates/common/toastStore'
@@ -98,6 +98,8 @@ import { useAudioRecorder } from '../composables/audio/useAudioRecorder'
import { useAudioWaveform } from '../composables/audio/useAudioWaveform'
import { formatTime } from '../utils/audioUtils'
+const { t } = useI18n()
+
const props = defineProps<{
readonly?: boolean
nodeId: string
diff --git a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue
index 1a05ba25d..08e35c648 100644
--- a/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue
+++ b/src/renderer/extensions/vueNodes/widgets/components/form/dropdown/FormDropdown.vue
@@ -1,8 +1,8 @@
@@ -183,7 +191,7 @@ async function customSearcher(
({
useFirebaseAuthStore: vi.fn(() => mockFirebaseAuthStore)
}))
-vi.mock('vue-i18n', () => ({
- useI18n: vi.fn(() => mockI18n)
+vi.mock('@/i18n', () => ({
+ d: mockI18n.d
}))
vi.mock('@/utils/typeGuardUtil', () => ({
diff --git a/src/services/customerEventsService.ts b/src/services/customerEventsService.ts
index 6980f029d..326596de8 100644
--- a/src/services/customerEventsService.ts
+++ b/src/services/customerEventsService.ts
@@ -1,9 +1,9 @@
import type { AxiosError, AxiosResponse } from 'axios'
import axios from 'axios'
import { ref, watch } from 'vue'
-import { useI18n } from 'vue-i18n'
import { getComfyApiBaseUrl } from '@/config/comfyApi'
+import { d } from '@/i18n'
import { useFirebaseAuthStore } from '@/stores/firebaseAuthStore'
import type { components, operations } from '@/types/comfyRegistryTypes'
import { isAbortError } from '@/utils/typeGuardUtil'
@@ -33,7 +33,6 @@ const customerApiClient = axios.create({
export const useCustomerEventsService = () => {
const isLoading = ref(false)
const error = ref(null)
- const { d } = useI18n()
watch(
() => getComfyApiBaseUrl(),
diff --git a/src/views/LinearView.vue b/src/views/LinearView.vue
index 69deabeca..105a4a886 100644
--- a/src/views/LinearView.vue
+++ b/src/views/LinearView.vue
@@ -8,12 +8,12 @@ import {
import Splitter from 'primevue/splitter'
import SplitterPanel from 'primevue/splitterpanel'
import { ref, useTemplateRef } from 'vue'
+import { useI18n } from 'vue-i18n'
import ModeToggle from '@/components/sidebar/ModeToggle.vue'
import TopbarBadges from '@/components/topbar/TopbarBadges.vue'
import WorkflowTabs from '@/components/topbar/WorkflowTabs.vue'
import TypeformPopoverButton from '@/components/ui/TypeformPopoverButton.vue'
-import { t } from '@/i18n'
import type { AssetItem } from '@/platform/assets/schemas/assetSchema'
import { useSettingStore } from '@/platform/settings/settingStore'
import LinearControls from '@/renderer/extensions/linearMode/LinearControls.vue'
@@ -23,6 +23,7 @@ import OutputHistory from '@/renderer/extensions/linearMode/OutputHistory.vue'
import { useNodeOutputStore } from '@/stores/imagePreviewStore'
import type { ResultItemImpl } from '@/stores/queueStore'
+const { t } = useI18n()
const nodeOutputStore = useNodeOutputStore()
const settingStore = useSettingStore()
diff --git a/src/workbench/extensions/manager/stores/comfyManagerStore.ts b/src/workbench/extensions/manager/stores/comfyManagerStore.ts
index 22d017019..c6ae8a8e3 100644
--- a/src/workbench/extensions/manager/stores/comfyManagerStore.ts
+++ b/src/workbench/extensions/manager/stores/comfyManagerStore.ts
@@ -2,8 +2,8 @@ import { useEventListener, whenever } from '@vueuse/core'
import { defineStore } from 'pinia'
import { v4 as uuidv4 } from 'uuid'
import { ref, watch } from 'vue'
-import { useI18n } from 'vue-i18n'
+import { t } from '@/i18n'
import { useCachedRequest } from '@/composables/useCachedRequest'
import { useServerLogs } from '@/composables/useServerLogs'
import { api } from '@/scripts/api'
@@ -30,7 +30,6 @@ type UpdateAllPacksParams = components['schemas']['UpdateAllPacksParams']
* Store for state of installed node packs
*/
export const useComfyManagerStore = defineStore('comfyManager', () => {
- const { t } = useI18n()
const managerService = useComfyManagerService()
const installedPacks = ref({})